使用Navigation组件访问带可空参数的Fragment时崩溃求助
问题描述
我的OrdersFragment配置了名为option的可空导航参数,配置代码如下:
<argument android:name="option" app:argType="string" app:nullable="true" />
为处理该参数,我在onViewCreated方法上方声明了变量:
private val args : OrdersFragmentArgs? by navArgs()
并在onViewCreated中编写了逻辑:
args?.let { if(it.option.equals("Completada")){ getCompletedOrders() }else if (it.option.equals("Cancelada")){ getCanceledOrders() } }
但进入OrdersFragment时应用崩溃,错误日志核心提示:
Caused by: java.lang.IllegalArgumentException: Required argument "option" is missing and does not have an android:defaultValue
我需要实现从EditOrderFragment向OrdersFragment传递option参数,但目前无法正常访问该Fragment。使用的依赖版本:
id 'androidx.navigation.safeargs' version '2.5.3' apply false //Navigation components implementation "androidx.navigation:navigation-fragment-ktx:2.5.0" implementation "androidx.navigation:navigation-ui-ktx:2.5.0"
错误原因
在Navigation Safe Args 2.5.x版本中,仅设置app:nullable="true"不会将参数标记为可选。必须同时指定android:defaultValue,否则Safe Args会强制将参数视为必填项,当未传递参数时就会抛出上述异常。
解决方案
方案1:为参数添加默认值(推荐)
修改导航参数配置,添加android:defaultValue="@null",让参数被识别为可选:
<argument android:name="option" app:argType="string" app:nullable="true" android:defaultValue="@null" />
修改后重新编译项目,原有的args?.let逻辑即可正常工作。
方案2:手动从Bundle获取参数
如果不想添加默认值,可以直接从Fragment的arguments中手动获取参数,绕过Safe Args的必填校验:
// 替换原有的args声明 private val option: String? by lazy { arguments?.getString("option") } // 在onViewCreated中使用 option?.let { if(it == "Completada"){ getCompletedOrders() }else if (it == "Cancelada"){ getCanceledOrders() } }
补充:确保跳转时参数传递正确
从EditOrderFragment跳转至OrdersFragment时,需确保正确传递参数(如果需要传递):
// 方式1:使用Safe Args生成的跳转方法 val action = EditOrderFragmentDirections.actionEditOrderFragmentToOrdersFragment("Completada") findNavController().navigate(action) // 方式2:手动构建Bundle传递 val bundle = bundleOf("option" to "Completada") findNavController().navigate(R.id.action_editOrderFragment_to_ordersFragment, bundle)
内容的提问来源于stack exchange,提问作者FreddicMatters
相关产品推荐
相关产品推荐

