首页 > 解决方案 > Flutter 中使用 BLoC 的异步请求

问题描述

我想下载数据,但也一直使用该应用程序。

你能告诉我这是否是正确的解决方案吗?

案例是我们按下按钮下载并调用函数 bloc.dispatch(Event.download());

在 _Download 事件的 mapEventToState 中,我们请求数据。但是我们不等待响应,因为我们不想阻止其他正在改变视图的事件。

所以我创建了 Future 并在得到响应后调用事件 _UpdateData() 来处理下载的数据并用它们生成状态。

没关系?有 _requestTime 参数来检查它是否是最后一个请求。

class Bloc {
  DateTime _requestTime;

  @override
  Stream<State> mapEventToState(Event event) async* {
    if (event is _Download) {
      yield DownloadingState();
      _request();
    } else if (event is _UpdateData) {
      if(!event.requestTime.isBefore(_requestTime))
        yield DownladedState(event.response);
    }
  }

  _request() {
    _requestTime = DateTime.now();
    repository.downloadData().then((response) {
      dispatch(_UpdateData(response));
    });
  }
}

标签: flutterblocflutter-bloc

解决方案


让我知道它是否有效

在 _request 前面更改了产量*

@override
Stream<State> mapEventToState(Event event) async* {
if (event is _Download) {
  yield DownloadingState();
 yield* _request();
} else if (event is _UpdateData) {
  if(!event.requestTime.isBefore(_requestTime))
    yield DownladedState(event.response);
}
}

_request() async*{
_requestTime = DateTime.now();
repository.downloadData().then((response) {
  dispatch(_UpdateData(response));
});
}
}

推荐阅读