从BlocBuilder导航到新屏幕

时间:2019-08-25 16:26:15

标签: flutter dart bloc

当我的集团处于特定状态时,我正在尝试导航到新页面。但是,现在无论何时我尝试执行此操作,都会出现以下错误:

I/flutter (25673): Another exception was thrown: setState() or markNeedsBuild() called during build.

在下面的代码中,我正在执行一些调度,在这里,我还要检查我的一个集团的当前状态是否是特定的,然后导航到新屏幕。

if (state is Finished) {
      startOver(timerBloc, counterBloc, spotifyBloc, context);
      return [];
    }

我的问题是;无论如何,是否可以从BlocBuilder导航到新屏幕?

我尝试过的方法: 我试图给出不同的上下文,将其传递下来,甚至将其放在自己的类中。

所有类都是无状态的。

可以在此pastebin中看到整个集团。

1 个答案:

答案 0 :(得分:1)

您应该避免在build语句中放置任何“动作” ...我将使用StatefulWidget并将这些动作放置在initState()中。但是,由于您正在使用Flutter Bloc软件包(felangel.github.io/bloc),因此可以使用BlocListener作为替代。

类似这样的东西:

class Actions extends StatelessWidget {
AudioPlayer audioPlayer = new AudioPlayer();

@override
Widget build(BuildContext context) {

   final TimerBloc timerBloc = BlocProvider.of<TimerBloc>(context);
   return BlocListener<TimerBloc, TimerState>(
     listener: (context, state) {

       if (state is Finished) {
           startOver(timerBloc, counterBloc, spotifyBloc, context);
       }

     },
     child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: _mapStateToActionButtons(
          timerBloc: BlocProvider.of<TimerBloc>(context),
          counterBloc: BlocProvider.of<CounterBloc>(context),
          spotifyBloc: BlocProvider.of<SpotifyBloc>(context),
          adBloc: BlocProvider.of<AdBloc>(context),
        ),
   );

}