页表页面

这是一个普通的展示数据,上拉加载更多数据的列表。

其中有一个类型为List<T>的数据列表listData,有个page数据用于分页,isLoading用来判断是否正在加载数据,scrollController用于列表控制器

如果存在大量这种页面则可以用mixin来处理,不免大量重复的代码

import 'package:flutter/material.dart';
import 'package:flutter_app/app/model/ListViewJson.dart';
import 'package:flutter_app/app/shared/api/api.dart';
import 'package:dio/dio.dart';
import 'dart:convert'; import 'package:flutter_app/app/shared/mixins/list_more_data_mixin.dart'; /// 列表页面
class RecommendView extends StatefulWidget {
@override
_RecommendViewState createState() => _RecommendViewState();
} class _RecommendViewState
extends ListMoreDataBase<ListViewJsonData, RecommendView>
with ListMoreDataMixin<ListViewJsonData, RecommendView> {
@override
Future<List<ListViewJsonData>> getData() async {
String data = await DioUtils.postHttp(
"api/getOneLevel",
parameters: FormData.fromMap({
'page': page,
'limit': '10',
}),
);
ListViewJson _json = ListViewJson.fromJson(json.decode(data));
return _json.data;
} @override
void initState() {
print('init widget');
super.initState();
} @override
void dispose() {
print('dispose widget');
super.dispose();
} @override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(title: Text('返回')),
body: Stack(
children: <Widget>[
NotificationListener<ScrollNotification>(
onNotification: onNotification,
child: ListView.builder(
controller: scrollController,
itemCount: listData.length,
itemBuilder: (BuildContext context, int index) =>
TeamListItem(listData[index]),
),
),
isLoading ? Center(child: CircularProgressIndicator()) : Container()
],
),
);
}
}

mixin

import 'package:flutter/material.dart';

abstract class ListMoreDataBase<T, K extends StatefulWidget> extends State<K> {
/// 获取异步数据
Future<List<T>> getData();
} /// 在
mixin ListMoreDataMixin<T, K extends StatefulWidget> on ListMoreDataBase<T, K> {
@override
void initState() {
print('init');
super.initState();
initData();
} @override
void dispose() {
print('dispose');
super.dispose();
scrollController?.dispose();
} /// 数据列表
List<T> listData = []; /// 分页
int page = 1; /// 是否在加载数据
bool isLoading = false; /// 滚动条控制器
ScrollController scrollController = ScrollController(); /// 初始化数据
Future<void> initData() async {
setState(() {
isLoading = true;
}); List<T> data = await getData();
if (!mounted) return;
setState(() {
listData = data;
isLoading = false;
});
} /// 上拉加载更多
Future<void> loadMore() async {
setState(() {
isLoading = true;
page += 1;
}); List<T> data = await getData(); if (data.isEmpty) {
page--;
} setState(() {
listData.addAll(data);
isLoading = false;
});
} bool canLoadMore(ScrollNotification scroll) {
return !isLoading &&
scroll.metrics.maxScrollExtent <= scrollController.offset;
} bool onNotification(ScrollNotification scroll) {
if (canLoadMore(scroll)) {
loadMore();
}
return true;
}
}

注:

  • dart是单继承
  • 在类中,能重写mixin的属性和方法,并且也能用super调用miixn属性和方法
  • 上面的生命周期依次打印 init widget -> init -> dispose widget -> dispose

最新文章

  1. 如何去掉Eclipse里面自动追加的一些注释!!!内详
  2. Python的高级特性4:函数式编程
  3. xargs命令
  4. atitit.提升稳定性---hibernate 增加重试retry 机制解决数据库连接关闭
  5. HDU 2594 Simpsons’ Hidden Talents(辛普森一家的潜在天赋)
  6. python 核心编程第5章(习题)
  7. Linux命令之hwclock
  8. Unity3d Shader开发(一)Properties
  9. (转)从内存管 理、内存泄漏、内存回收探讨C++内存管理
  10. MyEclipse通过JDBC连接MySQL数据库基本介绍
  11. Oracle EBS Web ADI 中的术语
  12. linux常用系统配置命令汇总
  13. MySQL行转列、列转行
  14. python 笔记 week1-- if while for
  15. python之tkinter使用-消息弹框
  16. &lt;header&gt;&lt;footer&gt;引用
  17. s3c2440代码重定位和段的引入——学以致用,综合Makefile的锻炼
  18. spring mvc之请求过程源码分析
  19. Unity3D学习笔记(二十):Rect、Canvas、Toggle、Slider、ScrollBar
  20. IIS ashx

热门文章

  1. tricks - 思维
  2. Quartz:定时任务工具类
  3. Centos7 安装RabbitMQ 3.6.1
  4. Cisco的互联网络操作系统IOS和安全设备管理器SDM__路由器软、硬件知识
  5. 小白搭建WNMP详细教程---PHP安装与设置
  6. acid解释
  7. HDU6061 RXD and functions【NTT】
  8. c语言实现--双向循环链表操作
  9. C++11 Java基本数据类型以及转换
  10. P站风格的DevTools主题