功能

 1、下拉加载

 2、上拉加载

3、显示加载图标

4、更新列表数据,隐藏加载图标

flutter库

  1. flutter_spinkit: ^3.1.0 加载图标

其他:加载列表需要列表,基于上一节的flutter 列表展示

细节

 1、列表构造器

  a、绑定列表controller   // ScrollController scrollController = ScrollController();

  b、更新LIST data

 2、controller监听是否滑动到底部

  1. @override
  2. void initState() {
  3. super.initState();
  4. scrollController.addListener(() {
  5. if (scrollController.position.pixels ==
  6. scrollController.position.maxScrollExtent) {
  7. print('滑动到了最底部${scrollController.position.pixels}');
  8. setState(() {
  9. showMore = true;
  10. });
  11. getMoreData(); // 增加点数据
  12. }
  13. });
  14. getListData(); // 暂时未使用
  15. }
  16.  
  17. @override
  18. void dispose() {
  19. super.dispose();
  20. //手动停止滑动监听
  21. scrollController.dispose();
  22. }

3、 RefreshIndicator   刷新组件

  

  1. new RefreshIndicator(
  2. child: isLoading == false // 判断是否正在加载中
  3. ? new ListView.builder(
  4. controller: scrollController,
  5. itemCount: storyData.length, //列表长度+底部加载中提示
  6. itemBuilder: (BuildContext context, int index) {
  7. // 传入MessageData返回列表项
  8. return new StoryItem(storyData[index]);
  9. },
  10. )
  11. : new Stack(
  12. children: <Widget>[
  13. new Padding(
  14. padding:
  15. new EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 35.0),
  16. child: new Center(
  17. child: SpinKitFadingCircle(
  18. color: Colors.blueAccent,
  19. size: 30.0,
  20. ),
  21. ),
  22. ),
  23. new Padding(
  24. padding:
  25. new EdgeInsets.fromLTRB(0.0, 35.0, 0.0, 0.0),
  26. child: new Center(
  27. child: new Text('正在加载中,莫着急哦~'),
  28. ),
  29. ),
  30. ],
  31. ),
  32. onRefresh: _onRefresh) // 刷新

4、部分异步函数 

  1. Future<void> _onRefresh() async {
  2. if (isLoading) {
  3. return;
  4. }
  5. setState(() {
  6. isLoading = true;
  7. page = ;
  8. });
  9.  
  10. print('下拉刷新开始,page = $page');
  11.  
  12. await Future.delayed(Duration(seconds: ), () {
  13. setState(() {
  14. isLoading = false;
  15. final arr = new StoryData(
  16. ,
  17. 'images/story/03/cover.jpg',
  18. 'episode.26',
  19. '放课後',
  20. '终於可以和自己憧憬的同学自然的说早安。正当爽子正在为这件事感动的时候,这学期代理班导的副班导荒井一市(通称:阿瓶)登场了,阿瓶正想要擅自决定谁来制作出席簿时,不想看到大家困扰的爽子就举起了手…。',
  21. []);
  22. storyData.add(arr);
  23. print('下拉刷新结束,page = $page');
  24. });
  25. });
  26. }
  1. Future<void> getMoreData() async {
    print('xx');
    if (isLoading) {
    return;
    }
    setState(() {
    isLoading = true;
    page = 0;
    });
    print('下拉刷新开始,page = $page');
  2.  
  3. await Future.delayed(Duration(seconds: 3), () {
    setState(() {
    isLoading = false;
    final arr = new StoryData(
    26,
    'images/story/03/cover.jpg',
    'episode.26',
    '放课後',
    '终於可以和自己憧憬的同学自然的说早安。正当爽子正在为这件事感动的时候,这学期代理班导的副班导荒井一市(通称:阿瓶)登场了,阿瓶正想要擅自决定谁来制作出席簿时,不想看到大家困扰的爽子就举起了手…。',
    []);
    storyData.add(arr);
    print('下拉刷新结束,page = $page');
    });
    });
    }
  1.  

-------------完整code-------------------

story.dart

  1. import 'package:flutter/material.dart';
  2.  
  3. import 'story_data.dart';
  4. import 'story_item.dart';
  5. import 'package:flutter_spinkit/flutter_spinkit.dart';
  6.  
  7. void main() => runApp(Story());
  8.  
  9. class Story extends StatefulWidget {
  10. @override
  11. _Story createState() => new _Story();
  12. }
  13.  
  14. class _Story extends State<Story> {
  15. bool isLoading = false; //是否正在请求新数据
  16. bool showMore = false; //是否显示底部加载中提示
  17. bool offState = false; //是否显示进入页面时的圆形进度条
  18. int page = ; //暂时用不到
  19. ScrollController scrollController = ScrollController();
  20. Future<void> getMoreData() async {if (isLoading) {
  21. return;
  22. }
  23. setState(() {
  24. isLoading = true;
  25. });
  26. print('下拉刷新开始,page = $page');
  27.  
  28. await Future.delayed(Duration(seconds: ), () {
  29. setState(() {
  30. isLoading = false;
  31. final arr = new StoryData(
  32. ,
  33. 'images/story/03/cover.jpg',
  34. 'episode.26',
  35. '放课後',
  36. '终於可以和自己憧憬的同学自然的说早安。正当爽子正在为这件事感动的时候,这学期代理班导的副班导荒井一市(通称:阿瓶)登场了,阿瓶正想要擅自决定谁来制作出席簿时,不想看到大家困扰的爽子就举起了手…。',
  37. []);
  38. storyData.add(arr);
  39.  
  40. });
  41. });
  42. }
  43.  
  44. void getListData() {}
  45.  
  46. @override
  47. void initState() {
  48. super.initState();
  49. scrollController.addListener(() {
  50. if (scrollController.position.pixels ==
  51. scrollController.position.maxScrollExtent) {
  52. print('滑动到了最底部${scrollController.position.pixels}');
  53. setState(() {
  54. showMore = true;
  55. });
  56. getMoreData(); // 增加点数据
  57. }
  58. });
  59. getListData(); // 暂时未使用
  60. }
  61.  
  62. @override
  63. void dispose() {
  64. super.dispose();
  65. //手动停止滑动监听
  66. scrollController.dispose();
  67. }
  68.  
  69. @override
  70. Widget build(BuildContext context) {
  71. // TODO: implement build
  72. return Scaffold(
  73. body: new RefreshIndicator(
  74. child: isLoading == false
  75. ? new ListView.builder(
  76. controller: scrollController,
  77. itemCount: storyData.length, //列表长度+底部加载中提示
  78. itemBuilder: (BuildContext context, int index) {
  79. // 传入MessageData返回列表项
  80. return new StoryItem(storyData[index]);
  81. },
  82. )
  83. : new Stack(
  84. children: <Widget>[
  85. new Padding(
  86. padding:
  87. new EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 35.0),
  88. child: new Center(
  89. child: SpinKitFadingCircle(
  90. color: Colors.blueAccent,
  91. size: 30.0,
  92. ),
  93. ),
  94. ),
  95. new Padding(
  96. padding:
  97. new EdgeInsets.fromLTRB(0.0, 35.0, 0.0, 0.0),
  98. child: new Center(
  99. child: new Text('正在加载中,莫着急哦~'),
  100. ),
  101. ),
  102. ],
  103. ),
  104. onRefresh: _onRefresh));
  105. }
  106.  
  107. Future<void> _onRefresh() async {
  108. if (isLoading) {
  109. return;
  110. }
  111. setState(() {
  112. isLoading = true;
  113. });
  114.  
  115. print('下拉刷新开始,page = $page');
  116.  
  117. await Future.delayed(Duration(seconds: ), () {
  118. setState(() {
  119. isLoading = false;
  120. final arr = new StoryData(
  121. ,
  122. 'images/story/03/cover.jpg',
  123. 'episode.26',
  124. '放课後',
  125. '终於可以和自己憧憬的同学自然的说早安。正当爽子正在为这件事感动的时候,这学期代理班导的副班导荒井一市(通称:阿瓶)登场了,阿瓶正想要擅自决定谁来制作出席簿时,不想看到大家困扰的爽子就举起了手…。',
  126. []);
  127. storyData.add(arr);
  128. print('下拉刷新结束);
  129. });
  130. });
  131. }
  132. }

部分截图:

加载完成之后,列表数据会增加相同的数据,这里没有涉及到接口。

源码地址:https://github.com/ft1107949255/kiminitodoke

flutter 下拉加载+下拉加载的更多相关文章

  1. Flutter上拉加载下拉刷新---flutter_easyrefresh

    前言 Flutter默认不支持上拉加载,下拉刷新也仅仅支持Material的一种样式.Android开发使用过SmartRefreshLayout的小伙伴都知道这是一个强大的刷新UI库,集成了很多出色 ...

  2. mui scroll和上拉加载/下拉刷新

    mui中 scroll和上拉加载/下拉刷新同时存在会出现两个滚动条 把/*   */ /* //mui页面鼠标拖动代码: mui('.mui-scroll-wrapper').scroll({ dec ...

  3. react + iscroll5 实现完美 下拉刷新,上拉加载

    经过几天的反复折腾,总算做出一个体验还不错的列表页了,主要支持了下拉刷新,上拉加载两个功能. 一开始直接采用了react-iscroll插件,它是基于iscroll插件开发的组件.但是开发过程中,发现 ...

  4. iOS MJRefresh下拉刷新(上拉加载)使用详解

    下拉刷新控件目前比较火的有好几种,本人用过MJRefresh 和 SVPullToRefresh,相对而言,前者比后者可定制化.拓展新都更高一点. 因此本文着重讲一下MJRefresh的简单用法. 导 ...

  5. SVPullToRefresh​ 下拉刷新,上拉加载

    https://github.com/Sephiroth87/ODRefreshControl 类似刷新控件,类似qq动画的那种刷新. 一.下载第三方库 https://github.com/samv ...

  6. 微信小程序开发之 下拉刷新,上拉加载更多

    本文记载了如何在微信小程序里面实现下拉刷新,上拉加载更多 先开看一下界面 大致如此的界面吧. 这个Demo使用了微信的几个Api和事件,我先列出来. 1.wx.request (获取远程服务器的数据, ...

  7. iOS开发 XML解析和下拉刷新,上拉加载更多

    iOS开发 XML解析和下拉刷新,上拉加载更多 1.XML格式 <?xml version="1.0" encoding="utf-8" ?> 表示 ...

  8. XListview的下拉刷新、上拉加载、用Pull解析XML

    做之前需要导入XListview的文件,此是用第三方的xListview实现的,东西没写全.此是在Fragment中实现的 //--------------XListView的布局---------- ...

  9. google官方的下拉刷新+自定义上拉加载更多

    转载请标注转载:http://blog.csdn.net/oqihaogongyuan/article/details/50949118 google官方的下拉刷新+自定义上拉加载更多 现在很多app ...

随机推荐

  1. FastJson中JSONString与各个对象的的转换关系及API示例

    前言 JSON作为一种轻量级的数据交换格式,在我们日常的开发中使用十分广泛,就Java后端的开发工作中,JSON字符串与Java对象之间相互转换是常常遇到的操作. 虽然平时用到的挺多的,但是因为用于J ...

  2. Cesium专栏-雷达遮罩动态扫描(附源码下载)

    Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精度,渲染质量以 ...

  3. 3.Redux学习3----redux-saga

    redux-saga和redux-thunk功能差不多,都是为了避免直接在组件生命周期函数中做异步操作,便于自动化测试,便于拆分管理. 首先要下包 npm i redux-saga 第零步:在acti ...

  4. ASP.NET Aries 高级开发教程:表单检测字段是否已存(番外篇)

    前言: 昨天刚好有人问了这个问题,因此就针对这个问题,补上一篇吧. 正文: 如图:在用户编辑列表中,用户名是会自动检测是否已存在的. 具体对应的Html内容如下: <label><e ...

  5. 如何实现一台服务器同时运行两个php版本

    有需要学习交流的友人请加入交流群的咱们一起,有问题一起交流,一起进步!前提是你是学技术的.感谢阅读! 点此加入该群​jq.qq.com 假设您已经安装了Apache,为这两个项目创建了虚拟主机,并添加 ...

  6. Spring Boot Security 保护你的程序

    Spring Boot Security 本示例要内容 基于角色的权限访问控制 加密.解密 基于Spring Boot Security 权限管理框架保护应用程序 String Security介绍 ...

  7. Python中定义只读属性

    Python是面向对象(OOP)的语言, 而且在OOP这条路上比Java走得更彻底, 因为在Python里, 一切皆对象, 包括int, float等基本数据类型. 在Java里, 若要为一个类定义只 ...

  8. Java内存区域与内存溢出异常,对象的创建

    一.运行时数据区域 Java程序的执行流程:首先 .java源代码文件会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执 ...

  9. javascript中常见的几种循环遍历

    项目开发中,不管是建立在哪个框架基础上,对数据的处理都是必须的,而处理数据离不开各种遍历循环.javascript中循环遍历有很多种方式,记录下几种常见的js循环遍历. 一.for循环 for循环应该 ...

  10. 与用户xxx一起提供的密码不正确。请确认输入的密码正确并重试

    环境: SharePoint 2010 / 2013 以系统账户身份登录管理中心,然后创建Web Application,报: 与用户xxx一起提供的密码不正确.请确认输入的密码正确并重试 明明都已经 ...