Flutter 如何安全地导航到我的颤振应用程序的默认路线(“主页”)?

Flutter 如何安全地导航到我的颤振应用程序的默认路线(“主页”)?,flutter,Flutter,编辑:最初这篇文章是专门针对使用全局导航器的,但我发现这个案例并不是专门针对使用全局导航器的。相反,这是一个错误,可能是由于误用Navigator API造成的 Flutter 1.22.0 • channel beta • https://github.com/flutter/flutter.git Framework • revision d408d302e2 (4 weeks ago) • 2020-09-29 11:49:17 -0700 Engine • revision 5babba

编辑:最初这篇文章是专门针对使用全局导航器的,但我发现这个案例并不是专门针对使用全局导航器的。相反,这是一个错误,可能是由于误用Navigator API造成的

Flutter 1.22.0 • channel beta • https://github.com/flutter/flutter.git
Framework • revision d408d302e2 (4 weeks ago) • 2020-09-29 11:49:17 -0700
Engine • revision 5babba6c4d
Tools • Dart 2.10.0
我在之前的SO帖子中遵循了这一建议。这在某种程度上起作用:

但是,我在使用全局导航键时遇到了一些问题。我无法使用路由谓词调用popUntil以导航回主屏幕,因为我无法有效地调试它

/// constants/keys.dart
    final GlobalKey<NavigatorState> navKey = new GlobalKey<NavigatorState>();


/// constants/routes.dart
    const String HOME = 'home';
    const String SCREEN_A = 'a';
    const String SCREEN_B = 'b';


/// main.dart
class App extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
        return MaterialApp(
            home: Home(),
            navigatorKey: Keys.navKey,
            onGenerateRoute: (routeSettings) {
                switch (routeSettings.name) {
                    case Routes.HOME:
                        return MaterialPageRoute(
                            builder: (context) => Home(),
                            settings: RouteSettings(name: Routes.HOME),
                        );
                    case Routes.SCREEN_A:
                        return MaterialPageRoute(
                            builder: (context) => ScreenA(),
                            settings: RouteSettings(name: Routes.SCREEN_A),
                        );
                    case Routes.SCREEN_B:
                        return MaterialPageRoute(
                            builder: (context) => ScreenB(),
                            settings: RouteSettings(name: Routes.SCREEN_B),
                        );
                    default:
                        return MaterialPageRoute(
                            builder: (context) => Home(),
                            settings: RouteSettings(name: Routes.HOME),
                        );
                }
            },
        );
    }
}

有些路由与页面对象不对应,即 使用Navigator API(推送和好友)添加到历史记录中。A. 与页面对象不对应的路由称为无页面路由 路由,并绑定到与页面对象相对应的路由 这在历史上是低于它的

结束切线

使用Navigator的主要难点是,我需要从范围内没有构建上下文并且需要全局键来访问诸如Navigator之类的小部件的方法中进行导航。例如,我必须为蓝牙连接故障附加一个侦听器,然后从侦听器导航回主屏幕。为了做到这一点,我不得不依靠全球导航键。我也更喜欢访问全局导航键,而不是调用Navigator.of(上下文)

但是,由于无法查看Navigator历史堆栈,因此无法轻松调试问题

我能够通过使用全球导航键使用这些呼叫向前导航:

Keys.navKey.currentState.pushNamed(Routes.HOME);
我可以使用:

Keys.navKey.currentState.pushNamedAndRemoveUntil(Routes.HOME, (Route<dynamic> route) => false);
向后导航

但是我不能简单地弹出内部导航器历史堆栈而不得到一个黑屏

/// Black Screen
Keys.navKey.currentState.popUntil(ModalRoute.withName(Routes.HOME));

对我来说,似乎正确的方法应该是popUntil,因为它从堆栈中弹出除所需路由之外的所有内容。在本例中,为什么不能简单地调用PopTill安全地导航回主屏幕?

我可以使用以下代码段导航回默认路线:

 Keys.navKey.currentState.popUntil(ModalRoute.withName(Navigator.defaultRouteName));

使用调试器,我看到默认路由名称是“/”而不是“home”。使用导航器以编程方式导航不会将初始路由作为主路径推送到堆栈上。这是有道理的。我从不调用Keys.navKey.currentState.push('home')。如果您想使用导航器返回应用程序默认屏幕,请记住这一点,除非您找到将导航器堆栈底部设置为主路线的方法,否则上述方法调用似乎是正确的方法。

我可以使用以下代码段导航回默认路线:

 Keys.navKey.currentState.popUntil(ModalRoute.withName(Navigator.defaultRouteName));
使用调试器,我看到默认路由名称是“/”而不是“home”。使用导航器以编程方式导航不会将初始路由作为主路径推送到堆栈上。这是有道理的。我从不调用Keys.navKey.currentState.push('home')。如果您想使用导航器返回应用程序默认屏幕,请记住这一点,除非您找到将导航器堆栈底部设置为主路径的方法,否则上述方法调用似乎是正确的方法

 Keys.navKey.currentState.popUntil(ModalRoute.withName(Navigator.defaultRouteName));