状态与BlocListener颤振之间的时序问题

时间:2020-04-10 08:53:33

标签: flutter bloc

我正在使用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());
                            });
                          },
                        ),

1 个答案:

答案 0 :(得分:0)

尝试添加

@override
  Stream<Transition<ComplexEvent, ComplexState>> transformEvents(
    Stream<ComplexEvent> events,
    TransitionFunction<ComplexEvent, ComplexState> transitionFn,
  ) {
    return events.switchMap(transitionFn);
  }

到您的Bloc类。它将仅执行最新事件,并丢弃所有先前事件。您可以使用https://rxmarbles.com/帮助您了解rx概念。