【问题标题】:Async request using BLoC in FlutterFlutter 中使用 BLoC 的异步请求
【发布时间】:2020-05-03 09:00:21
【问题描述】:

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

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

情况是我们按下按钮下载并调用函数 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));
    });
  }
}

【问题讨论】:

  • 你能试着简化你的问题吗?目前很难理解您需要什么帮助。

标签: flutter bloc flutter-bloc


【解决方案1】:

让我知道它是否有效

在_request前面更改添加yield*

@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));
});
}
}

【讨论】:

    猜你喜欢
    • 2020-11-25
    • 2019-07-21
    • 1970-01-01
    • 2021-05-17
    • 2018-04-24
    • 2021-09-05
    • 2020-05-03
    • 1970-01-01
    • 2020-09-04
    相关资源
    最近更新 更多