让StreamBuilder处理在首次调用BloC时未实例化的流

时间:2019-02-05 00:24:14

标签: dart flutter rxdart bloc

我正在尝试将飞镖“ quiver”库中的倒数计时器添加到StreamBuilder小部件中。我正在使用BLoC模式来管理状态。

通过点击我的查看屏幕上的按钮,可以激活查看屏幕上的倒数计时器。这会在我的集团中实例化一个新的CountdownTimer。视图层具有一个StreamBuilder小部件,用于监听CountdownTimer流。但是,在第一次运行之后,第二次实例化CountdownTimer时,该时间不会显示在视图屏幕上。我尝试了几种选择:

  1. 在实例化的CountdownTimer上使用“侦听”方法将事件添加到StreamBuilder侦听的正在进行的流中。

  2. 使包含StreamBuilder的窗口小部件成为有状态的窗口小部件,并在每次启动新计时器时调用setState,以便StreamBuilder创建新的订阅。

  3. 将实例化的CountdownTimer从整个组中放入StreamBuilder所预订的第二个流中;但是,管道在完成时会调用close(),并且后续计时器不会显示。

通常,最好的做法是让StreamBuilder处理在首次调用bloc时未实例化的多个流(即,在加载视图并存在用户输入后,流变为活动状态)。将新的流与开放的流合并似乎是一种选择,但是随后创建了一个新的流,而我一直无法找出一种方法来让StreamBuilder收听新的流。 >

示例:

BLoC:

class TimerBloc {

  CountdownTimer countdownTimer =
    CountdownTimer(Duration(seconds: 0), Duration(seconds: 1));

  PublishSubject<CountdownTimer> timerStream = PublishSubject<CountdownTimer>();

  Duration get userSetTime {
    if (sliderTime.value == null) {
      return Duration(seconds: 25);
    }

    return Duration(seconds: int.parse(sliderTime.value.round().toString()));
  }

  start() {
    if (countdownTimer.isRunning) {
      countdownTimer.cancel();
    }

    countdownTimer = CountdownTimer(userSetTime, Duration(seconds: 1));

    countdownTimer.listen((tickEvent) {
      timerStream.sink.add(tickEvent);
    });
  }

显示窗口小部件:

Widget _buildDisplay(bloc) {
    return StreamBuilder(
      stream: bloc.timerStream.stream,
      builder: (context, AsyncSnapshot<CountdownTimer> snapshot) {
        if (snapshot.hasData) {
          int info = snapshot.data.remaining.inSeconds; [...]

0 个答案:

没有答案