Ожидание некоторых результатов перед отправкой события с библиотекой flutter_bloc - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь создать BLOC, который зависит от двух других блоков, основанных на времени, и блока, не основанного на времени. Что я имею в виду, основываясь на времени, например, они подключают удаленный сервер, так что это занимает время. Это работает так:

Логин (конечно, это займет некоторое время)

Если вход в систему успешен

Выполните другой процесс (Это тоже требует времени. Возвращает будущее.)

После входа в систему и завершения другого процесса сообщите об этом странице.

Мой BLOC зависит от этих трех:

final UserBloc _userBloc;
final AnotherBloc _anotherBloc;
final FinishBloc _finishBloc;

Внутри события карты, чтобы указать метод, я должен отправить соответствующие события. Однако я не могу ждать, если они закончены.

_userBloc.dispatch(
  Login(),
);

_anotherBloc.dispatch(
  AnotherProcess(),
);

//LetThePageKnowIt should work after login and another process
_finishBloc.dispatch(
  LetThePageKnowIt(),
);

Есть ли чистый способ ждать некоторых других, прежде чем отправлять что-нибудь?

Точно знаю, я использую способ, который мне не нравится. В состоянии основного блока, к которому я подключаю другие блоки, у меня есть bools.

class CombinerState {
  bool isLoginFinished = false;
  bool isAnotherProcessFinished = false;

Я слушаю состояния блоков, зависящих от времени, в конструкторе основного блока. Когда они дают «я закончил», я просто отмечаю bools «true».

MainBloc(
  this._userBloc,
  this._anotherBloc,
  this._pageBloc,
); {
  _userBloc.state.listen(
    (state) {
      if (state.status == Status.finished) {
        dispatch(FinishLogin());
      }
    },
  );

  _anotherBloc.state.listen(
    (state) {
      if (state.status == AnotherStatus.finished) {
        dispatch(FinishAnotherProcess());
      }
    },
  );
}

и я отправляю еще одно событие для основного блока, чтобы проверить, все ли bool верны после установки bool в true.

else if (event is FinishAnotherProcess) {
  newState.isAnotherProcessFinished = true;

  yield newState;

  dispatch(CheckIfReady());
}

Если значения bool верны, я отправляю LetThePageKnowIt ()

else if (event is CheckIfReady) {
  if (currentState.isAnotherProcessFinished == true &&
      currentState.isLoginFinished == true) {
    _pageBloc.dispatch(LetThePageKnowIt());
  }
}

Я не удовлетворен этим кодом. Я ищу способ ждать, пока другие BLOC отправят состояние с "готово". После этого я хочу отправить свой LetThePageKnowIt ()

1 Ответ

1 голос
/ 27 мая 2019
Предложение

@ pskink решило мою проблему.

Я создал два метода, которые возвращают будущее. Внутри них я просто жду своих потоков. Вот пример потока входа в систему.

В состоянии события карты после отправлений я жду асинхронного метода.

_userBloc.dispatch(
  Login(),
);

_anotherBloc.dispatch(
  AnotherProcess(),
);

await loginProcess();
await otherProcess();

_finishBloc.dispatch(
  LetThePageKnowIt(),
);

Внутри метода я просто жду, когда userbloc завершит свою работу и выдает об этом. Затем вернитесь.

Future loginProcess() async {
  await for (var result in _userBloc.state) {
    if (result.status == Status.finished) {
      return;
    }
  }
}
...