如何使用异步调度方法作为RefreshRendator onRefresh回调

时间:2018-04-11 03:29:22

标签: redux dart flutter redux-thunk

我有一个包含在RefreshIndicator中的列表。当列表被拉下来时,我想从Firestore(数据库)中获取一些数据,更新我的状态,然后渲染列表。

我有一个连接的redux动作可以获取数据并更新我的状态:

final FetchPostsRequest = () {
    return (Store<AppState> store) {
        final CollectionReference postCollection = Firestore.instance.collection("posts");
        postCollection.getDocuments().then((QuerySnapshot snapshot) {
            List<DocumentSnapshot> docs = snapshot.documents;
            print("Getting documents....");
            List<Model.Post> posts = docs.map((d) => Model.Post.fromMap(d.data)).toList();
            store.dispatch(new FetchPostsSuccess(posts: posts));
        }).catchError((err) {
            print(err);
            store.dispatch(new FetchPostsFailure(error: err));
        });
    };
};

如何将其用作RefreshIndicator's回调?它的回调是Future<Null> RefreshCallback ()形式,我不知道如何纠正这个问题以适应redux状态管理思维。

1 个答案:

答案 0 :(得分:0)

要在Flutter中将RefreshIndicator与redux一起使用,应将Completer<Null>放入Action类。 该计划是

  1. 创建一个包含Completer<Null>
  2. 的操作
  3. action.completer.future返回到onRefresh的{​​{1}}功能
  4. 编写一个侦听此操作的中间件。

动作

让我们假设您有RefreshIndicator。代码如下:

RefreshItemsAction

中间件

比中间件如下:

class RefreshItemsAction {
  final Completer<Null> completer;

  RefreshItemsAction({Completer completer})
    : this.completer = completer ?? Completer<Null>();
}

RefreshIndicator

Presentation层如下:

List<Middleware<AppState>> createItemsMiddleware() {
  return [
    TypedMiddleware<AppState, RefreshItemsAction>(_refreshItems),
  ];
}

Middleware<AppState> _refreshItems() {
  return (Store<AppState> store, action, NextDispatcher next) {
    if (action is RefreshItemsAction) {
      loadItems().then((items) {
          store.dispatch(ItemsRefreshedAction(items));
          action.completer.complete();
        },
      ).catchError((_) {
        store.dispatch(ItemsNotRefreshedAction());
        action.completer.complete();
      });
    }
    next(action);
  };
}

有关更多信息,请检查issue on github