Flutter 如何在颤振群中调用并行请求

Flutter 如何在颤振群中调用并行请求,flutter,bloc,flutter-bloc,Flutter,Bloc,Flutter Bloc,我在flatter中使用BLoC 一旦创建了BLoC实例,我就要调用API。为了实现这一点,我在构造函数中添加了以下代码 class MyBloc extends Bloc<MyBlocEvent, MyBlocState> { MyBloc() { _repository = MyAccountRepository(); _myAccountList = List(); add(API1CallEevent());

我在
flatter
中使用
BLoC

一旦创建了BLoC实例,我就要调用API。为了实现这一点,我在构造函数中添加了以下代码

 class MyBloc extends Bloc<MyBlocEvent, MyBlocState> {

    MyBloc() {
        _repository = MyAccountRepository();
        _myAccountList = List();
        add(API1CallEevent());
        add(API2CallEevent());
      }
...  
类MyBloc扩展了Bloc{
MyBloc(){
_repository=MyAccountRepository();
_myAccountList=List();
添加(api1callevent());
添加(api2callevent());
}
...  
以及事件处理部分

...  
     @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();
       ----
       ---
        }
    
    }
。。。
@凌驾
流mapEventToState(MyBloceEvent事件)异步*{
if(事件为API1CallEevent){
var ap1=
wait_repository.getAPI1();
----
----
}else if(事件为API2CallEevent){
api2变种=
wait_repository.getAPI2();
----
---
}
}
我面临的问题是API调用不是并行执行的,这意味着在
API1CallEvent
完成后,
API2CallEvent
执行…


有什么方法可以并行执行吗?

在我看来,并行执行两个API调用并同时期望结果与BLoC没有多大关系。
如果每个bloc事件触发一组特定的操作,并且事件彼此解耦,则效果更好

另外;
与其在init块内引发事件,不如在提供程序内初始化Bloc

BlocProvider<AuthBloc>(
  lazy: false,
  create: (context) => AuthBloc(
    userRepository: _userRepository,
    )..add(AppStartedEvent()),
  ),
BlocProvider(
懒惰:错,
创建:(上下文)=>AuthBloc(
userRepository:\u userRepository,
)…添加(AppStartedEvent()),
),

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

在我看来,并行执行两个API调用并同时期望结果与Bloc没有多大关系。
如果每个bloc事件触发一组特定的操作,并且事件彼此解耦,则效果更好

另外;
与其在init块内引发事件,不如在提供程序内初始化Bloc

BlocProvider<AuthBloc>(
  lazy: false,
  create: (context) => AuthBloc(
    userRepository: _userRepository,
    )..add(AppStartedEvent()),
  ),
BlocProvider(
懒惰:错,
创建:(上下文)=>AuthBloc(
userRepository:\u userRepository,
)…添加(AppStartedEvent()),
),
这会在Bloc初始化后立即生成一个事件。

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

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

@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
}
@覆盖
流mapEventToState(MyBloceEvent事件)异步*{
如果(事件被称为ApisEvent){
最终结果=等待未来。等待([
_repository.getAPI1(),
_repository.getAPI2()
]);
//对结果做点什么
产量apiswavebeencalledstate();
}
//更多事件处理
}
A基本上是一个状态机。它不执行并行操作,这不是它构建的目的。它是从一个状态依次进入另一个状态。在这样做时,它可以在内部并行操作,但它不能(或不应该)并行接收输入

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

@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
}
@覆盖
流mapEventToState(MyBloceEvent事件)异步*{
如果(事件被称为ApisEvent){
最终结果=等待未来。等待([
_repository.getAPI1(),
_repository.getAPI2()
]);
//对结果做点什么
产量apiswavebeencalledstate();
}
//更多事件处理
}

。我还对..为什么需要将存储库实例..传递给bloc构造函数而不是在bloc中创建..感到困惑..我在许多地方看到了这些类型的示例..不理解..为什么需要这样做。实际上,您不必通过提供程序传递存储库,但如果有必要,您可以这样做。例如,当您想要初始化时在
main
中初始化存储库,然后将其传递给相关的BLoC其他示例,当您只想在
main
中初始化存储库一次,然后使其在多个BLoC中可用时。感谢您获得了它…我们在BLoC中是否可以调用并行调用…在我的情况下,每个事件都有特定的用例..这是创建BLoC后我想要做的。不幸的是y我没有关于并行进行API调用的答案。但正如我在回答中所说的,我认为它与BLoC无关…我还对…为什么存储库实例…需要传递给BLoC构造函数而不是在BLoC中创建..我在很多地方看到了这些类型的示例..不理解..为什么需要它。实际上,您不必通过提供者传递存储库,但如果有必要,您可以这样做。例如,当您想在
main
中初始化存储库,然后将其传递给相关的bloc其他示例时,当您想在
main
中只初始化存储库一次,然后使其在多个bloc中可用时。谢谢您得到了它…我们有什么叫pa的吗在我的例子中,每个事件都有特定的用例。一旦创建了BLoC,我就想这样做。不幸的是,我没有关于并行进行API调用的答案。但是正如我在回答中所说的,我认为它与BLoC无关。