List View刷新
我用的InfiniteListView,是flukit包的一个组件,直接拿来用还是挺好用的,只是代码控制刷新的时候遇到一些问题,代码控制刷新要修改源码,之前在网上看到有人加了一个refreshKey控制上拉刷新,但是在没有数据的时候,上拉刷新是无效的,要点击界面才能刷新,所以还必须要代码控制listView的刷新,于是到官网看到也有人遇到同样的问题,于是结合两种方法实现,解决当前问题:
final GlobalKey<RefreshIndicatorState> refreshIndicatorKey = new GlobalKey<RefreshIndicatorState>();
InfiniteListViewRefreshController refreshControllers = new InfiniteListViewRefreshController();
eventBus.on<RefreshEvent>().listen((event) async {
if(refreshIndicatorKey.currentState != null){
refreshIndicatorKey.currentState.show();
}else{
refreshControllers.refresh(true);
}
});
MyInfiniteListView<Items>(
refreshController: refreshControllers,
refreshKey: refreshIndicatorKey,
emptyBuilder: (VoidCallback refresh, BuildContext context) {
return listNoDataView(refresh, context);
},)
MyInfiniteListView代码如下:
import 'dart:async';
import 'package:flutter/material.dart';
///扩充自InfiniteListView。地址: https://github.com/flutterchina/flukit
/// 扩充了参数 refreshKey 作用:用户外部获取RefreshIndicator的State,通过代码触发刷新
/// if return `true`, indicates no more data;
typedef RetrieveDataCallback<T> = Future<bool> Function(
int page, List<T> items, bool refresh);
typedef ItemBuilder<T> = Widget Function(T e, BuildContext ctx);
typedef IndexedItemBuilder<T> = Widget Function(
List<T> list, int index, BuildContext ctx);
typedef LoadErrorCallback = void Function(dynamic e, bool isFirstPage);
class LoadingState<T> {
//Save data
List<T> items = [];
dynamic error;
bool loading = false;
int currentPage = 0;
bool noMore = false;
bool get initialized => items.isNotEmpty || noMore;
}
class InfiniteListViewRefreshController {
Future Function(bool) refreshFunc;
void refresh(bool pullDown) {
if(refreshFunc!=null) refreshFunc(pullDown);
}
}
class MyInfiniteListView<T>