Flutter 从BlocBuilder导航到新屏幕
当我的集团处于特定状态时,我试图导航到一个新页面。然而,现在当我尝试这样做时,我得到以下错误:Flutter 从BlocBuilder导航到新屏幕,flutter,dart,bloc,Flutter,Dart,Bloc,当我的集团处于特定状态时,我试图导航到一个新页面。然而,现在当我尝试这样做时,我得到以下错误: I/flatter(25673):引发了另一个异常:在生成过程中调用了setState()或markNeedsBuild()。 在下面的代码中,我正在做一些分派,这里我还检查我的一个bloc的当前状态是否是特定的,然后导航到一个新屏幕 if (state is Finished) { startOver(timerBloc, counterBloc, spotifyBloc, contex
I/flatter(25673):引发了另一个异常:在生成过程中调用了setState()或markNeedsBuild()。
在下面的代码中,我正在做一些分派,这里我还检查我的一个bloc的当前状态是否是特定的,然后导航到一个新屏幕
if (state is Finished) {
startOver(timerBloc, counterBloc, spotifyBloc, context);
return [];
}
我的问题是,;是否仍然可以从BlocBuilder导航到新屏幕
我所尝试的:
我试着给出不同的上下文,把它传下去,甚至在它自己的类中
所有类都是无状态的
从中可以看出整个集团。您应该避免在build语句中放置任何“操作”。。。我将使用StatefulWidget并将这些操作放在initState()中。但是,由于您使用的是FlatterBloc包(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),
),
);
类操作扩展了无状态小部件{
AudioPlayer=新的AudioPlayer();
@凌驾
小部件构建(构建上下文){
final TimerBloc TimerBloc=BlocProvider.of(上下文);
返回BlocListener(
侦听器:(上下文、状态){
如果(状态已完成){
startOver(timerBloc、counterBloc、spotifyBloc、context);
}
},
孩子:排(
mainAxisAlignment:mainAxisAlignment.space,
子项:\映射状态到操作按钮(
timerBloc:BlocProvider.of(上下文),
反集团:提供(上下文)的集团,
spotifyBloc:BlocProvider.of(上下文),
adBloc:BlocProvider.of(上下文),
),
);
}嗨,托尔,你是在使用来自的Flitter Bloc软件包吗?是的,我是!我完全忘了提这个!@DigitalJoni我应该把这个监听器放在哪里?啊,这很有道理,我会重构来做这件事,而不是像以前那样做。谢谢。