Dart / Flutter: Ошибка «Поток уже прослушан».&& "ожидание" внутри fa "для цикла" завершается неудачно - PullRequest
0 голосов
/ 05 апреля 2019

да, хорошие люди,

Я, наверное, что-то здесь упускаю:

этот код вымышленный (это упрощение, для удобства всех), но дает идею:

_map.keys.forEach((key) async {
   _bloc.sink.add(_map[key]);
await for (String _string in _bloc.stream) {
  _newMap.putIfAbsent(key, ()=> _string);
 }
});

или

Stream.fromIterable(_map.keys).forEach((day) async {
    _bloc.sink.add(_map[key]);
await for (String _string in _bloc.stream) {
  _newMap.putIfAbsent(key, ()=> _string);
 }
});

с StreamController <...>. Broadcast ();потоки работоспособны:

first: _Future hashCode: 817453996 isBroadcast: true isEmpty: _Future last: _Future length: _Future runtimeType: Type (_BroadcastStream <...>) single: _Future _awaiter: null _generator: null _controller: _AsyncBroadcastStreamController

без возвращает эту ошибку:

first: необработанное исключение: \ nBad состояние: поток уже прослушан. [...] hashCode: 644468606 isBroadcast: false isEmpty: необработанное исключение: \ nBad состояние: поток уже прослушан. [...] last: необработанное исключение: \ nBad состояние: поток уже прослушан. [...] длина: необработанныйисключение: \ nBad состояние: поток уже прослушан. [...] runtimeType: Type (_ControllerStream <...>) single: необработанное исключение: \ nBad состояние: поток уже прослушан. [...]_awaiter: null _generator: null _controller: _AsyncStreamController

в обоих случаях не работает.

что я намеревался сделать (внутри цикла for) для отправкиd в приемнике коллекция,

, блок выполнит некоторую работу и вернет другую коллекцию в потоке,

, что я вижу из отладки, это то, что цикл просто продолжает посылать материал в приемник.

Я не уверен, что это потому, что:

...

1) цикл не ждет "ожидать "

" и вызывает ошибку "поток уже прослушивается"

2) и наоборот "ожидание" не может прослушиватьпоток из-за ошибки

(или из-за того, что трансляция может потерять событие), поэтому цикл продолжает цикл (?);

...

I 'еще больше склоняется к первому, но все должно работать в соответствии с этим POST

что я делаю не так?

заранее спасибо, Франческо

1 Ответ

1 голос
/ 05 апреля 2019

Похоже, вы звоните stream.listen более одного раза. Попробуйте назначить _bloc.stream переменной вне вашего цикла for.

var stream = _bloc.stream;


_map.keys.forEach((key) async {
  _bloc.sink.add(_map[key]);
await for (String _string in stream) {
 _newMap.putIfAbsent(key, ()=> _string);
}
});
...