前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Flutter中实现下拉刷新与上拉加载更多

Flutter中实现下拉刷新与上拉加载更多

作者头像
越陌度阡
发布于 2021-01-13 02:42:08
发布于 2021-01-13 02:42:08
3.6K00
代码可运行
举报
运行总次数:0
代码可运行

1. 下拉刷新

Flutter中提供了组件 RefreshIndicator用于下拉刷新。

其基本的实现方法是在该组件添加onRefresh事件,当用户下拉刷新时会触发该事件,在该事件中可以用调用一个延时任务Future.delayed( ),在延时任务的回调中重新请求数据即可。

2. 上拉加载更多

Flutter中主要通过使用 ListView.builder( ) 添加控制器来实现上拉加载更多。

其基本的实现方法是在该组件里添加控制器,在组件初始化时实例化ScrollController类型控制器,然后在初始化的initState( )中,给控制器添加addListener( )监听事件,在事件的回调函数中可以获得滚动的下拉距离及整个页面的高度,然后判断这两个值的相差距离值,其值快接近时触发数据请求。

3. 代码实例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:dio/dio.dart';


class NewsPage extends StatefulWidget {
    NewsPage({Key key}) : super(key: key);
    @override
    _NewsPageState createState() => _NewsPageState();
}

class _NewsPageState extends State<NewsPage> {
    // 当前页数
    int  _page = 1;
    // 页面数据
    List _list = [];
    // 是否还有
    bool _hasMore = true;
    // 滚动控制器
    ScrollController _scrollController = new ScrollController();
    @override
    void initState() {
        super.initState();
        this._getData();
        // 监听滚动事件
        _scrollController.addListener((){
            // 获取滚动条下拉的距离
            // print(_scrollController.position.pixels);
            // 获取整个页面的高度
            // print(_scrollController.position.maxScrollExtent);
            if(_scrollController.position.pixels>_scrollController.position.maxScrollExtent-40){
                this._getData();
            }
        });
    }

    // 获取数据列表
    void _getData() async{
        if(this._hasMore){

            var url = "http://www.phonegap100.com/appapi.php?a=getPortalList&catid=20&page=${_page}";
            Response result = await Dio().get(url);
            var list = json.decode(result.data)["result"];

            setState(() {
                // 拼接数据
                this._list.addAll(list); 
                // 页数累加
                this._page++;
            });

            if(list.length<20){
                setState(() {
                    // 关闭加载
                   this._hasMore = false;
                });
            }
        }
    }

    // 下拉刷新
    Future<void> _onRefresh() async{
        print("下拉刷新");
        // 持续两秒
        await Future.delayed(Duration(milliseconds:2000),(){
           this._getData();
        });
    }
      

    // 加载动画
    Widget _getMoreWidget() {

        // 如果还有数据
        if(this._hasMore){
            return Center(
                child: Padding(
                    padding: EdgeInsets.all(10.0),
                    child: Row(
                        mainAxisAlignment: MainAxisAlignment.center,
                        crossAxisAlignment: CrossAxisAlignment.center,
                        children: <Widget>[
                        Text(
                            '加载中',
                            style: TextStyle(fontSize: 16.0),
                        ),
                        // 加载图标
                        CircularProgressIndicator(
                            strokeWidth: 1.0,
                        )
                        ],
                    ),
                ),
            );
        }else{
            return Center(
                child: Text("...我是有底线的..."),
            );
        }
    }

    @override
    Widget build(BuildContext context) {
        return Container(
            child:Scaffold(
                appBar: AppBar(
                    title:Text("新闻列表")
                ),
                body:this._list.length==0?this._getMoreWidget():RefreshIndicator(
                    child: ListView.builder(
                        // 上拉加载控制器
                        controller: _scrollController,
                        itemCount: this._list.length,
                        itemBuilder: (context,index){

                            Widget tip = Text("");
                            // 当渲染到最后一条数据时,加载动画提示
                            if(index == this._list.length-1){
                                tip = _getMoreWidget();
                            } 
                            return Column(
                                children: <Widget>[
                                    ListTile(
                                        title:Text(
                                            "${this._list[index]["title"]}",
                                            maxLines:1,
                                        )
                                    ),
                                    Divider(),
                                    // 加载提示
                                    tip
                                ],
                            );
                        },   
                    ), 
                    // 下拉刷新事件
                    onRefresh:this._onRefresh
                )
            )
        );
    }
}

以下是下拉刷新的实现效果:

以下是上拉加载的实现效果:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/01/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Flutter中使用flutter_html解析html文件
参考:https://pub.flutter-io.cn/packages/flutter_html
越陌度阡
2021/01/13
6.4K0
【Flutter】ListView 列表高级功能 ( ScrollController 上拉加载更多 )
在 FLutter 中 , 所有的列表都支持设置一个 ScrollController 类型的参数 ,
韩曙亮
2023/03/29
2.2K0
【Flutter】ListView 列表高级功能 ( ScrollController 上拉加载更多 )
Flutter-ListView组件下拉刷新+滚动底部加载+缓存封装
Flutter的ListView组件,虽然很好用,但是数据量大的时候,在低配置的机器上会奇卡无比,所以我封装了一个ListView组件,对数据进行截断,并使用 keframe 插件进行流畅性优化,提升低配置设备的用户体验。
老猫-Leo
2023/12/11
8600
【Flutter 专题】21 图解 ListView 下拉刷新与上滑加载(三)
和尚前段时间整理了两种 ListView 的异步加载数据时,下拉刷新与上滑加载更多的方式,每种方式都有自己的优势,网上也有很多大神讲解过 ListView 数据流的种种处理方式,和尚根据实际遇到的情况整理一下尝试的第三种方案。
阿策小和尚
2019/08/12
1.4K0
【Flutter 专题】21 图解 ListView 下拉刷新与上滑加载(三)
Flutter ListView 下拉刷新,上拉加载更多
正常项目中使用ListView一定会涉及到分页加载的问题,此时无法避免地需要用到下拉刷新和上拉加载更多的功能。
毛大姑娘
2020/09/10
3.9K0
Flutter ListView 下拉刷新,上拉加载更多
Flutter 库:强大的下拉刷新上拉加载框架——EasyRefresh
EasyRefresh 是一个用于 Flutter 应用程序的简单易用的下拉刷新和上拉加载框架。它支持几乎所有的 Flutter 可滚动小部件。它的功能与Android 的 SmartRefreshLayout 非常相似,并吸收了许多第三方库的优点。EasyRefresh 集成了各种样式的页眉和页脚,但没有任何限制,您可以轻松自定义它们。利用Flutter强大的动画功能,即使只是一个简单的控件也可以实现复杂的效果。EasyRefresh的目标是为Flutter创建一个功能强大、稳定和成熟的下拉刷新框架。
訾博ZiBo
2025/01/06
7740
Flutter 库:强大的下拉刷新上拉加载框架——EasyRefresh
Flutter-常用组件(持续更新)Flutter-常用组件(持续更新)题纲:注:
相当于iOS开发中的给定尺寸的UIView。根据文档中的解释该控件会限制子控件的大小如果子控件允许的话。尤其是控件本身不好控制大小,则可以使用该控件来控制大小,列如:CircleAvatar。
用户8893176
2021/08/09
7840
Flutter ScrollView上拉加载更多关于学习
2018.05.07 更新 上拉加载可以不用Notification,直接用ScrollController,代码如下:
吴老师
2018/09/05
2K0
ListView下拉刷新与加载更多
在前面的文章中我们看了进度组件ProgressIndicator的用法,怎么样大家Get了吗? 那么我们今天就来看下ProgressIndicator的应用,一起来看下Flutter中的下拉刷新与加载更多是如何实现的。
flyou
2019/08/06
2.7K0
ListView下拉刷新与加载更多
用flutter_staggered_grid_view实现分页瀑布流效果【flutter20个实例之四】
GridView是一个可滚动的,2D数组控件可以用这个组件实现滚动效果,但是它渲染的高度是一样的。
sinnoo
2020/11/13
4.2K0
用flutter_staggered_grid_view实现分页瀑布流效果【flutter20个实例之四】
Flutter 中的下拉刷新和上拉加载
在Flutter的官方SDK中给我们提供了下拉刷新的组件RefreshIndicator,但是没有提供上拉分页加载更多的组件。不过不用担心,在Flutter的ListView组件中,有一个ScrollController属性,它就是专门用来控制ListView滑动事件,在这里我们可以根据ListView的位置来判断是否滑动到了底部来做加载更多的处理。
拉维
2019/09/05
4.3K0
Flutter中ScrollView及其子类(ListView等)的下拉刷新
先丢一个github的demo代码地址 移动开发发展到现在,下拉刷新是个必不可少的功能了。
吴老师
2018/09/05
2.7K0
Flutter完整开发实战详解(二、 快速开发实战篇)
 作为系列文章的第二篇,继《Flutter完整开发实战详解(一、Dart语言和Flutter基础)》之后,本篇将为你着重展示:如何搭建一个通用的Flutter App 常用功能脚手架,快速开发一个完整的 Flutter 应用。
GSYTech
2018/08/11
5.3K0
Flutter完整开发实战详解(二、 快速开发实战篇)
[- Flutter 基础篇 -] ListView的使用
1.ListView 的基本使用 ListView 是一个盛放多个孩子的容器。我们从下面的例子开始介入: 1.1:三个构造 使用ListView构造方法 和Flex,Wrap类似,将子元素一个
张风捷特烈
2020/04/30
1.2K0
[- Flutter 基础篇 -] ListView的使用
Android——RecyclerView自定义OnScrollListener实现下拉刷新监听,上拉加载更多功能
针对RecyclerView有很多开源的框架可以直接拿来用,比较有代表性的是BaseRecyclerViewAdapterHelper,功能很强大,具备上拉监听的功能。使用开源的东西固然省时省力,但是前期自定义的Adapter使用较多,不想再更改了,且总使用开源的东西慢慢人都变傻了,这个功能不算复杂,就自己查找相关资料参照实现了。
Winter_world
2020/09/25
3.9K0
Vue中下拉刷新和上拉加载更多
前言 下拉刷新 ZDropDownRefresh.vue <template lang="html"> <div class="refresh-moudle" @touchstart="touchStart($event)" @touchmove="touchMove($event)" @touchend="touchEnd($event)" ref="myrefresh" :style="{ transform: 'translate3d(0,' + t
码客说
2021/08/31
1.2K0
自定义RecyclerView下拉刷新上拉加载更多
自定义ListView下拉刷新上拉加载更多 自定义RecyclerView下拉刷新上拉加载更多
cMusketeer
2022/10/27
1.1K0
OpenHarmony环境下可用的下拉刷新、上拉加载组件【PullToRefresh】
其中List组件需要设置edgeEffect属性为(EdgeEffect.None)
小帅聊鸿蒙
2024/09/18
2350
OpenHarmony环境下可用的下拉刷新、上拉加载组件【PullToRefresh】
推荐阅读
相关推荐
Flutter中使用flutter_html解析html文件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验