Kotlin使用Navigation传Bundle参数,目标Fragment取值始终为null
核心错误定位
- 导航参数声明位置、名称、类型全部错位
- 你将跨页传递的
searchArgument参数声明在HomeFragment节点下,该位置的参数是供HomeFragment自身接收的,和跳转目标SearchFragment没有关联 - SearchFragment节点下声明的接收参数名为
searchArgumentValue,和Bundle中传递的键名searchArgument不匹配 - 类型不匹配:发送端传入的是普通字符串
String,SearchFragment节点声明的参数类型为自定义类com.my.app.classes.slugArg
- 你将跨页传递的
- 参数接收方式完全错误
- 你通过
activity?.intent?.extras读取参数,该方法只能获取宿主Activity启动时自带的Intent参数,和Navigation组件传递给当前Fragment的参数无关联,因此永远读不到对应值
- 你通过
分步修复方案
1. 修正导航配置文件
将参数声明移动到接收方SearchFragment节点下,对齐键名、数据类型,同时移除原有配置中多余的无效标签:
<!-- HomeFragment节点仅保留自身业务配置,移除错误挂载的跨页参数声明 --> <fragment android:id="@+id/nav_home" android:name="com.my.app.ui.home.HomeFragment" android:label="@string/menu_home" tools:layout="@layout/fragment_home" > <argument android:name="projectSlugArgument" /> <action android:id="@+id/action_nav_home_to_projectDetailsFragment" app:destination="@id/projectDetailsFragment" /> <action android:id="@+id/action_nav_home_to_searchFragment" app:destination="@id/searchFragment" /> </fragment> <!-- 项目详情页节点保持原有配置即可,修正多余的无效闭合标签 --> <fragment android:id="@+id/projectDetailsFragment" android:name="com.my.app.ui.ProjectDetails.ProjectDetailsFragment" android:label="fragment_project_details" tools:layout="@layout/fragment_project_details"> <argument android:name="projectSlugArgumentValue" app:argType="com.my.app.classes.slugArg" /> </fragment> <!-- SearchFragment节点:在此处声明需要接收的参数,和发送端Bundle键名、类型完全对齐 --> <fragment android:id="@+id/searchFragment" android:name="com.my.app.ui.search.SearchFragment" android:label="fragment_search" tools:layout="@layout/fragment_search"> <argument android:name="searchArgument" app:argType="string" app:nullable="true" android:defaultValue="@null" /> </fragment>
2. 参数发送逻辑保持不变
你现有发送端的代码逻辑本身没有问题,导航配置修正后即可正常传递:
private fun search(input: String) { val bundle = bundleOf("searchArgument" to input) navController.navigate(R.id.action_nav_home_to_searchFragment, bundle) Log.d("eeet", input) // Logcat中可看到有数据 }
3. 修正参数接收逻辑
从Fragment自带的arguments属性中读取Navigation传递的参数,不要读取Activity的Intent extras,同时调整参数声明方式避免空值崩溃:
private var searchArgument: String = "" override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_search, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 从当前Fragment的Navigation参数集中读取值 searchArgument = arguments?.getString("searchArgument").toString() Log.d("eeee", searchArgument) // 此时可正常获取传递的入参 }
补充说明:日常开发可使用Navigation内置的Safe Args能力生成类型安全的参数类,避免手动编写Bundle键名导致的拼写错误。
内容的提问来源于stack exchange,提问作者mafortis
相关产品推荐
相关产品推荐

