我正在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
将被执行...
有什么办法可以并行进行吗?
答案 0 :(得分:0)
我认为,并行执行两个API并同时预期结果与BLoC无关。
最好是每个bloc-event触发一组特定的动作,并且事件彼此分离。
另外;
最好在提供程序内部初始化Bloc时执行此操作,而不是在init块中引发事件。参见示例;
BlocProvider<AuthBloc>(
lazy: false,
create: (context) => AuthBloc(
userRepository: _userRepository,
)..add(AppStartedEvent()),
),
这会在Bloc初始化后立即生成一个事件。
答案 1 :(得分:0)
bloc基本上是状态机。它不执行并行处理,这不是它的基础。它是从一种状态依次进入另一种状态。这样,它可以在内部进行并行操作,但不能(或不应)并行进行输入。
如果您希望一个事件并行执行多个等待的操作,则可以执行以下操作:
@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
}