Flutter 库:强大的下拉刷新上拉加载框架——EasyRefresh

news2024/11/15 17:44:30

Flutter 库:强大的下拉刷新上拉加载框架——EasyRefresh

文章目录

  • Flutter 库:强大的下拉刷新上拉加载框架——EasyRefresh
  • 一、概述
    • 1、简介
    • 2、特征
    • 3、在线演示
    • 4、APK下载
    • 5、接口参考
  • 二、官方示例
    • 1、默认构造函数
    • 2、生成器构造函数
    • 3、指示器定位
    • 4、使用指示器
    • 5、指定页眉和页脚
    • 6、嵌套滚动视图
  • 三、基本使用
    • 1、安装
    • 2、基本使用
    • 3、运行结果
  • 四、封装 SimpleEasyRefresher
    • 1、封装
    • 2、使用示例
    • 3、运行结果

一、概述

1、简介

EasyRefresh 是一个用于 Flutter 应用程序的简单易用的下拉刷新上拉加载框架。它支持几乎所有的 Flutter 可滚动小部件。它的功能与Android 的 SmartRefreshLayout 非常相似,并吸收了许多第三方库的优点。EasyRefresh 集成了各种样式的页眉和页脚,但没有任何限制,您可以轻松自定义它们。利用Flutter强大的动画功能,即使只是一个简单的控件也可以实现复杂的效果。EasyRefresh的目标是为Flutter创建一个功能强大、稳定和成熟的下拉刷新框架。

2、特征

EasyRefresh具有以下特性:

  • 支持所有可滚动小部件
  • 滚动物理范围,完全匹配可滚动小部件
  • 集成多个酷页眉和页脚样式
  • 支持自定义样式,实现各种动画效果
  • 支持下拉刷新和上拉加载(可通过控制器触发和完成)
  • 支持指示器位置设置,结合监听器可以放置在任意位置
  • 支持页面启动时刷新,并可自定义视图
  • 支持安全区域,不会遮挡内容
  • 可自定义滚动参数,允许列表具有不同的滚动反馈和惯性

3、在线演示

https://xuelongqy.github.io/flutter_easy_refresh/#/

4、APK下载

https://github.com/xuelongqy/flutter_easy_refresh/releases

5、接口参考

https://pub.flutter-io.cn/documentation/easy_refresh/latest/

二、官方示例

1、默认构造函数

dartCopy codeEasyRefresh(
  onRefresh: () async {
    // 下拉刷新逻辑
    // ...
  },
  onLoad: () async {
    // 上拉加载逻辑
    // ...
  },
  child: ListView(),
);

2、生成器构造函数

dartCopy codeEasyRefresh.builder(
  onRefresh: () async {
    // 下拉刷新逻辑
    // ...
    return IndicatorResult.success;
  },
  onLoad: () async {
    // 上拉加载逻辑
    // ...
  },
  childBuilder: (context, physics) {
    return ListView(
      physics: physics,
    );
  },
);

3、指示器定位

EasyRefresh(
    header: Header(
        position: IndicatorPosition.locator,
    ),
    footer: Footer(
        position: IndicatorPosition.locator,
    ),
    onRefresh: () async {
        // 下拉刷新逻辑
        // ...
    },
    onLoad: () async {
        // 上拉加载逻辑
        // ...
        return IndicatorResult.noMore;
    },
    child: CustomScrollView(
        slivers: [
            SliverAppBar(),
            const HeaderLocator.sliver(),
            // ...
            const FooterLocator.sliver(),
        ],
    ),
);

4、使用指示器

EasyRefreshController _controller = EasyRefreshController(
    controlFinishRefresh: true,
    controlFinishLoad: true,
  );
  ....
  EasyRefresh(
    controller: _controller,
    onRefresh: () async {
      ....
      _controller.finishRefresh();
      _controller.resetFooter();
    },
    onLoad: () async {
      ....
      _controller.finishLoad(IndicatorResult.noMore);
    },
    ....
  );
  ....
  _controller.callRefresh();
  _controller.callLoad();

5、指定页眉和页脚

EasyRefresh(
    header: MaterialHeader(),
    footer: MaterialFooter(),
    child: ListView(),
    ....
  );
  // Global
  EasyRefresh.defaultHeaderBuilder = () => ClassicHeader();
  EasyRefresh.defaultFooterBuilder = () => ClassicFooter();

6、嵌套滚动视图

EasyRefresh.builder(
    header: MaterialHeader(
      clamping: true,
    ),
    onRefresh: () async {
      ....
    },
    onLoad: () async {
      ....
    },
    childBuilder: (context, physics) {
      return NestedScrollView(
        physics: physics,
        body: ListView(
          physics: physics,
        );
      );
    },
  );
  // or
  EasyRefresh.builder(
    header: MaterialHeader(
      clamping: true,
      position: IndicatorPosition.locator,
    ),
    onRefresh: () async {
      ....
    },
    onLoad: () async {
      ....
    },
    childBuilder: (context, physics) {
      return NestedScrollView(
        physics: physics,
        headerSliverBuilder: (context, innerBoxIsScrolled) {
          return [
            const HeaderLocator.sliver(clearExtent: false),
            ....
          ];
        },
        body: ListView(
          physics: physics,
        );
      );
    },
  );

三、基本使用

1、安装

flutter pub add easy_refresh

2、基本使用

import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter/material.dart';

class MyHomePage extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('EasyRefresh 示例'),
      ),
      body: EasyRefresh(
        onRefresh: () async {
          // 下拉刷新逻辑
          // ...
          await Future.delayed(Duration(seconds: 2));
        },
        onLoad: () async {
          // 上拉加载逻辑
          // ...
          await Future.delayed(Duration(seconds: 2));
        },
        child: ListView.builder(
          itemCount: 20,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text('Item $index'),
            );
          },
        ),
      ),
    );
  }
}

void main() {
  runApp(MaterialApp(
    home: MyHomePage(),
  ));
}

3、运行结果

image-20230608151101534

四、封装 SimpleEasyRefresher

1、封装

import 'dart:async';

import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter/material.dart';

class SimpleEasyRefresher extends StatefulWidget {
  const SimpleEasyRefresher({
    super.key,
    required this.easyRefreshController,
    this.onLoad,
    this.onRefresh,
    required this.childBuilder,
    this.indicatorPosition = IndicatorPosition.above,
  });

  // EasyRefreshController实例,用于控制刷新和加载的状态
  final EasyRefreshController? easyRefreshController;

  // 加载回调函数
  final FutureOr<dynamic> Function()? onLoad;

  // 刷新回调函数
  final FutureOr<dynamic> Function()? onRefresh;

  // 构建子组件的回调函数
  final Widget Function(BuildContext context, ScrollPhysics physics)?
      childBuilder;

  // 指示器的位置,默认为上方
  final IndicatorPosition indicatorPosition;

  
  State<SimpleEasyRefresher> createState() => _SimpleEasyRefresherState();
}

class _SimpleEasyRefresherState extends State<SimpleEasyRefresher> {
  
  Widget build(BuildContext context) {
    return EasyRefresh.builder(
      // 在开始刷新时立即触发刷新
      refreshOnStart: true,
      // 刷新完成后重置刷新状态
      resetAfterRefresh: true,
      // 同时触发刷新和加载的回调函数
      simultaneously: true,
      // 加载回调函数
      onLoad: () async {
        await widget.onLoad?.call();
        setState(() {});
      },
      // 刷新回调函数
      onRefresh: () async {
        await widget.onRefresh?.call();
        setState(() {});
      },
      // 指定刷新时的头部组件
      header: ClassicHeader(
        hitOver: true,
        safeArea: false,
        processedDuration: Duration.zero,
        showMessage: false,
        showText: false,
        position: widget.indicatorPosition,
        // 下面是一些文本配置
        // processingText: "正在刷新...",
        // readyText: "正在刷新...",
        // armedText: "释放以刷新",
        // dragText: "下拉刷新",
        // processedText: "刷新成功",
        // failedText: "刷新失败",
      ),
      // 指定加载时的底部组件
      footer: ClassicFooter(
        processedDuration: Duration.zero,
        showMessage: false,
        showText: false,
        position: widget.indicatorPosition,
        // 下面是一些文本配置
        // processingText: "加载中...",
        // processedText: "加载成功",
        // readyText: "加载中...",
        // armedText: "释放以加载更多",
        // dragText: "上拉加载",
        // failedText: "加载失败",
        // noMoreText: "没有更多内容",
      ),
      controller: widget.easyRefreshController,
      childBuilder: widget.childBuilder,
    );
  }
}

2、使用示例

import 'package:flutter/material.dart';
import 'package:easy_refresh/easy_refresh.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Pull to Refresh',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  EasyRefreshController _controller = EasyRefreshController();

  List<String> _dataList = List.generate(10, (index) => 'Item ${index + 1}');

  Future<void> _refresh() async {
    // 模拟刷新操作
    await Future.delayed(Duration(seconds: 2));
    setState(() {
      _dataList = List.generate(10, (index) => 'Item ${index + 1}');
    });
    _controller.finishRefresh();
  }

  Future<void> _loadMore() async {
    // 模拟加载更多操作
    await Future.delayed(Duration(seconds: 2));
    setState(() {
      _dataList.addAll(List.generate(10, (index) => 'Item ${_dataList.length + index + 1}'));
    });
    _controller.finishLoad();
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Pull to Refresh'),
      ),
      body: SimpleEasyRefresher(
        easyRefreshController: _controller,
        onRefresh: _refresh,
        onLoad: _loadMore,
        childBuilder: (context, physics) {
          return ListView.builder(
            physics: physics,
            itemCount: _dataList.length,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text(_dataList[index]),
              );
            },
          );
        },
      ),
    );
  }
}

3、运行结果

image-20230608152029058

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/623840.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年网络安全HW攻防技术总结(珍藏版)

2022年护网正当时&#xff0c;相信不少网安人都已经进入了状态。 我们都知道&#xff0c; 护网行动 是国家应对网络安全问题所做的重要布局之一。至今已经是7个年头了&#xff0c;很多公司在这时候人手不够&#xff0c;因此不得不招募一些网安人员来参加护网。 红队 扮演攻击…

Linux搭建Java环境——安装JDK

一、上传jdk1.8文件 首先通过Xftp 7软件&#xff0c;将jdk文件传输到Linux上&#xff08;连接和Xshell 7方法相同&#xff0c;软件资源在首页中的下载栏处免费获取&#xff09;当然需要在opt文件夹下先新建jdk的文件夹 二、解压jdk文件 解压完成后可以发现蓝色的jdk1.8的目录生…

Android Studio实现五子棋小游戏

项目目录 一、项目概述二、开发环境三、详细设计1、布局设计2、验证码3、AI人机4、背景音乐 四、运行演示五、项目总结 一、项目概述 五子棋是一种两人对弈的策略型棋类游戏&#xff0c;本次五子棋小游戏具有人机对战和人人对战两种玩法。人机对战可以单人挑战AI&#xff0c;实…

SQL语言的规则与规范

SQL语言的规则与规范 前言一、SQL概述1、SQL背景知识2、SQL语言排行榜3、SQL 分类 二、SQL语言的规则与规范1、基本规则2、SQL大小写规范 &#xff08;建议遵守&#xff09;3、注 释4、命名规则&#xff08;暂时了解&#xff09;5、数据导入指令 前言 本博主将用CSDN记录软件开…

怎么用pe系统重装系统,如何用pe重装系统

其实&#xff0c;电脑装系统并没有这么难&#xff0c;尤其是u盘pe系统相对来说比较简单一点。但是&#xff0c;现在还有很多朋友一直在问这个是怎么装系统的&#xff0c;关键是装系统耗的时间比较长&#xff0c;步骤好像很复杂的样子&#xff0c;担心自己操作出现失误。确实&am…

Ansys Zemax | 如何以数据的方式定义网格矢高表面

引言 本文示范了如何输入表面起伏数据&#xff0c;以定义Zemax OpticStudio中的网格矢高 (Grid Sag) 类型表面&#xff0c;表面起伏数据应为Z坐标轴上的矢高 (Sag)。(联系我们获取文章附件) 正文 表面起伏数据格式是这样定义的&#xff1a; 第一行&#xff0c;由7个数字表示。 …

ASEMI代理英飞凌TDK5100F射频模块的性能与应用分析

编辑-Z 本文将对TDK5100F射频模块进行详细的介绍与分析&#xff0c;包括其性能特点、应用领域、使用方法。通过对这三个方面的阐述&#xff0c;希望能够帮助读者更好地了解TDK5100F射频模块的优势和应用场景。 1、TDK5100F射频模块的性能特点 TDK5100F射频模块是一款高性能的…

IPV6地址基础

IPv6是英文“Internet Protocol Version 6”&#xff08;互联网协议第6版&#xff09;的缩写&#xff0c;是互联网工程任务组&#xff08;IETF&#xff09;设计的用于替代IPv4的下一代IP协议。其地址数量号称可以为全世界的每一粒沙子编上一个地址 1. ipv6地址表示方法 IPv6的…

【前端播放器】前端播放器的时延问题小总结

目录 结论 播放器的优化测试与小结论 结论 根据理论知识&#xff0c;及代码查看&#xff0c;实验后 【ZLM】ZLM源码阅读三----延时问题_dualven_in_csdn的博客-CSDN博客 发现&#xff0c;结论大概与文中相同 &#xff1a;主要的延时&#xff0c;主要是播放器端形成的。 播放…

科技数据分析,2022年授权通过的专利数高达近80万项

哈喽大家好&#xff0c;中国科技发展在近年来取得了巨大进步&#xff0c;相关部门也积极推动科技创新&#xff0c;加大科技投入&#xff0c;鼓励企业加强研发&#xff0c;加速科技成果转化落地。此外&#xff0c;中国还在国际科技合作方面取得了积极进展&#xff0c;与各国合作…

使用 Golang 在 GitLab 上拉取代码并将静态资源部署到 Nginx,同时将图库上传至阿里云 OSS

使用 Golang 在 GitLab 上拉取代码并将静态资源部署到 Nginx&#xff0c;同时将图库上传至阿里云 OSS 本文章采用几个任务执行 最终想要实现效果&#xff0c; 1、golang做成一个服务占用一个端口&#xff0c;然后监测gitlab仓库webhook 2、前端人员提交代码到gitlab&#xff…

5.3图的综合应用算法

一.最小生成树算法 1.概念&#xff08;Minimum-Spanning-Tree&#xff09;MST 生成树&#xff1a;针对于连通图&#xff0c;包含全部顶点&#xff0c;去掉一条边后不连通&#xff0c;加一条边形成环 最小生成树:带权连通无向图&#xff0c;边的权值之和最小的生成树(MST) 2.…

insightface 人脸检测与识别

参考&#xff1a;https://huaweicloud.csdn.net/638088d7dacf622b8df89c0c.html insightface模型下载可能需要连接外网&#xff0c;模型自动下载保存再models\buffalo_l下&#xff0c;人脸注册自动保存再face_db目录下 1、具体人脸录入 python face_label.py --picture 刘亦…

GD32E230F4使用硬件IIC+DMA读写24C04

前言 在很久很久以前&#xff0c;我就写过GD32E230替换STM32F031的帖子&#xff0c;主要介绍了USART和SPI的外设移植开发&#xff0c;当时IIC使用的是软件i2c&#xff0c;没有介绍的价值。在使用IIC时&#xff0c;大多数我们都是采用软件的方式&#xff0c;因为软件的方式及其…

护网是什么?怎么参加

一、什么是护网行动&#xff1f; 护网行动是以公安部牵头的&#xff0c;用以评估企事业单位的网络安全的活动。 具体实践中。公安部会组织攻防两方&#xff0c;进攻方会在一个月内对防守方发动网络攻击&#xff0c;检测出防守方&#xff08;企事业单位&#xff09;存在的安全…

对象进阶、原型-原型链

工厂方法创建对象 我们之前已经学习了如何创建一个对象&#xff0c;那我们要是想要创建多个对象又该怎么办&#xff1f;聪明的同学可能会说&#xff0c;直接在写几个对象不就好了吗&#xff1f;比如下边的代码&#xff1a; var person1 {name: "孙悟空",age: 18,s…

2核2G3M轻量服务器腾讯云和阿里云怎么选择?

2核2G3M轻量应用服务器选阿里云还是腾讯云&#xff1f;腾讯云2核2G3M轻量应用服务器95元一年&#xff0c;阿里云2核2G3M配置优惠价108元一年&#xff0c;如何选择&#xff1f;阿腾云详细对比阿里云和腾讯云轻量应用服务器2核2G3M配置CPU性能及选择方法&#xff1a; 目录 轻量…

基于STM32F103+思岚A1激光雷达的扫描仪

前言 一个朋友在做服务机器人项目&#xff0c;用到思岚的激光雷达&#xff0c;于是便把淘汰的A1M8雷达送我一个&#xff0c;本着拿到啥就玩啥的态度&#xff0c;必须整一波。其实激光雷达还是搭配ROS才能发挥最大的作用&#xff0c;奈何资源有限&#xff0c;实力不足&#xff…

STM32 USB CDC VPC

STM32 USB CDC VPC 关键字 STM32,STM32CubeMX,HAL库,USB,虚拟串口,串口不定长接收 1.简介 通过使用stm32cubemx&#xff0c;实现USB CDC虚拟串口&#xff0c;并与硬件串口进行数据传输&#xff0c;实现了硬件串口数据的不定长接收&#xff0c;以及USB虚拟串口超过64字节的数…

钉钉H5微应用基础学习

钉钉开发文档 一、使用调试工具——IDE&#xff1a; 1、先下载调试工具&#xff0c;并且新建一个企业内部应用。 如果需要管理员权限&#xff0c;可以自己创建一个企业。 &#xff08;tips&#xff1a;一定要屏蔽自己创建的企业的消息&#xff0c;不然消息很多&#xff09; 2…