为什么Android Navigation组件中使用全局Action传递参数失败?
问题原因及解决方案
核心问题1:参数命名不匹配
你在导航图中声明的参数名为全小写eventid,但代码中传参时使用的是驼峰命名eventID,大小写不一致导致Safe Args生成的函数无法识别对应参数。
核心问题2:全局Action未声明对应参数
你当前把参数配置写在了目的地fragment内部,全局Action默认不会自动继承目标目的地的参数配置,需要显式在Action内部声明参数。
具体修复步骤
- 调整导航图配置,把参数移到全局Action内部,同时统一参数命名和代码保持一致:
<fragment android:id="@+id/eventHolder" android:name="de.n.newtest.ui.Fragments.Details.EventHolderKT" android:label="fragment_event_holder"> <action android:id="@+id/action_global_eventHolder" app:destination="@id/eventHolder" app:enterAnim="@anim/holderslideinright" app:exitAnim="@anim/holderslideoutleft" app:popEnterAnim="@anim/holderslideinleft" app:popExitAnim="@anim/holderslideoutright"> <argument android:name="eventID" android:defaultValue="-1" app:argType="integer" /> </action> </fragment>
- 重新构建项目,触发Safe Args重新生成导航相关类,原有调用代码即可正常运行:
epoxyController = EventListEpoxyController { eventClickedID -> val navDirections = NavGraphDirections.actionGlobalEventHolder(eventID = eventClickedID) findNavController().navigate(navDirections) }
可选检查项
如果修改后仍有报错,检查项目是否正确启用了Safe Args插件:
- 项目根目录
build.gradle中已引入Safe Args依赖 - 模块级
build.gradle中已应用androidx.navigation.safeargs.kotlin插件(Kotlin项目适配)
内容的提问来源于stack exchange,提问作者Felix m
相关产品推荐
相关产品推荐

