Flutter 是否可以将中间件添加到颤振导航器?

Flutter 是否可以将中间件添加到颤振导航器?,flutter,firebase-authentication,Flutter,Firebase Authentication,我有以下检查,如果我有一个经过身份验证的Firebase用户 if(await FirebaseAuth.instance.currentUser() == null) Navigator.pushNamed(context, TheRegisterPage.routeName); else Navigator.pushNamed(context, TheGroupManagementPage.routeName); 我希望在每次调用导航器导航到新路线时执行此检查。我是否可以使用中间件

我有以下检查,如果我有一个经过身份验证的Firebase用户

if(await FirebaseAuth.instance.currentUser() == null)
  Navigator.pushNamed(context, TheRegisterPage.routeName);
else
  Navigator.pushNamed(context, TheGroupManagementPage.routeName);
我希望在每次调用导航器导航到新路线时执行此检查。我是否可以使用中间件或其他方法来实现这一点


我确实在中找到了RouteObserver类,但我注意到它的didPush()不是异步的,因此在推送路由之前,我无法异步检查是否有经过身份验证的用户。我不喜欢为每条路线写支票,因为它们都是一样的。那么,有没有一种方法可以用颤振导航器实现某种异步中间件呢?

这里是一个应用程序的示例实现,你可以在
Navigator
的包装器中运行,你可以使用它有条件地推送,也就是说,检查导航到某个页面或其他页面所需的任何身份验证确认,取决于身份验证状态

请注意,
FirstRoute
AuthNavigator
的子项。将
AuthNavigator
的构造函数中的条件更改为false,您将看到不同的导航。这里的关键是
pushConditionally
方法,以及从
context
中的(BuildContext)方法的静态
访问它的能力

您可以执行所有的条件检查
async
,只需根据您的特定需要替换my
someCondition

导入“包装:颤振/材料.省道”;
void main(){
runApp(
材料聚丙烯(
标题:“导航基础”,
主页:AuthNavigator(
某些条件:是的,
子级:FirstRoute(),
),
),
);
}
类FirstRoute扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“第一条路线”),
),
正文:中(
孩子:升起按钮(
子项:文本(“开放路线”),
已按下:(){
AuthNavigator.of(context).pushConditionaly(
上下文
MaterialPartnerRoute(生成器:(上下文)=>SecondRoute()),
);
},
),
),
);
}
}
类SecondRoute扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“第二条路线”),
),
正文:中(
孩子:升起按钮(
已按下:(){
Navigator.pop(上下文);
},
child:Text('Go back!'),
),
),
);
}
}
类ThirdRoute扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
背景颜色:Colors.red,
标题:文本(“第三条路线”),
),
正文:中(
孩子:升起按钮(
已按下:(){
Navigator.pop(上下文);
},
child:Text('Go back!'),
),
),
);
}
}
类AuthNavigator扩展StatefulWidget{
常量AuthNavigator(
{@required this.child,@required this.someCondition,Key})
:super(key:key);
最后一个孩子;
最终布尔条件;
静态_authorNavigatorStateof(BuildContext上下文)=>
context.findAncestorStateOfType();
@凌驾
_AuthNavigatorState createState()=>\u AuthNavigatorState();
}
类_authorNavigatorState扩展状态{
未来有条件地(
BuildContext上下文,路由)=>
widget.someCondition
?Navigator.push(
上下文
MaterialPackageRoute(生成器:(上下文)=>ThirdRoute()),
)
:Navigator.push(
上下文
路线,,
);
@凌驾
小部件构建(BuildContext上下文)=>Widget.child;
}

如果您有任何疑问,请毫不犹豫地发表评论。

您可以使用Getxpackage轻松快速地为Flatter项目创建中间件,请参见要实现所需功能,您可以做的一件事是将
导航器
包装在自定义中,比如说
AuthNavigator
,然后从那里执行检查。缺点是您必须调用
AuthNavigator.of(context)
而不是
Navigator.of(context)
,这样对您合适吗?如果是的话,我可以在回答中发布这样一个行为的示例实现,因为我有一个与您类似的问题,这就是我选择的解决方法。实际上,这听起来很棒!如果你能把它作为一个答案,我会接受的。没有问题。刚刚实现了它,它就工作了。代码看起来很棒,正是我需要的,谢谢!