Как вызвать параллельный запрос в блоке Flutter Bloc - PullRequest
0 голосов
/ 05 августа 2020

Я использую BLoC в flutter.

Как только будет создан экземпляр BLo C, я хочу выполнить вызовы 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 голосов
/ 14 августа 2020

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
}
0 голосов
/ 05 августа 2020

На мой взгляд, одновременное выполнение двух вызовов API и ожидание результата мало связано с BLo C. Лучше, если каждое blo c -событие запускает определенный c набор действий, и события будут отделены друг от друга.

Дополнительно; Вместо того, чтобы вызывать событие внутри блока инициализации, лучше сделать это, когда вы инициализируете Blo c внутри провайдера. См. Пример;

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

Это генерирует событие сразу после инициализации Blo c.

...