Flutter 使用BLoC的颤振导航:用于从导航器推送路线的上下文必须是导航器小部件的后代

Flutter 使用BLoC的颤振导航:用于从导航器推送路线的上下文必须是导航器小部件的后代,flutter,navigation,bloc,Flutter,Navigation,Bloc,我使用的是BLoC,我需要从第一页导航到第二页,并能够使用后退按钮返回,我不知道这是否是处理此问题的正确方法。 调用函数_navigateToPage2时,我也遇到了一个错误 用于从导航器推送或弹出路由的上下文必须是导航器小部件的后代小部件的上下文 类SimpleBlocDelegate扩展了BlocDelegate{ @凌驾 无效转换(转换){ 印刷(过渡); } @凌驾 void onError(对象错误,StackTrace StackTrace){ 打印(错误); } } void ma

我使用的是BLoC,我需要从第一页导航到第二页,并能够使用后退按钮返回,我不知道这是否是处理此问题的正确方法。 调用函数_navigateToPage2时,我也遇到了一个错误

用于从导航器推送或弹出路由的上下文必须是导航器小部件的后代小部件的上下文

类SimpleBlocDelegate扩展了BlocDelegate{
@凌驾
无效转换(转换){
印刷(过渡);
}
@凌驾
void onError(对象错误,StackTrace StackTrace){
打印(错误);
}
}
void main(){
BlocSupervisor().delegate=SimpleBlocDelegate();
runApp(MyApp(userRepository:userRepository(GuriApi())));
}
类MyApp扩展了StatefulWidget{
最终用户存储库用户存储库;
MyApp({Key Key,@required this.userRepository}):超级(Key:Key);
@凌驾
State createState()=>\u MyAppState();
}
类MyAppState扩展了状态{
AuthenticationBloc\u AuthenticationBloc;
UserRepository get\u UserRepository=>widget.UserRepository;
@凌驾
void initState(){
_authenticationBloc=authenticationBloc(userRepository:\u userRepository);
_authenticationBloc.dispatch(AppStarted());
super.initState();
}
@凌驾
无效处置(){
_authenticationBloc.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回BlocProvider(
bloc:_authenticationBloc,
孩子:MaterialApp(
主题:新主题数据(
恒天然家族:“Monserrat”,
原色:颜色。浅蓝色[50],
颜色:颜色。白色),
主页:BlocBuilder(
bloc:_authenticationBloc,
生成器:(BuildContext上下文,AuthenticationState){
如果(状态为AuthenticationUninitialized){
返回第页();
}
如果(状态为AuthenticationAuthenticated){
返回主页(userRepository:\u userRepository);
}
如果(状态为AuthenticationUnauthenticated){
返回登录页面(userRepository:\u userRepository);
}
如果(状态为AuthenticationLoading){
返回LoadingIndicator();
}
如果(状态为PageOneSelected){
返回PageOne();
}
如果(状态为PageTwoSelected){
_导航到第2页();
}
},
),
),
);
}
_导航到第2页(){
导航器.of(上下文).push(
材料路线(
生成器:(BuildContext上下文)=>
第二页(userRepository:_userRepository));
}
}

我认为最好通过订阅initState中的bloc state更改来处理导航:

@override
void initState() {
    super.initState();

    bloc.state.listen((state) {
        if (state is PageOneSelected) {
            _navigateToPage2();
        } else if (state is PageTwoSelected) {
            _navigateToPage2();
        }
    });
}

在构建方法中显示一些其他小部件。代码中出现错误,因为blocBuilder必须返回小部件,但在PageTwoSelected状态下,您不返回任何内容

有必要在小部件中执行以下操作:

     if (state is PageTwoSelected) {
         WidgetsBinding.instance.addPostFrameCallback((_){
            Navigator.push(context, 
              MaterialPageRoute(builder: (context) =>
                PageTwo(userRepository: _userRepository))
            );
         });
     }
这是必要的,因为如果导航发生在小部件仍在构建时(处于脏状态),flifter将抛出异常

通过将它嵌套在addPostFrameCallback的回调中,基本上就是说当小部件构建完成时,执行导航代码


您可以阅读更多信息,评论中有解释。

先生,您刚刚救了我的命。我在互联网上到处寻找答案。谢谢你让这个社区变得更好