You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GetX调用Get.toNamed()时Navigator的onGenerateRoute未执行问题

核心问题原因

你的代码存在3个导致嵌套导航不生效的问题:

  • 多个Navigator复用了同一个nestedKey:两个Tab对应的Navigator都指定了Get.nestedKey(2),每个独立的嵌套导航栈必须绑定唯一id,否则GetX无法定位到对应的导航栈
  • 调用Get.toNamed未指定嵌套导航id:默认Get.toNamed走全局根路由,要触发指定嵌套Navigator的跳转,必须传入id参数,值对应你给Navigator设置的nestedKey的id
  • onGenerateRoute未匹配跳转的目标路由:你当前跳的是VozComercialRoutes.registro,但onGenerateRoute里只处理了home和listaRegistros两个路由,匹配不到自然不会生效

修复方案

步骤1:修正Navigator的nestedKey配置,补全路由匹配

class NavigatorPage extends GetWidget<NavigatorController> {
  NavigatorPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final List<Widget> pages = [
      // 第一个Tab对应导航栈id=1
      Navigator(
          key: Get.nestedKey(1),
          onGenerateRoute: (settings) {
            if (settings.name == VozComercialRoutes.home) {
              return GetPageRoute(
                  page: () => HomePage(), binding: HomePageBinding());
            } else if (settings.name == VozComercialRoutes.listaRegistros) {
              return GetPageRoute(
                  page: () => ListaRegistrosPage(),
                  binding: ListaRegistrosBinding());
            } else if (settings.name == VozComercialRoutes.registro) {
              // 补全目标路由配置,携带settings才能正常传递arguments
              return GetPageRoute(
                  page: () => RegistroPage(),
                  settings: settings,
                  binding: RegistroBinding());
            }
          }),
      // 第二个Tab对应导航栈id=2
      Navigator(
          key: Get.nestedKey(2),
          onGenerateRoute: (settings) {
            // 第二个Tab的路由配置根据业务补充
            if (settings.name == VozComercialRoutes.download) {
              return GetPageRoute(page: () => DownloadPage());
            }
          }),
    ];
    return Scaffold(
      extendBodyBehindAppBar: true,
      appBar: CustomAppBar(),
      body: PageView(
        onPageChanged: controller.changePage,
        controller: controller.pageController,
        physics: const NeverScrollableScrollPhysics(), // Tab导航建议禁止滑动切换,避免手势冲突
        children: pages,
      ),
      bottomNavigationBar: Obx(() => BottomNavigationBar(
              onTap: controller.changePage,
              currentIndex: controller.tabIndex.value,
              items: [
                BottomNavigationBarItem(
                  icon: Icon(Icons.home),
                  label: 'home',
                ),
                BottomNavigationBarItem(
                  icon: Icon(Icons.download),
                  label: 'download',
                ),
              ])),
    );
  }
}

步骤2:跳转时指定对应嵌套导航栈的id

// 要跳转到第一个Tab的嵌套栈就传id:1,跳第二个Tab的嵌套栈就传id:2
Get.toNamed(VozComercialRoutes.registro, arguments: registro, id: 1);

补充说明

如果需要更规范的路由管理,可以把所有嵌套路由提前注册到GetMaterialApp的getPages列表中,不需要在onGenerateRoute里手动判断,GetX会自动匹配路由配置。如果要返回嵌套栈的上一页,也需要指定对应id:Get.back(id:1)。

内容的提问来源于stack exchange,提问作者user9378857

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:48:04