没有上下文的导航 go_router flutter

Dik*_*sta 3 navigation dart flutter gorouter flutter-go-router

我有我的路由的配置类,我通过模块使用它,如下代码所示:

class RouterRegister {
  static RouterRegister? _instance;

  static RouterRegister getIntance() {
    return _instance ??= RouterRegister();
  }

  final RouterConfig<Object> router = GoRouter(
    navigatorKey: GlobalKey<NavigatorState>(),
    initialLocation: '/',
    observers: [
      FirebaseAnalyticsObserver(analytics: FirebaseAnalytics.instance)
    ],
    routes: <RouteBase>[
      ShellRoute(
        builder: (context, __, child) => child,
        
        routes: [
          ...MicroAuthRoutes.getIntance().routes,
        ],
      )
    ],
  );
}
Run Code Online (Sandbox Code Playgroud)

我的 MicroAuthRoutes 类是这样的:

class MicroAuthRoutes {
  static const splash = '/';
  static const login = '/login';
  static const forgot = '/forgot';
  static const signup = '/signup';
  static const token = '/token';

  static MicroAuthRoutes? instance;

  static MicroAuthRoutes getIntance() {
    return instance ??= MicroAuthRoutes();
  }

  final List<RouteBase> routes = [
    GoRoute(
        path: splash,
        pageBuilder: (context, state) {
          return MaterialPage(
            child: AuthSplashPage(),
          );
        }),
    GoRoute(
      path: login,
      pageBuilder: (_, state) {
        return MaterialPage(
          child: AuthLoginPage(),
        );
      },
    ),
    GoRoute(
      path: forgot,
      pageBuilder: (_, state) {
        return MaterialPage(
          child: AuthForgotPage(),
        );
      },
    ),
    GoRoute(
      path: signup,
      pageBuilder: (_, state) {
        return MaterialPage(
          child: AuthSignupPage(),
        );
      },
    ),
    GoRoute(
      path: token,
      pageBuilder: (_, state) {
        return MaterialPage(
          child: AuthTokenPage(),
        );
      },
    ),
  ];
}
Run Code Online (Sandbox Code Playgroud)

而不是我的主文件是这样的:

final _router = RouterRegister.getIntance().router;

class App extends StatefulWidget {
  const App({super.key});

  @override
  State<App> createState() => _AppState();
}

class _AppState extends State<App> {
  @override
  void initState() {
    super.initState();
    AuthState().checkAuthState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp.router(
      debugShowCheckedModeBanner: false,
      routerConfig: _router,
      debugShowMaterialGrid: false,
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是如何使用 go 路由器在我的控制器中导航,但如果不使用上下文,我在搜索中没有找到任何内容,并且我陷入了这个问题。

我尝试过使用导航键,但没有成功。

小智 6

声明NavigatorKey为全局变量。

final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
Run Code Online (Sandbox Code Playgroud)

注册一下吧

 final RouterConfig<Object> router = GoRouter(
                                     navigatorKey: navigatorKey,
// rest of code
Run Code Online (Sandbox Code Playgroud)

现在使用 key 来获取上下文。

final context = navigatorKey.currentContext;

if (context != null) {
 context.go('yourRoute');
}
Run Code Online (Sandbox Code Playgroud)