Дарт `asyncExpand` не работает, как ожидалось - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь создать следующий поток baz, который состоит из "внешнего" потока, где каждое из событий этого потока также имеет "внутренний" поток.

Для каждого события X во внешнем потоке все события во внутреннем потоке для X должны быть добавлены к baz.

class Foo {
  final StreamController<int> bar = StreamController();

  Foo() {
    getsAnOuterStream.listen((event) {
      bar.addStream(getsAnInnerStream(event));
    });
  }

  Stream<int> get baz => bar.stream;
}

Приведенный выше код работает как задумано. Однако я понял, что могу просто добиться этого, используя вместо этого asyncExpand метод .

class Foo {
  final Stream<int> baz = getsAnOuterStream
    .asyncExpand((event) => getsAnInnerStream(event));
}

Это не работает - при изменении внешнего потока события нового внутреннего потока не добавляются в baz. Есть ли какая-то тонкость, которую я здесь скучаю? Любая помощь очень ценится!

Просто чтобы отметить ... Я думаю, что проблема может быть связана с этим: если внутренний поток продолжается вечно, baz никогда не перейдет к событиям из следующего внутреннего потока. Однако, если это проблема, почему работает верхнее решение?

1 Ответ

1 голос
/ 13 июня 2019

Причина, по которой верхний код работает, а нижний код не работает, заключается в разнице в реализациях StreamController.addStream() ( документация ) и Stream.asyncExpand().

addStream прослушивает события потока getsAnInnerStream(event) и просто перенаправляет их на bar, тогда как asyncExpand ожидает окончания потока getsAnInnerStream(event), прежде чем перейти к следующему event.

Это означает, что ваш код не будет работать так, как вы ожидаете, если внутренние потоки открыты в течение длительного времени (или неопределенно).

...