定期流不发送数据

时间:2019-01-10 02:53:23

标签: dart flutter

在Flutter应用中,我使用Stream.periodic构造函数创建了一个流(timeleftminutesseconds变量在周围的上下文中定义):

_countdown = Stream.periodic(
    Duration(seconds: timeLeft),
    (count) {
        var value = '$minutes : $seconds';
        if (seconds-- == 0) {
            seconds = 59;
            --minutes;
        }
        return value;
    },
);

然后我有一个StreamBuilder会使用流:

StreamBuilder<String>(
    stream: _countdown,
    builder: (context, snapshot) {
      String message;
      if (snapshot.connectionState == ConnectionState.done) {
        message = 'Finito!';
      } else {
        message = snapshot.data;
      }

      if(snapshot.hasError)
        message = '${snapshot.error}';

      return Text(
        message ?? 'HOLD',
        style: DefaultTextStyle.of(context)
            .style
            .apply(fontSizeFactor: 3.0),
      );
    },
),

运行应用程序时,我只会在屏幕上看到HOLD,就像snapshot.data变量为null一样。在调试应用程序时,永远不会调用传递给Stream.periodic构造函数的函数。我还验证了timeleft变量大于0。它实际上是360,因此流应该每秒发送一个新值并显示它。

为什么没有值通过流?

编辑:我接受了diegodeveloper的回答,因为那是正确的。如果您想看看我最终如何用RxDart实现计时器,请在下面查看我的答案。

2 个答案:

答案 0 :(得分:1)

如果您查看Stream.periodic的文档,则会发现:

  

创建一个流,该流以[周期]间隔重复发出事件。

因此,如果您使用360秒作为间隔,则每次更改都必须等待360秒。

timeLeft更改为1(每秒发出值),更改逻辑,它应该可以工作。

Stream.periodic(
    Duration(seconds: 1),

答案 1 :(得分:0)

为了使计时器在某个时间停止,我最终不得不使用RxDart和Observables。这是我的解决方案,它创建一个流,该流每1秒发出一个值,并在给定的时间长度后停止。

_countdown = Observable.repeat((count) {
    var value = '${hours}h : ${minutes}m : ${seconds}s';

    if (--seconds < 0) {
      seconds = 59;
      --minutes;
    }

    if (minutes < 0) {
      if (hours > 0) {
        minutes = 59;
        --hours;
      } else {
        minutes = 0;
      }
    }

    if (count == 0)
      return Observable.just(value);
    else
      return Observable.timer(value, Duration(seconds: 1));
}, timeLeft + 2);