我的应用程序上有一个主屏幕/主屏幕,用户通过身份验证后就会显示该屏幕,我没有在MaterialApp类的routes参数上包括此屏幕,因为它在调用之前就已初始化,并导致许多错误:
home: WelcomeScreen(),
initialRoute: "/splash",
routes: <String, WidgetBuilder>{
"/welcome": (_) => WelcomeScreen(),
"/splash": (_) => SplashScreen(),
//"/main":(_)=>Main(),
});
这就是我打开主屏幕的方式:
Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(
builder: (context)=>Main()), (Route<dynamic> route) => false);
现在我有一个屏幕,我需要在其中弹出堆栈,直到完成一个过程的主屏幕为止,但是由于主屏幕未添加到routes
中,因此我无法使用
Navigator.popUntil(context, ModalRoute.withName("home screen here"));
是否只有在初始化时才将主屏幕添加到路由中?
更新: 我试图像这样调用主屏幕
Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(
builder: (context)=>Main(),settings: RouteSettings(name: "/home")), (Route<dynamic> route) => false);
但是使用此方法时,我遇到了Could not find a generator for route
异常:
Navigator.of(context).pushNamedAndRemoveUntil("/home", ModalRoute.withName("/home"));
答案 0 :(得分:1)
很难说出这是怎么回事。
将"/main"
添加到命名路由列表中不会造成任何问题,因为routes
仅包含WidgetBuilder
,这意味着直到您按下Main
构造函数"/main"
,并且应该没有初始化问题。不确定是什么原因导致您的问题,错误消息会有所帮助。
从您的命名路由中删除斜线可能是一个好主意,因为斜线表示存在名为"/"
的路由,该路由是"welcome"
,"splash"
和"main"
。我认为您真正想要的是三个顶级路线:
<String, WidgetBuilder>{
"welcome": (_) => WelcomeScreen(),
"splash": (_) => SplashScreen(),
"main":(_) => Main(),
}
我发现的另一个问题是,您将/main
添加到命名路由列表中,但是最后您要推送/home
。也许是错字?