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

