如何使用 GoRouter 从对话框导航到新屏幕?

问题描述 投票:0回答:1

我使用 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 对话框导航的正确实现是什么?我的应用程序中有太多对话框,无法将对话框声明为路由,我只需要能够使用对话框提示导航回上一个屏幕。非常感谢任何帮助。

flutter dialog flutter-go-router gorouter
1个回答
0
投票

出现此问题的原因是,当显示对话框时,其上下文与注册 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 仅用于关闭对话框,它和此解决方案应该可以解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.