在Flutter应用中,我使用Stream.periodic
构造函数创建了一个流(timeleft
,minutes
和seconds
变量在周围的上下文中定义):
_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实现计时器,请在下面查看我的答案。
答案 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);