如何在Flutter Bloc中调用并行请求

时间:2020-08-05 15:13:13

标签: flutter bloc flutter-bloc

我正在BLoC中使用flutter

一旦创建了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将被执行...

有什么办法可以并行进行吗?

2 个答案:

答案 0 :(得分:0)

我认为,并行执行两个API并同时预期结果与BLoC无关。
最好是每个bloc-event触发一组特定的动作,并且事件彼此分离。

另外;
最好在提供程序内部初始化Bloc时执行此操作,而不是在init块中引发事件。参见示例;

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

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

答案 1 :(得分:0)

基本上是状态机。它不执行并行处理,这不是它的基础。它是从一种状态依次进入另一种状态。这样,它可以在内部进行并行操作,但不能(或不应)并行进行输入。

如果您希望一个事件并行执行多个等待的操作,则可以执行以下操作:

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