我使用 GoRouter 进行路线导航,它实现正确并且适用于所有路线导航。要导航回上一屏幕,我需要用户确认。为此,我使用对话框来提示确认。在对话框中单击“是”:
Navigator.pop(context);
context.go(previous route);
Navigator.pop 应该关闭对话框,context.go 应该返回到上一个屏幕.. 抛出以下错误:
The following assertion was thrown while handling a gesture:
No GoRouter found in context
'package:go_router/src/router.dart':
Failed assertion: line 516 pos 12: 'inherited != null'
When the exception was thrown, this was the stack:
#2 GoRouter.of (package:go_router/src/router.dart:516:12)
#3 GoRouterHelper.go (package:go_router/src/misc/extensions.dart:25:16)
#4 _FoodWeeklyInputState.build.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:cgc/Screens/Input/Food%20And%20Drink/Input_Page_Food.dart:2704:43)
如果 Navigator.context(pop);在没有对话框的情况下调用,路由按预期工作,并且我可以导航回上一个屏幕。但是,使用“I Dialog”内的导航时,“路由”会失败并引发错误。 使用 GoRouter 对话框导航的正确实现是什么?我的应用程序中有太多对话框,无法将对话框声明为路由,我只需要能够使用对话框提示导航回上一个屏幕。非常感谢任何帮助。
出现此问题的原因是,当显示对话框时,其上下文与注册 GoRouter 的主上下文不同。要解决此问题,请在调用 context.go() 时传递父上下文,而不是使用对话框的上下文
showDialog(
context: context,
builder: (BuildContext dialogContext) {
return AlertDialog(
title: Text('Confirmation'),
content: Text('are you sure?'),
actions: [
TextButton(
onPressed: () {
Navigator.pop(dialogContext);
context.go('/previousRoute');
},
child: Text('Yes'),
),
TextButton(
onPressed: () {
Navigator.pop(dialogContext);
},
child: Text('No'),
),
],
);
},
);
此设置,dialogContext 仅用于关闭对话框,它和此解决方案应该可以解决您的问题。