我正在使用flutter_bloc
,并且在我的MapScreen
抽屉中有一个按钮,该按钮导航到AlarmsScreen
并将Event
发送到集团,以便{{1 }}收到AlarmsScreen
,其中包含在其State
中构建UI所需的数据。
我注意到,并非总是BlocListener
会根据AlarmsScreen
在侦听器中传递的数据进行相应的构建,经过几次尝试后,我注意到如果按下按钮的时间会稍长一点(加载栏会出现在按钮?)比State
总是正确绘制。这意味着,随着Bloc在BLocListener中的打印确认,有时屏幕会在流AlarmsScreen
之后加载,而State
尚未捕获,因为它尚未初始化。为确保我添加了一个延迟200毫秒的计时器来发送事件,现在它永不失败。
计时器只是一种解决方法,但是有没有办法在屏幕加载时读取由bloc流式传输的最新状态? 。
一如既往,非常感谢您的时间和帮助。
这是按钮:
BlocListener
这是屏幕:
FlatButton.icon(
icon: Image.asset(
'assets/schedulerButton.png',
height: 55,
width: 55,
),
label: Text(
'Check scheduler',
style: TextStyle(
color: Colors.white,
fontSize: 18,
fontWeight: FontWeight.w400),
),
color: Colors.transparent,
onPressed: () {
// TODO call LoadAlarms and navigate to SchedulerScreen
print('pressed');
cache.play('tableViewOpen.mp3');
BlocProvider.of<SchedulerBloc>(context)
.add(LoadAlarms());
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => BlocProvider.value(
value: BlocProvider.of<SchedulerBloc>(
context),
child: SchedulerScreen(
widget.key, widget.user),
)),
);
Timer(Duration(milliseconds: 200), () {
BlocProvider.of<SchedulerBloc>(context)
.add(LoadAlarms());
});
},
),
答案 0 :(得分:0)
尝试添加
@override
Stream<Transition<ComplexEvent, ComplexState>> transformEvents(
Stream<ComplexEvent> events,
TransitionFunction<ComplexEvent, ComplexState> transitionFn,
) {
return events.switchMap(transitionFn);
}
到您的Bloc类。它将仅执行最新事件,并丢弃所有先前事件。您可以使用https://rxmarbles.com/帮助您了解rx概念。