Flutter 实现下拉刷新和上拉加载

article/2025/10/26 17:58:49

参考
Flutter下拉刷新和上拉加载更多
下拉刷新
上拉加载更多
下拉刷新直接用flutter自带的控件RefreshIndicator组件即可,上拉加载可以通过ListView 中的ScrollController 属性,根据 ListView 的位置来判断是否滑动到了底部来做加载更多的处理
下面用们用到的json数据接口为:https://jsonplaceholder.typicode.com/posts/1/comments

下拉刷新
就是在我们上一节讲到的解析的列表外面嵌套一个RefreshIndicator,然后通过onRefresh进行监听

  @overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("请求数据 Dio Demo"),),body: this._list.length > 0? RefreshIndicator(onRefresh: _onRefresh,child: ListView.builder(itemCount: this._list.length,itemBuilder: (context, index) {return ListTile(title: Text(_list[index]["email"], maxLines: 1),));})): Text("加载中..."));}Future<void> _onRefresh() async {print('执行刷新');_getData();await Future.delayed(Duration(seconds: 3), () {print('refresh');});}_getData() async {var apiUrl = "https://jsonplaceholder.typicode.com/posts/${_page}/comments";Response result = await Dio().get(apiUrl);setState(() {_list.addAll(result.data);_page++;});print("获取数据操作");}

上拉加载更多
通过ListView 中的ScrollController 属性,根据 ListView 的位置来判断是否滑动到了底部来做加载更多的处理
_scrollController.position.pixels 滚动的距离
_scrollController.position.maxScrollExtent 总距离
自定义下部加载的控件

 Widget _getMoreWidget() {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,)],),),);}
 ScrollController _scrollController = ScrollController(); //listview 的控制器List _list = [];int _page = 1;bool isLoading = false;@overridevoid initState() {super.initState();_getData();//监听划到最底部就进行if内的操作_scrollController.addListener(() {if (_scrollController.position.pixels >_scrollController.position.maxScrollExtent - 20) {print('滑动到了最底部');_getData();}});}
ListView.builder(itemCount: _list.length,controller: _scrollController,itemBuilder: (context, index) {if (index == _list.length - 1) {return Column(children: <Widget>[ListTile(title: Text(_list[index]["email"], maxLines: 1),),Divider(),//如果条目达到最底部,则还要展示一个加载圈_getMoreWidget()],);} else {//没有到达底部直接加载条目return Column(children: <Widget>[ListTile(title: Text(_list[index]["email"], maxLines: 1),),Divider()],);}}))

代码:

// ignore_for_file: prefer_const_constructors, prefer_const_literals_to_create_immutables, avoid_print, prefer_is_empty, slash_for_doc_comments, unnecessary_brace_in_string_interps, prefer_const_constructors_in_immutables, prefer_final_fieldsimport 'package:flutter/material.dart';
import 'package:dio/dio.dart';class LoadMorePage extends StatefulWidget {LoadMorePage({Key? key}) : super(key: key);@override_LoadMorePageState createState() => _LoadMorePageState();
}class _LoadMorePageState extends State<LoadMorePage> {ScrollController _scrollController = ScrollController(); //listview 的控制器List _list = [];int _page = 1;bool isLoading = false;var json; //是否正在加载数据@overridevoid initState() {super.initState();//之所以写三遍是因为我发现接口中每一页数据较少,第一次加载一页达不到底部,监听不到滑动_getData();_getData();_getData();print("到达了最底部。。。");//下面这个方法每次都底部都会执行,上面的代码只会执行一次_scrollController.addListener(() {if (_scrollController.position.pixels >_scrollController.position.maxScrollExtent - 20) {print('滑动到了最底部');_getData();}});}_getData() async {var apiUrl ="https://jsonplaceholder.typicode.com/posts/${_page}/comments";Response result = await Dio().get(apiUrl);
// print(json.decode(result.data)["result"]);setState(() {_list.addAll(result.data);_page++;});}/**
* 加载更多时显示的组件,给用户提示
*/Widget _getMoreWidget() {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,)],),),);}Future<void> _onRefresh() async {print('执行刷新');
// this._getData();await Future.delayed(Duration(seconds: 3), () {print('refresh');});}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("请求数据"),),body: _list.length > 0? RefreshIndicator(onRefresh: _onRefresh,child: ListView.builder(itemCount: _list.length,controller: _scrollController,itemBuilder: (context, index) {if (index == _list.length - 1) {return Column(children: <Widget>[ListTile(title:Text(_list[index]["email"], maxLines: 1),),Divider(),//如果条目达到最底部,则还要展示一个加载圈_getMoreWidget()],);} else {//没有到达底部直接加载条目return Column(children: <Widget>[ListTile(title:Text(_list[index]["email"], maxLines: 1),),Divider()],);}})): _getMoreWidget());}
}

在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/7IsNgG7I.shtml

相关文章

iOS 下拉刷新

移动应用开发中有这么一种场景&#xff0c;就是在列表中显示的数据刷新&#xff0c;有点击刷新按钮刷新的&#xff0c;也有现在最流行的由Twitter首先推出的下拉刷新功能&#xff0c;在IOS中&#xff0c;使用下拉刷新更新UITableView中的数据也用的非常多&#xff0c;最典型的就…

uniapp几种实现下拉刷新的方式

一.自带刷新 1.在pages.json 上进行定义 2.在页面上监听下拉动作进行需要的操作 ps&#xff1a;一定要手动停止刷新&#xff0c;否则会一直刷新 自带刷新的优点&#xff1a;相对稳定&#xff0c;写法相对简单 自带刷新的缺点&#xff1a;样式上固定的 所以不能满足全部人的需…

小程序下拉刷新的实现

小程序下拉刷新 1.使用onPullDownRefresh()这个方法来实现下拉刷新 例子如下&#xff1a; // 下拉刷新onPullDownRefresh: function () {wx.showNavigationBarLoading() //在标题栏中显示加载图标setTimeout(() > {wx.hideNavigationBarLoading(); //完成停止加载wx.stopP…

Android 下拉刷新实践

1. 手动实现一个下拉刷新功能。 2. 效果图&#xff1a; 3. view结构 4.实现思路 <com.luocc.tim.recycler.RefreshLayoutandroid:layout_width"match_parent"android:layout_height"wrap_content"android:orientation"vertical"><Tex…

【uniapp】页面下拉刷新

目录 一、全局 二、局部 1、一个页面一个下拉刷新 2、一个页面多个下拉刷新&#xff08;切换时滚动条回到顶部&#xff09; 3、一个页面多个下拉刷新&#xff08;切换时恢复滚动条位置&#xff09; 一、全局 修改pages.json的"enablePullDownRefresh": true, …

uniapp 下拉刷新

uniapp 下拉刷新&#xff08;全局&单页面&#xff09; 全局设置 在pages.json文件的globalStyle对象中开启enablePullDownRefresh属性 单页面 在pages.json文件中的pages数组中找到对应的页面&#xff0c;在对应页面的style属性中开启enablePullDownRefresh属性 下拉刷…

Android 下拉刷新框架实现

前段时间项目中用到了下拉刷新功能&#xff0c;之前在网上也找到过类似的demo&#xff0c;但这些demo的质量参差不齐&#xff0c;用户体验也不好&#xff0c;接口设计也不行。最张没办法&#xff0c;终于忍不了了&#xff0c;自己就写了一个下拉刷新的框架&#xff0c;这个框架…

Android中实现下拉刷新

需求&#xff1a;项目中的消息列表界面要求实现类似sina微博的下拉刷新&#xff1b; 思路&#xff1a;一般的消息列表为ListView类型&#xff0c;将list加载到adapter中&#xff0c;再将adapter加载到ListView中&#xff0c;从而实现消息列表的展示。而下拉刷新要求给消息列表…

微信小程序下拉刷新

一、如何设置微信小程序所有页面都可以下拉刷新呢&#xff1f; 1、在app.json的"window"中进行配置 &#xff08;1&#xff09;把"backgroundTextStyle":“light"改为"backgroundTextStyle”:“dark” &#xff08;2&#xff09;添加"enab…

下拉刷新上拉加载

目录 原理实现效果 原理 想必使用过微信开发工具的应该都接触过上拉加载下拉刷新配置。 原理呢就是通过根据当前刚开始触碰的屏幕垂直y轴距离和滑动时所触碰垂直y轴距离&#xff0c;从而来判断是上拉&#xff0c;下拉。 实现 使用的vue2 封装的组件&#xff0c;js大致思路是…

Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能

转载请注明出处&#xff1a;http://blog.csdn.net/guolin_blog/article/details/9255575 最近项目中需要用到ListView下拉刷新的功能&#xff0c;一开始想图省事&#xff0c;在网上直接找一个现成的&#xff0c;可是尝试了网上多个版本的下拉刷新之后发现效果都不怎么理想。有些…

【Demo】教你实现下拉刷新

前言 第三方库很常见&#xff0c;我们开发需求的时候经常会用到下拉刷新组件&#xff0c;如果要我们自己实现下拉刷新该如何实现尼&#xff1f; 效果 实现原理 1、监听 touchstart事件记录初始startY 2、监听 touchmove事件 e.touches[0].pageY - startY得到 deltaY&#xf…

如何实现上拉加载,下拉刷新

答&#xff1a;下拉刷新和上拉加载这两种交互⽅式通常出现在移动端中 本质上等同于PC⽹⻚中的分⻚&#xff0c;只是交互形式不同 开源社区也有很多优秀的解决⽅案&#xff0c;如 iscroll 、 better-scroll 、 pulltorefresh.js 库等等 这些第三⽅库使⽤起来⾮常便捷 我们通…

jira使用教程管理项目

添加工作流 1.点击项目设置 2.点击工作流&#xff0c;然后点击切换方案 3.进入切换方案界面之后&#xff0c;点击工作流&#xff0c;然后点击添加工作流 4.输入工作流名称&#xff0c;点击添加 5.编辑工作流 可以导出工作流供别人使用 编辑之前添加的工作流 提交bug

今日记录:JIRA使用指南

JIRA流程与使用指南 学习总结&#xff1a; 什么是JIRA&#xff1f;为什么要用任务管理工具&#xff1f;JIRA基础流程 ① 什么是JIRA&#xff1f; JIRA是一个项目与事务管理工具&#xff0c;被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪和敏捷管理等工作领…

JIRA-使用教程_概念

博客概要 JIRA是一个非常强大的项目与事务跟踪工具&#xff0c;博主在具体工作使用中对它爱不释手 &#xff0c;发现它功能全面、配置灵活、扩展丰富…反正优点一大堆&#xff01;好东西嘛就要拿出来&#xff0c;大家一起分享~本博文先简单介绍JIRA相关的基本信息。 文章目录 博…

Confluence+Jira使用

Jira过滤器的使用方式&#xff1a; project MCU AND issuetype 测试用例 AND component GPIO ORDER BY summary ASC实例&#xff1a;

jira使用教程 一(从官方文档理解)

JIRA官方说明 JIRA使用教程 blog QA: jira 如何关联到Gerrit Reviews JIRA Concepts - Issues Aim JIRA tracks issues, which can be bugs, feature requests, or any other tasks you want to track. JIRA可以跟踪问题&#xff0c;可以是bug、特性请求或任何其他你想跟踪…

JIRA-使用教程_问题单-新建

博客概要 简单分享新增并查看一个问题单的步骤~ 文章目录 博客概要《JIRA-使用教程》_总目录问题单-新建1.进入项目2.新建唤起3.填写新建弹窗4.查看问题 总结 《JIRA-使用教程》_总目录 文章超链接&#xff1a;https://blog.csdn.net/qq_41386332/article/details/108865809 …

项目管理工具——Jira使用和配置

摘要 链接&#xff1a;https://pan.baidu.com/s/1_PgOuOWsS1lnHIIyI0y4pA 提取码&#xff1a;v0dy 本博文将介绍在软件开发中的常用的软件管理工具。Jira是Atlassian公司出品的一款事务管理软件&#xff08;缺陷管理类的软件&#xff09;。无论是“需求”&#xff0c;还是“…