【问题标题】:How to call parallel request in flutter Bloc如何在flutter Bloc中调用并行请求
【发布时间】:2020-11-25 19:25:09
【问题描述】:

我在flutter 中使用BLoC

一旦创建了 BLoC 实例,我就想进行 API 调用。为此,我在构造函数中添加了以下代码。

 class MyBloc extends Bloc<MyBlocEvent, MyBlocState> {

    MyBloc() {
        _repository = MyAccountRepository();
        _myAccountList = List();
        add(API1CallEevent());
        add(API2CallEevent());
      }
...  

和事件处理部分

...  
     @override
      Stream<MyBlocState> mapEventToState(MyBlocEvent event) async* {
        if (event is API1CallEevent) {
    
       var ap1 =
              await _repository.getAPI1();
         ----
         ----
        }else if (event is API2CallEevent) {
    
      var api2 =
              await _repository.getAPI2();
       ----
       ---
        }
    
    }

我面临的问题是API调用没有并行执行,这意味着在API1CallEvent完成之后API2CallEvent被执行......

有什么方法可以同时做到这一点吗?

【问题讨论】:

    标签: flutter bloc flutter-bloc


    【解决方案1】:

    基本上是一个状态机。它不做并行性,这不是它的目的。它按顺序从一种状态进入另一种状态。在这样做时,它可以在内部并行执行操作,但它不能(或不应该)并行接受输入。

    如果您希望一个事件并行执行多个等待操作,您可以这样做:

    @override
    Stream<MyBlocState> mapEventToState(MyBlocEvent event) async* {
        if (event is CallTheAPIsEvent) {
            final results = await Future.wait([
               _repository.getAPI1(),
               _repository.getAPI2()
            ]);
    
            // do something with the results 
    
            yield ApisHaveBeenCalledState();
        }
    
        // more event handling
    }
    

    【讨论】:

      【解决方案2】:

      在我看来,并行执行两个 API 调用并同时期望结果与 BLoC 没有太大关系。
      如果每个 bloc-event 触发一组特定的操作,并且事件相互解耦,那就更好了。

      另外;
      与其在 init 块中引发事件,不如在提供程序中初始化 Bloc 时这样做。见例子;

      BlocProvider<AuthBloc>(
        lazy: false,
        create: (context) => AuthBloc(
          userRepository: _userRepository,
          )..add(AppStartedEvent()),
        ),
      

      这会在 Bloc 初始化后立即生成一个事件。

      【讨论】:

      • ..我也很困惑..为什么存储库实例..需要传递给 bloc 构造函数而不是在 bloc 中创建..我在很多地方都看到了这些类型的例子..不明白..为什么需要这样。
      • 实际上,您不必通过提供者传递存储库,但如果有必要,您会这样做。例如,当您想在main 中初始化存储库,然后将其传递给相关的 BLoC
      • 另一个示例,当您只想在 main 中初始化存储库一次,然后使其可用于多个 BLoC。
      • 谢谢……有没有我们可以在 BLoC 中调用并行调用……在我的情况下,每个事件都有特定的用例……我想在 BLoC 创建后执行。跨度>
      • 不幸的是,我没有关于并行调用 API 的答案。但正如我在回答中所说,我认为这与 BLoC 无关。
      猜你喜欢
      • 2020-05-03
      • 2021-01-14
      • 2020-11-12
      • 2019-10-31
      • 1970-01-01
      • 2021-06-17
      • 2020-08-17
      • 2020-03-27
      • 2023-03-30
      相关资源
      最近更新 更多