Прослушивание только предстоящих событий - PullRequest
0 голосов
/ 06 июня 2019

Я хочу слушать поток, но я не хочу слушать только предыдущие события

Я пытался использовать пропуск после проверки длины потока, но почему-то это не работает

final skipCount =await CartBloc().state.length;

listenForSuccess = CartBloc().state.skip(skipCount).listen((var state) {
//Do Something
   listenForSuccess.cancel();
}

//CartBloc is a singleton so am not creating a new instance by calling //CartBloc()

1 Ответ

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

Если имеет смысл прослушивать только некоторые события потока, тогда этот поток должен быть широковещательным потоком .

Прослушивание широковещательного потока только предоставит новые события, которые отправляются после прослушивания. Это должно работать так, как вы хотите.

То есть: просто слушай, тебе не нужно ничего делать, чтобы пропустить предыдущие события, они уже отправлены, и они не ждут тебя.

Прослушивание потока с одной подпиской даст вам все события, которые обычно необходимы, потому что:

  1. Вы единственный, кто слушает этот поток, и

  2. События обычно представляют один объект данных, который был только что фрагментирован при асинхронном чтении.

Если ваш поток не действует как ни один из них, то это любопытный поток (не невозможный, но не тот, который вы можете создать, используя только библиотеку dart:async).

Поток asBroadcast потока с одной подпиской, скорее всего, буферизует события до первого прослушивания, а затем начинает действовать как широковещательный поток. Это может быть то, что вы имеете дело с здесь. В этом случае попытайтесь изменить код, чтобы он был правильным широковещательным потоком.

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

Выполнение .length в любом потоке будет ждать завершения всего потока . После этого больше не будет никаких событий, и если это не поток, который когда-либо закроется, вы будете ждать вечно. В широковещательном потоке это не будет блокировать любой другой код от прослушивания в том же потоке, но await гарантирует, что следующий код не произойдет до того, как поток будет завершен. В потоке с одной подпиской другой код не может прослушивать тот же поток после того, как вы вызвали .length, поэтому следующий код будет выдавать, если он когда-либо будет достигнут.

Итак, если поток является широковещательным, вам не нужно ничего делать. Поскольку я не вижу код для CardBloc, я не могу сказать, что это на самом деле. Давайте предположим, что это поток с одной подпиской. Затем необходимо изменить код в CardBloc, чтобы создать поток с использованием контроллера StreamController.broadcast(). Вы не можете создать поток трансляций, используя метод async*. Кроме того, вы можете преобразовать создание широковещательного потока из любого потока, выполнив:

var broadcastStream = stream.asBroadcastStream()..listen(null).cancel();

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

...