【问题标题】:Migrate to BLoC 7.2- Nested Streams - yield* inside other stream迁移到 BLoC 7.2- 嵌套流 - 在其他流中生成 *
【发布时间】:2022-01-18 11:07:56
【问题描述】:

我正在将一个项目从 Bloc 7.0 迁移到 7.2

我在尝试处理以下Stream 的迁移时遇到问题,因为它在自身内部调用另一个流:

 Stream<CustomerState> _mapUpdateNewsletter({...}) async* {
    try {
      [...]
      
      yield* _mapGetCustomer(); // Calling another Stream here

      Toast.showSuccess(message: successMessage);
    } ...
  }

这就是所谓的Stream 曾经的样子

 Stream<CustomerState> _mapGetCustomer() async* {
    try {
      final customer = await _customerRepository.getCustomer();
      yield state.getCustomerSuccess(customer);
    } catch (error, stackTrace) {
      ApiError.handleApiError(error, stackTrace);
    }
  }

这是我将其迁移到的位置:

  Future<void> _onGetCustomer(
      GetCustomer event, Emitter<CustomerState> emit) async {
    try {
      final customer = await _customerRepository.getCustomer();
      emit(state.getCustomerSuccess(customer));
    } catch (error, stackTrace) {
      ApiError.handleApiError(error, stackTrace);
    }
  }

我想现在在 Bloc 7.2 中如何称呼它?

 Future<void> _onUpdateNewsletter(UpdateNewsletter event, Emitter<CustomerState> emit) async {
    try {
     ...
     yield* _onGetCustomer; // How do I call this async future here?
      Toast.showSuccess(message: event.successMessage);
    } ...
}

【问题讨论】:

    标签: flutter dart bloc


    【解决方案1】:

    在新版本的 bloc 中,您不必编写流函数。您有一个名为 emit 的函数,并且可以从您所在区域的每个函数调用此函数并传递新状态。所以删除 yield* 并调用 _onGetCustomer 函数并从那里发出你的新状态。

    【讨论】:

    • 好的,但我必须写await _onGetCustomer 吗?因为它是Future&lt;void&gt;?
    • 是的。 await _onGetCustomer(? ,emit);。您必须确定? 的来源,我无法在您的代码中识别它。但你以前需要它,所以我确定它就在那里。
    • @Sunshine 如果你想 Toast.showSuccess 在状态改变后运行。是的,你必须等待。否则,没有await
    • @nvoigt 我不明白你的意思是我可以将事件作为参数传递?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多