Flutter GetX页面跳转时传递的arguments参数在第二页取值为null如何解决?
Flutter GetX 页面跳转传参无法接收解决方案
问题说明
使用GetX的Get.offAll跳转页面时传递的arguments参数,在第二页控制器的onInit方法中无法正常获取。
排查与解决步骤
- 第一步:确认传递的参数本身非空
在执行跳转逻辑前先打印待传递的参数,避免接口返回的session本身为null导致后续接收为空:if(_loginResponse.value.responseCode == 1) { // 先加日志确认参数值 print("传递的session:${_loginResponse.value.responseData?.session}"); Get.offAll(GoogleAuthenticationScreen(), arguments: _loginResponse.value.responseData!.session.toString()); } - 第二步:调整参数获取的生命周期位置
控制器onInit执行时机早于路由参数挂载,大概率是参数还没传递完成就已经执行了获取逻辑,把参数获取和后续调用移到onReady方法中即可:class GoogleAuthenticationController extends GetxController { var _loading = false.obs; late TextEditingController pinController; var _authResponse = GoogleTwoFactorResponse().obs; @override void onInit() { super.onInit(); pinController = TextEditingController(); } // 改为在onReady中获取参数,此时路由参数已挂载完成 @override void onReady() { super.onReady(); var session = Get.arguments.toString(); twoFactorCall(token: session); } @override void onClose() { super.onClose(); pinController.dispose(); } Future<void> twoFactorCall({required String token}) async { _loading.value = true; var result = await NetworkRequest.googleAuthentication(token: token); result != null ? _authResponse.value = result : Get.snackbar( 'Something went wrong', 'Hold back and try again after sometime.', snackPosition: SnackPosition.BOTTOM); Get.snackbar(result!.responseMessage!, "", snackPosition: SnackPosition.BOTTOM); _loading.value = false; } } - 第三步(可选,更稳妥):使用命名路由+绑定控制器
避免控制器提前初始化导致拿不到参数,建议将页面注册到GetX路由表,同时绑定控制器,保证控制器随页面生命周期初始化:- 路由注册:
final List<GetPage> getPages = [ GetPage( name: '/google-auth', page: () => GoogleAuthenticationScreen(), binding: BindingsBuilder(() => Get.put(GoogleAuthenticationController())), ), // 其他页面路由 ];- 跳转逻辑改为命名路由跳转:
Get.offAllNamed('/google-auth', arguments: _loginResponse.value.responseData!.session.toString()); - 第四步(可选):参数包装为Map传递
部分场景下直接传递基础类型可能出现丢失,将参数包装为Map传递更稳定:
传参时:
接收时:Get.offAllNamed('/google-auth', arguments: {"session": _loginResponse.value.responseData!.session.toString()});var session = Get.arguments['session'];
内容的提问来源于stack exchange,提问作者Kanwarpreet Singh
相关产品推荐
相关产品推荐

