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()所以我假设您发布的代码实际上不是您正在运行的代码?