Flutter刷新实践 2022-07-18 周一

2022-07-18  本文已影响0人  勇往直前888

简介

下拉刷新,下拉加载更多,是一个比较普遍的功能。比如一个接口返回一个列表,数据有上百项,甚至更多,一次性全部返回显示不大合适。所以,一般接口会进行分页,提供一个page和pageSize参数,一小部分一小部分地来取数据。
虽然iOS原生提供这些功能,但是效果很差,一般都会求助于第三方库。Flutter也一样,这个功能也会用第三方库。

添加

flutter pub add easy_refresh
dependencies:
  easy_refresh: ^3.0.2+1

链接地址

easy_refresh: ^3.0.2+1

flutter_easy_refresh

3.0是最近的一次大升级,pub上的地址都变了。以前的名字叫flutter_easy_refresh

构造方法

这个组件用的最多的是ListView。用法和手势差不多,将需要上拉下拉的ListView作为子组件。

/// 默认的构造方法
const EasyRefresh({
    Key? key,
    required this.child,
//... ....
})

/// 第2种构造方法
const EasyRefresh.builder({
    Key? key,
    required this.childBuilder,
//... ....
})

上拉下拉

这是这个组件最核心的两个功能。就像onTap对于GestureDetector组件一样。虽然是可选的,但是大多数情况,这两个参数都是要给的。

  /// Refresh callback.
  /// Triggered on refresh.
  /// When null, disable refresh.
  /// The Header current state is [IndicatorMode.processing].
  /// More see [IndicatorNotifier.onTask].
  final FutureOr Function()? onRefresh;

  /// Load callback.
  /// Triggered on load.
  /// When null, disable load.
  /// The Footer current state is [IndicatorMode.processing].
  /// More see [IndicatorNotifier.onTask].
  final FutureOr Function()? onLoad;

头和尾

  /// Header indicator.
  final Header? header;

  /// Footer indicator.
  final Footer? footer;

控制器

  /// Take over the completion event of the refresh task.
  /// Finish the refresh with [finishRefresh] and return the result.
  final bool controlFinishRefresh;

  /// Take over the completion event of the load task.
  /// Finish the load with [finishLoad] and return the result.
  final bool controlFinishLoad;

  EasyRefreshController({
    this.controlFinishRefresh = false,
    this.controlFinishLoad = false,
  });

简化的例子

  ///下拉刷新上拉加载固定写法
  List dataList = [];
  int pageNum = 1;
  final int pageSize = 20;
  bool hadMore = true;
  EasyRefreshController easyRefreshController = EasyRefreshController(
    controlFinishRefresh: true,
    controlFinishLoad: true,
  );

  /// 下拉刷新
  Future refreshData() async {
    pageNum = 1;
    hadMore = true;
    dataList = [];
    
    getDataList();
  }

  /// 上拉加载更多
  Future loadMoreData() async {
    if (hadMore) {
      pageNum++;
      getDataList();
    } else {
      easyRefreshController.finishLoad(IndicatorResult.noMore);
    }
  }

  /// 从网络取数据
  void getDataList() {
    NetworkApi.getDataListFromRemote(
        pageNum: pageNum,
        pageSize: pageSize,
        success: (response) {
          List list = response['data'];
          if (list.length < pageSize) {
            hadMore = false;
          } else {
            hadMore = true;
          }
          if (dataList.isEmpty) {
            easyRefreshController.finishRefresh();
          } else {
            easyRefreshController.finishLoad(
                hadMore ? IndicatorResult.success : IndicatorResult.noMore);
          }
          dataList.addAll(list);

          update();
        },
        fail: (fail) {});
  }
  //下拉刷新上拉加载固定写法

@override
  void onClose() {
    easyRefreshController.dispose();
    super.onClose();
  }
EasyRefresh(
    controller: logic.easyRefreshController,
    header: ClassicHeader(),
    footer: ClassicFooter,
    onRefresh: logic.refreshData,
    onLoad: logic.loadMoreData,
    child: ListView.builder(
        itemCount: logic.dataList.length,
        itemBuilder: (BuildContext context, int index) {
            Map item = logic.dataList[index] ?? {};
            String name = item['name'] ?? '';
            return Container(
                height: 44.h,
                child: Text(name),
            );
        }
    ),
)
上一篇 下一篇

猜你喜欢

热点阅读