Flutter 如何在导航到路线之前进行验证?
我有两页,Flutter 如何在导航到路线之前进行验证?,flutter,Flutter,我有两页,page1和page2。我想验证当应用程序打开且没有令牌或它为false时,它是否重定向到page1,否则它将重定向到page2,当我有更多页面时,我希望如果有有效令牌,继续正常的导航流程,我正在尝试此操作,我遇到以下问题: 在gif中,令牌没有定义,验证显然做得很好,但问题是它继续重新加载当前视图,我正在寻找一些更优化的方法,以避免在不满足某些条件时加载路由 我怎样才能解决这个问题 Map<String, WidgetBuilder> getRoutes() { r
page1
和page2
。我想验证当应用程序打开且没有令牌或它为false时,它是否重定向到page1
,否则它将重定向到page2
,当我有更多页面时,我希望如果有有效令牌,继续正常的导航流程,我正在尝试此操作,我遇到以下问题:
在gif中,令牌没有定义,验证显然做得很好,但问题是它继续重新加载当前视图,我正在寻找一些更优化的方法,以避免在不满足某些条件时加载路由
我怎样才能解决这个问题
Map<String, WidgetBuilder> getRoutes() {
return <String, WidgetBuilder>{
'/': (BuildContext context) =>
checkNavigation("/", pag1(), context),
'page1': (BuildContext context) =>
checkNavigation("page1", page1(), context),
'page2': (BuildContext context) =>
checkNavigation("/page2", page2(), context)
};
}
dynamic checkNavigation(
String page, dynamic pageContext, BuildContext context) {
if (storage.token && page == "/") {
//Navigator.pushNamedAndRemoveUntil(context, 'page2', (_) => false);
return page2();
} else if (storage.token == false) {
//Navigator.pushNamedAndRemoveUntil(context, 'page1', (_) => false);
return page1();
} else {
return pageContext;
}
}
in my main:
.
.
.
MaterialApp(
title: 'route validation',
initialRoute: '/',
routes: getRoutes(),
Map getRoutes(){
返回{
“/”:(构建上下文)=>
检查导航(“/”,第1页(),上下文),
“page1”:(构建上下文)=>
检查导航(“page1”,page1(),上下文),
“第2页”:(构建上下文)=>
检查导航(“/page2”,page2(),上下文)
};
}
动态检查导航(
字符串页面、动态页面上下文、构建上下文){
如果(storage.token&&page==“/”){
//Navigator.pushName和removeUntil(上下文“page2”,()=>false);
返回第2页();
}else if(storage.token==false){
//Navigator.pushName和removeUntil(上下文“page1”,()=>false);
返回page1();
}否则{
返回页面上下文;
}
}
在我看来:
.
.
.
材料聚丙烯(
标题:“路线验证”,
initialRoute:“/”,
路由:getRoutes(),
最好在您自己的抽象中控制此行为,并仅在必要时更改路由
我建议在根路由上添加一些初始屏幕,并在令牌初始化后导航到适当的路由
Future asyncint(){/*…*/}
void initState(){
/* ... */
asyncint()。然后(((u)=>/*推送适当的第一条路由*/);
}
映射getRoutes(){
返回{
“/”:(BuildContext上下文)=>SplashScreen(),
/*其他路线*/
};
}
如果您需要截获其他导航事件,您可以添加自己的代理类,这可以使用包轻松实现
类MyNavigator{
最后的环球航行;
MyNavigator(this.navigatorKey);
(BuildContext context)=>context.read()的静态MyNavigator;
未来(
构建上下文上下文,
字符串routeName{
对象参数,
}) {
//在此处添加任何附加逻辑和条件
返回navigatorKey.currentState.pushNamed(routeName,arguments:arguments);
}
//添加您需要的任何其他方法
}
//在Widgets/Material/CupertinoApp小部件上方的小部件树顶部的某处。
最终GlobalKey navigatorKey=GlobalKey();
//在navigator上方添加具有navigator键的提供程序
提供者(
创建:()=>MyNavigator(navigatorKey),
子项:MaterialApp(navigatorKey:navigatorKey,/*…*/)
)
//使用它
MyNavigator.of(context.pushNamed)(…)
现在有很多工作要做,用Router和Pages API实现Navigator 2.0,这将为您提供更多的路由控制和灵活性
跟踪问题:
当前稳定版本中已经提供了,但目前没有足够的文档和示例。您可以发布一个最小的可复制代码吗?storage.token设置在哪里?您确定它包含您期望的值吗?另外,在代码片段中,您引用了pag1()而不是page1()所以我假设您发布的代码实际上不是您正在运行的代码?