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

这篇具有很好参考价值的文章主要介绍了Flutter 库:强大的下拉刷新上拉加载框架——EasyRefresh。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

一、概述

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/文章来源地址https://www.toymoban.com/news/detail-804993.html

二、官方示例

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、运行结果

四、封装 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、运行结果

到了这里,关于Flutter 库:强大的下拉刷新上拉加载框架——EasyRefresh的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序 上列表拉加载下拉刷新

      上拉加载和下拉刷新是小程序开发的常见需求。本文将介绍如何在微信小程序中实现上拉加载和下拉刷新的功能,为用户带来更加流畅、便捷的使用体验。 微信小程序 上列表拉加载下拉刷新 (1) 首先需要在使用到的 json 文件下配置 “enablePullDownRefresh”: true (2) 在 js 文件

    2024年01月16日
    浏览(41)
  • 【HarmonyOS开发】ArkUI实现下拉刷新/上拉加载

     列表下拉刷新、上拉加载更多,不管在web时代还是鸿蒙应用都是一个非常常用的功能,基于ArkUI中TS扩展的声明式开发范式实现一个下拉刷新,上拉加载。 如果数据量过大,可以使用LazyForEach代替ForEach 高阶组件-上拉加载,下拉刷新 https://gitee.com/bingtengaoyu/harmonyos-advanced-com

    2024年01月20日
    浏览(30)
  • 微信小程序-上拉加载更多和下拉刷新

    页面配置文件中配置 \\\"enablePullDownRefresh\\\": true 开启下拉刷新 设置 onPullDownRefresh 方法 在用户下拉时会调用 onPullDownRefresh 方法 在完成后需要调用 wx.stopPullDownRefresh() 关闭刷新状态 可以在页面配置文件中配置 \\\"onReachBottomDistance\\\":50 来设置触发上拉加载的距离,单位为 px 。 默认:

    2024年02月15日
    浏览(33)
  • Android 实现 RecyclerView下拉刷新,SwipeRefreshLayout上拉加载

    上拉、下拉的效果图如下: 使用步骤 1、在清单文件中添加依赖 implementation ‘com.android.support:recyclerview-v7:27.1.1’ implementation “androidx.swiperefreshlayout:swiperefreshlayout:1.0.0” 2、main布局 item.xml footview.xml(底部提示) 2、MyAdapter 3、MainActivity实现

    2024年02月13日
    浏览(36)
  • H5如何做页面下拉刷新和上拉加载

    这里以vant为例 结构 处理方法

    2024年02月10日
    浏览(36)
  • 微信小程序 下拉分页 z-paging下拉刷新、上拉加载

    【z-paging下拉刷新、上拉加载】高性能,全平台兼容。支持虚拟列表,支持nvue、vue3 - DCloud 插件市场  z-paging,使用非常简单,按部就班就行了 1,首先将其导入自己的小程序项目中  导入后的效果 2,具体如何使用:https://z-paging.zxlee.cn    选项式api写法(vue2/vue3) 组合式api写法

    2024年02月11日
    浏览(40)
  • uniapp使用自带【刷新方法】与使用【scroll-view】实现下拉刷新上拉加载

    前言:uniapp自带下拉刷新,上拉加载功能基本可以满足刷新需求,但是顶部有状态栏的页面就得进行特殊处理,使用scroll-view解决,状态栏会连带被下拉问题   1、uniapp自带下拉刷新、上拉加载 在page.json中对应页面路由设置【enablePullDownRefresh】值为true(开启下拉刷新) 代码:

    2024年02月11日
    浏览(33)
  • 学习微信小程序的下拉刷新和上拉加载更多

    好的,下面我将为你详细介绍微信小程序中的下拉刷新和上拉加载更多功能,并提供代码案例。 下拉刷新功能 下拉刷新是指当用户在小程序页面下拉时,页面可以重新加载最新的数据。为了实现下拉刷新功能,我们需要使用小程序提供的 onPullDownRefresh 生命周期函数。 以一个

    2024年04月14日
    浏览(31)
  • IOS 类似抖音下拉刷新与自定义上拉加载

    IOS 类似抖音下拉刷新与自定义上拉加载 首先考虑在UICollection与拖动手势之间的问题。 解决UICollectionView上添加手势不能触发。 这里使用了子类继承UICollectionView 在View上添加拖动手势 self.startPoint = CGPointZero; self.isInLoading = NO; 处理手势判断 // 给加的手势设置代理, 并实现此协议

    2024年02月09日
    浏览(28)
  • 微信小程序 - scroll-view组件之上拉加载下拉刷新(解决上拉加载不触发)

    最近在做微信小程序项目中,有一个功能就是做一个商品列表分页限流然后实现上拉加载下拉刷新功能,遇到了一个使用scroll-viwe组件下拉刷新事件始终不触发问题,网上很多说给scroll-view设置一个高度啥的就可以解决,有些人设置了高度也不触发,所以在下就研究了一波这个

    2024年02月14日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包