delphi listview 添加数据 慢_Flutter下拉刷新,上拉加载更多数据

Flutter下拉刷新,上拉加载更多数据

下拉刷新

很简单,直接使用 RefreshIndicator 组件, onRefresh 为重新获取数据的方法

 Widget build(BuildContext context) { return Scaffold( body: Container( padding: EdgeInsets.all(2.0), child: RefreshIndicator( onRefresh: _refresh, backgroundColor: Colors.blue, child: ListView.builder( itemCount: _dataList.length, itemBuilder: (context, index) { return ListItem(_dataList[index]); }, ), ), ), ); }  Future _refresh() async { _dataList.clear(); await _loadFirstListData(); return; }复制代码

上拉加载更多

我们先看一下效果

556de868bb889844518fb7b2cde1d978.gif
  • 让我们先从最原始的十条的数据开始
class MyHomePage extends StatefulWidget { @override _MyHomePageState createState() => _MyHomePageState();}class _MyHomePageState extends State { List items = List.generate(10, (i) => i); @override void initState() { super.initState(); } @override void dispose() { super.dispose(); } @override Widget build(BuildContext context) { return new Scaffold( appBar: AppBar( title: Text("Infinite ListView"), ), body: ListView.builder( itemCount: items.length, itemBuilder: (context, index) { return ListTile(title: new Text("Number $index")); }, ), ); }}复制代码

  • 现在我们要编写一个加载更多数据的方法,用来模拟 http 请求
Future> fakeRequest(int from, int to) async { return Future.delayed(Duration(seconds: 2), () { return List.generate(to - from, (i) => i + from); });}复制代码

  • 现在我们想要让用户将 ListView 滑动到最末端的触发 fakeRequest 来加载更多数据,最简单的实现方式就是使用 ScrollController 来完成,ScrollController 会监听滚动事件,当 ListView 滚动到末端的时候他会发出一个请求。在这里还有一件需要注意的事就是为了避免对服务器不断地请求,我们需要做一个标记 isPerformingRequest 只有当它为 false 的时候才允许对后台进行请求。
class _MyHomePageState extends State { List items = List.generate(10, (i) => i); ScrollController _scrollController = new ScrollController(); bool isPerformingRequest = false; @override void initState() { super.initState(); _scrollController.addListener(() { if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent) { _getMoreData(); } }); } @override void dispose() { _scrollController.dispose(); super.dispose(); } _getMoreData() async { if (!isPerformingRequest) { setState(() => isPerformingRequest = true); List newEntries = await fakeRequest(items.length, items.length + 10); setState(() { items.addAll(newEntries); isPerformingRequest = false; }); } } @override Widget build(BuildContext context) { return new Scaffold( appBar: AppBar( title: Text("Infinite ListView"), ), body: ListView.builder( itemCount: items.length, itemBuilder: (context, index) { return ListTile(title: new Text("Number $index")); }, controller: _scrollController, ), ); }}复制代码

如果你现在运行程序你将会看到我们的列表已经可以实现动态加载了,但是这距离我们的目标还很远,我们需要添加一些标志动作让用户这道请求已经开始。


  • 接下来我们要用到 CircularProgressIndicator 去完成这个加载标志
Widget _buildProgressIndicator() { return new Padding( padding: const EdgeInsets.all(8.0), child: new Center( child: new Opacity( opacity: isPerformingRequest ? 1.0 : 0.0, child: new CircularProgressIndicator(), ), ), );}复制代码
  • 现在我们将这个加载标志放到我们的 ListView 中去,注意这里要给 itemCount 加出一块空间来放置我们的 _buildProgressIndicator
@overrideWidget build(BuildContext context) { return new Scaffold( appBar: AppBar( title: Text("Infinite ListView"), ), body: ListView.builder( itemCount: items.length + 1, itemBuilder: (context, index) { if (index == items.length) { return _buildProgressIndicator(); } else { return ListTile(title: new Text("Number $index")); } }, controller: _scrollController, ), );}复制代码
  • 到这里加载更多数据的功能基本完成了,为了更加美观我们还要处理当没有请求到更多数据的时候动作,在这里我们添加一个动画没有更多数据的时候 ListView 向下移动覆盖正在加载更多数据的标志
_getMoreData() async { if (!isPerformingRequest) { setState(() => isPerformingRequest = true); List newEntries = await fakeRequest(items.length, items.length); //returns empty list if (newEntries.isEmpty) { double edge = 50.0; double offsetFromBottom = _scrollController.position.maxScrollExtent - _scrollController.position.pixels; if (offsetFromBottom < edge) { _scrollController.animateTo( _scrollController.offset - (edge -offsetFromBottom), duration: new Duration(milliseconds: 500), curve: Curves.easeOut); } } setState(() { items.addAll(newEntries); isPerformingRequest = false; }); }}复制代码
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值