You need to enable JavaScript to run this app. Kotlin使用Navigation传Bundle参数,目标Fragment取值始终为null
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 11:06:04