IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> fullter 二次封装 下拉刷新 上拉加载更多 -> 正文阅读

[移动开发]fullter 二次封装 下拉刷新 上拉加载更多

使用到的插件

pull_to_refresh | Flutter Packagea widget provided to the flutter scroll component drop-down refresh and pull up load.https://pub.flutter-io.cn/packages/pull_to_refresh

  #下拉刷新
  pull_to_refresh: ^2.0.0

大致效果:

在这里我们对? pull_to_refresh 进行了两次封装;两次的目的不一样

  1. 第一个是为了防止 插件不维护 或者更换使用其他插件 的时候避免 多个页面都要修改,这个时候 给第三方插件 外边包裹一层是一个 很好的选择:文件名: app_pull_refresh.dart,必要的时候只修改这一个文件就可以
    import 'package:flutter/cupertino.dart';
    import 'package:flutter/material.dart';
    import 'package:pull_to_refresh/pull_to_refresh.dart';
    
    class AppPullRefresh extends StatelessWidget {
      final Widget child;
      final VoidCallback? onRefresh;
      final VoidCallback? onLoading;
      final bool initialRefresh;
      const AppPullRefresh(
          {Key? key,
          required this.child,
          this.onRefresh,
          this.onLoading,
          this.initialRefresh = false})
          : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return RefreshConfiguration(
            footerTriggerDistance: 15,
            dragSpeedRatio: 0.91,
            headerBuilder: () => ClassicHeader(),
            footerBuilder: () => ClassicFooter(),
            enableLoadingWhenNoData: false,
            enableRefreshVibrate: false,
            enableLoadMoreVibrate: false,
            shouldFooterFollowWhenNotFull: (state) {
              // If you want load more with noMoreData state ,may be you should return false
              return false;
            },
            child: child);
      }
    }
    
    class AppSmartRefresher extends StatelessWidget {
      final Widget child;
      final RefreshController controller;
      final VoidCallback? onRefresh;
      final VoidCallback? onLoading;
    
      const AppSmartRefresher({
        Key? key,
        required this.child,
        required this.controller,
        this.onRefresh,
        this.onLoading,
      }) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return SmartRefresher(
          enablePullDown: true,
          enablePullUp: true,
          // header: WaterDropHeader(),
          header: const ClassicHeader(),
          footer: CustomFooter(
            builder: (BuildContext context, LoadStatus? mode) {
              Widget body;
              if (mode == LoadStatus.idle) {
                body = Text("上拉加载");
              } else if (mode == LoadStatus.loading) {
                body = CupertinoActivityIndicator();
              } else if (mode == LoadStatus.failed) {
                body = Text("加载失败!点击重试!");
              } else if (mode == LoadStatus.canLoading) {
                body = Text("松手,加载更多!");
              } else {
                body = Text("没有更多数据了!");
              }
              return Container(
                height: 55.0,
                child: Center(child: body),
              );
            },
          ),
          controller: controller,
          onRefresh: onRefresh,
          onLoading: onLoading,
          child: child,
        );
      }
    }
    

  2. 第二次是为了简化使用 文件名:abstract_app_page_refresh.dart
    import 'package:bilibili/widget/app_pull_refresh.dart';
    import 'package:flutter/material.dart';
    import 'package:pull_to_refresh/pull_to_refresh.dart';
    
    ///M 为 驱动页面页面要展示的 数据类型   泛型  W 则是要展示的页面 约束自 StatefullWidget
    abstract class AbstractAppPageRefresh<M, W extends StatefulWidget>
        extends State<W> with AutomaticKeepAliveClientMixin {
      List<M> dataList = [];
      int pageIndex = 1;
      final RefreshController refreshController =
          RefreshController(initialRefresh: false);
    
      onRefresh();//下拉刷新
      onLoading();//上拉加载更多
      buildView();//根据数据展示 列表类容;这几放在了继承类中实现  灵活性更强
    
      @override
      void initState() {
        // TODO: implement initState
        super.initState();
        onRefresh();
      }
    
      @override
      Widget build(BuildContext context) {
        return Container(
          child: AppSmartRefresher(
            controller: refreshController,
            onRefresh: onRefresh,
            onLoading: onLoading,
            child: buildView(),
          ),
        );
      }
    
      @override
      void dispose() {
        // TODO: implement dispose
        super.dispose();
        refreshController.dispose();
      }
    }
    
    ?

具体在页面中的使用:

内部页面: page_favorite_content.dart

import 'package:bilibili/widget/abstract_app_page_refresh.dart';
import 'package:bilibili/http/dao/dao_favorrite.dart';
import 'package:bilibili/model/ranking_mo.dart';
import 'package:bilibili/model/video_model.dart';
import 'package:bilibili/util/toast.dart';
import 'package:bilibili/widget/loading_widget.dart';
import 'package:bilibili/widget/video_large_card.dart';
import 'package:flutter/material.dart';

class PageFavoriteContent extends StatefulWidget {
  const PageFavoriteContent({Key? key}) : super(key: key);

  @override
  _PageFavoriteContentState createState() => _PageFavoriteContentState();
}



///重点在这里 
///重点在这里 
///重点在这里 
///重点在这里 
///重点在这里 
///重点在这里  以前是 继承 State 这里换成我们的 AbstractAppPageRefresh
class _PageFavoriteContentState
    extends AbstractAppPageRefresh<VideoModel, PageFavoriteContent> {
  @override
  // TODO: implement wantKeepAlive
  bool get wantKeepAlive => false;

  @override
  buildView() {
    return dataList.length == 0
        ? const Center(
            child: LoadingWidget(),// 等待数据的进度条
          )
        : ListView.builder(//具体要展示的别表类容
            padding: EdgeInsets.only(top: 10),
            // itemExtent: 10,
            addAutomaticKeepAlives: false,
            itemCount: dataList.length,
            itemBuilder: (BuildContext content, int index) {
              return VideoLargeCard(videoModel: dataList[index]);
            },
          );
  }

  @override
  onLoading() async {
    int pageStep = pageIndex + 1;
    int pageSize = 50;
    try {


      /// 数据的请求
      RankingMo result = await DaoFavorite.favoriteList(
          pageIndex: pageIndex, pageSize: pageSize);

      if (result.list.length < pageSize) {///没有更多 类容
        refreshController.loadNoData();
      }
      setState(() {
        if (result.list.isNotEmpty) {
          dataList = [...dataList, ...result.list];//数据合并
          pageIndex = pageStep;
        }
      });
    } catch (ex) {
      print("_loadData 异常--->$ex");
      showToastWarn(ex.toString());
    }

    refreshController.loadComplete();
  }

  @override
  onRefresh() async {
    // TODO: implement onRefresh
    int pageSize = 50;
    try {
      pageIndex = 1;
      
      /// 数据的请求
      RankingMo result = await DaoFavorite.favoriteList(
          pageIndex: pageIndex, pageSize: pageSize);
      if (result.list.length < pageSize) {///没有更多 类容
        refreshController.loadNoData();
      }

      setState(() {
        dataList = result.list;
      });
    } catch (ex) {
      print("_loadData 异常--->$ex");
      showToastWarn(ex.toString());
    }
    refreshController.refreshCompleted();
  }
}

外部页面:page_favorite.dart

import 'package:bilibili/pages/page_favorite_content.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class PageFavorite extends StatelessWidget {
  const PageFavorite({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        title: const Text(
          "收藏",
          style: TextStyle(fontSize: 14),
        ),
      ),
      body: const PageFavoriteContent(),//要展示具下拉刷新 上拉加载更多的页面
    );
  }
}

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-24 18:35:55  更:2021-12-24 18:37:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:07:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码