Я столкнулся со странной проблемой, когда, если я получаю * от моего провайдера в моем приложении флаттера, остальная часть кода в функции не завершается.
Я использую шаблон BLoC, поэтому моя функция _mapEventToState выглядит следующим образом:
Stream<WizardState> _mapJoiningCongregationToState(
int identifier, int password) async* {
_subscription?.cancel();
_subscription= (_provider.doThings(
id: identifier, password: password))
.listen((progress) => {
dispatch(Event(
progressMessage: progress.progressText))
}, onError: (error){
print(error);
}, onDone: (){
print('done joiining');
});
}
Тогда в провайдере / сервисе ... это первая попытка.
final StreamController<Progress> _progressStream = StreamController<JoinCongregationProgress>();
@override
Stream<JoinCongregationProgress> doThings(
{int id, int password}) async* {
await Future.delayed(Duration(seconds:2));
_progressStream.add(JoinCongregationProgress(progressText: "kake1..."));
await Future.delayed(Duration(seconds:2));
_progressStream.add(JoinCongregationProgress(progressText: "kake5!!!..."));
yield* _progressStream.stream;
}
Оператор yield возвращается, но только через после обе ожидаемые функции завершены. Это имеет для меня полный смысл, очевидно, я бы не ожидал, что код завершится не по порядку и каким-то образом запустит yield *, прежде чем ждать завершения 'await's.
Для того, чтобы "подписаться" на продвижение этого сервиса, мне нужно вернуть поток обратно вызывающей стороне, написать обновления в пользовательском интерфейсе и т. Д. На мой взгляд, это так же просто, как перенести выход * до первого жду. Вот так.
final StreamController<Progress> _progressStream = StreamController<JoinCongregationProgress>();
@override
Stream<JoinCongregationProgress> doThings(
{int id, int password}) async* {
yield* _progressStream.stream;
await Future.delayed(Duration(seconds:2));
_progressStream.add(JoinCongregationProgress(progressText: "kake1..."));
await Future.delayed(Duration(seconds:2));
_progressStream.add(JoinCongregationProgress(progressText: "kake5!!!..."));
}
Но затем установка точек останова для последующих вызовов _progressStream.add показывает, что они никогда не будут вызываться. Я застрял на этом, есть идеи, что это может быть? Я знаю, что это как-то связано с тем, как я смешивал фьючерсы и потоки.