Генератор потока дротика / флаттера останавливается, когда нет абонента - PullRequest
0 голосов
/ 03 марта 2020

Я пробую функцию потока Дарт / Флаттер.

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

Я пытаюсь имитировать c asyn c данные, появляющиеся в потоке (что Future.delayed из 3 se c просто замедляет его), поэтому с помощью Stream.periodi c не делает не совсем урезать.

void main() {
  Stream<int> generateStream() async*{
    int _count = 0;
    while (true) {
      await Future.delayed(Duration(seconds: 3));
      print(_count);
      yield _count++;
    }
  }

  generateStream();
}

Заранее благодарен за любую помощь.

Майк

1 Ответ

2 голосов
/ 03 марта 2020

Вы можете использовать StreamController для публикации sh результатов в свойстве stream.

Имейте в виду, что обычные потоки принимают только одного подписчика за время жизни, и вам нужно broadcast StreamControllers, если вы планируете (повторную) подписку несколько раз.

Вот пример:

import 'dart:async';

void main() async {
  StreamController<int> ctrl = StreamController<int>.broadcast();
  Stream<int> stream = ctrl.stream;

  // a handle to manage the current subscription
  StreamSubscription<int> sub;

  for (int i = 0; i < 60; i++) {
    // wait for 0.2s
    await Future.delayed(Duration(milliseconds: 200));

    // add a value to the controller
    ctrl.add(i);

    if (i == 10) {
      // add listener
      sub = stream.listen(listener);
    }
    else if (i == 20) {
      // cancel sub after 4 seconds
      sub.cancel();
    }
    if (i == 30) {
      // resub after 6 seconds
      sub = stream.listen(listener);
    }
  }

  ctrl.close();
}


void listener(int value) {
  print(value);
}

Существуют также другие классы для аналогичных целей, например BehaviorSubject , PublishSUbject и ReplaySubject .

...