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
相关产品推荐
相关产品推荐

