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

使用GetX嵌套导航时Get.toNamed()传参为null问题求助

解决GetX嵌套导航Get.toNamed()参数为null的问题

你的问题出在自定义onGenerateRoute时,没有将路由的settings参数传递给GetPageRoute,导致Get.toNamed()携带的arguments无法传递到目标页面控制器中。而Get.to()是直接跳转页面并传递参数,不需要经过自定义的路由生成逻辑,所以参数能正常传递。

修复步骤:

修改MainPage.dart中的onGenerateRoute方法,在返回GetPageRoute时传入settings参数,让路由生成时保留原始的参数信息:

Widget getBody() {
  return GetBuilder<MainController>(
    builder: (_) => IndexedStack(
      index: _.pageIdx,
      children: [
        TravelMatePage(),
        AIAdvisorPage(),
        Navigator(
          key: Get.nestedKey(2),
          initialRoute: '/plans',
          onGenerateRoute: (settings) {
            switch(settings.name) {
              case '/plans': 
                return GetPageRoute(
                  page: () => PlansPage(),
                  settings: settings, // 传递settings,包含arguments
                );
              case '/myPlanDetail': 
                return GetPageRoute(
                  page: () => MyPlanDetailPage(),
                  settings: settings, // 关键:传递settings参数
                );
            }
            // 补充默认路由处理,避免报错
            return MaterialPageRoute(builder: (_) => PlansPage());
          },
        ),
        NotificationsPage(),
        SettingsPage()
      ],
  ));
}

另一种可选方案:

如果你希望更直接地传递参数,也可以在路由生成时从settings.arguments中取出参数,直接传入页面构造函数:

onGenerateRoute: (settings) {
  switch(settings.name) {
    case '/plans': 
      return GetPageRoute(page: () => PlansPage());
    case '/myPlanDetail': 
      final planId = settings.arguments as String;
      return GetPageRoute(page: () => MyPlanDetailPage(planId: planId));
  }
  return MaterialPageRoute(builder: (_) => PlansPage());
}

对应的MyPlanDetailPage需要接收构造参数,控制器可以通过页面的参数获取planId,而不用依赖Get.arguments:

class MyPlanDetailPage extends StatelessWidget {
  final String planId;
  const MyPlanDetailPage({super.key, required this.planId});

  @override
  Widget build(BuildContext context) {
    final controller = Get.put(MyPlanDetailController(planId: planId));
    // ...页面布局
  }
}

// MyPlanDetailController.dart
class MyPlanDetailController extends GetxController {
  final String planId;
  MyPlanDetailController({required this.planId});

  @override
  void onInit() async {
    planData = await firestore.getMyPlanDetailData(planId);
    super.onInit();
  }
}

这两种方案都能解决Get.toNamed()跳转嵌套路由时参数为null的问题,你可以根据自己的代码习惯选择。

内容的提问来源于stack exchange,提问作者J.Dragon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:33:12