我正在尝试将飞镖“ quiver”库中的倒数计时器添加到StreamBuilder
小部件中。我正在使用BLoC模式来管理状态。
通过点击我的查看屏幕上的按钮,可以激活查看屏幕上的倒数计时器。这会在我的集团中实例化一个新的CountdownTimer
。视图层具有一个StreamBuilder
小部件,用于监听CountdownTimer
流。但是,在第一次运行之后,第二次实例化CountdownTimer
时,该时间不会显示在视图屏幕上。我尝试了几种选择:
在实例化的CountdownTimer上使用“侦听”方法将事件添加到StreamBuilder侦听的正在进行的流中。
使包含StreamBuilder的窗口小部件成为有状态的窗口小部件,并在每次启动新计时器时调用setState,以便StreamBuilder创建新的订阅。
将实例化的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; [...]