You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过NavController传递额外的对象类型参数至目标Fragment

使用NavController传递自定义对象参数的实现方案

在Android Jetpack Navigation中传递自定义对象,官方推荐使用Safe Args插件(类型安全、避免手动传参错误),也可以通过Parcelable序列化结合Bundle实现,以下是具体步骤:

方法一:使用Safe Args(推荐)

1. 配置Safe Args插件

首先在项目级build.gradle(或build.gradle.kts)中添加插件依赖:

buildscript {
    dependencies {
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.7.7"
    }
}

然后在模块级build.gradle(或build.gradle.kts)中应用插件:

// Java项目
apply plugin: "androidx.navigation.safeargs"

// Kotlin项目
apply plugin: "androidx.navigation.safeargs.kotlin"

2. 让数据类实现Parcelable

你的Fridge.fridge和Result数据类需要实现Parcelable接口,Kotlin可以用@Parcelize注解简化实现:

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

object Fridge {
    @Parcelize
    data class fridge(
        val number: Int,
        val offset: Int,
        val results: List<Result>,
        val totalResults: Int
    ) : Parcelable

    @Parcelize
    data class Result(
        // 补全Result类的字段
    ) : Parcelable
}

注意:若使用Java,需手动实现Parcelable的writeToParcel和CREATOR方法。

3. 在导航图中定义参数

打开导航图文件(res/navigation/nav_graph.xml),为目标FragmentfridgeDishViewFragment添加参数配置:

<fragment
    android:id="@+id/fridgeDishViewFragment"
    android:name="com.yourpackage.FridgeDishViewFragment">
    <argument
        android:name="fridgeData"
        app:argType="com.yourpackage.Fridge$fridge" />
</fragment>

替换com.yourpackage为实际包名,Fridge$fridge是嵌套类的引用格式。

4. 传递参数

修改跳转代码,使用Safe Args自动生成的Action类传递对象:

// 假设已获取到fridge对象:val fridgeData = Fridge.fridge(...)
val action = FridgeFragmentDirections.actionFridgeToFridgeDishViewFragment(fridgeData)
findNavController().navigate(action)

5. 接收参数

在FridgeDishViewFragment中通过Safe Args获取传递的对象:

val args = FridgeDishViewFragmentArgs.fromBundle(requireArguments())
val fridgeData = args.fridgeData
// 后续即可使用fridgeData中的数据

方法二:直接使用Bundle传递Parcelable对象

若暂时不想使用Safe Args,可直接通过Bundle传递:

1. 数据类实现Parcelable(同方法一的步骤2)

2. 构建Bundle并传递

修改跳转代码:

val fridgeData = Fridge.fridge(...)
val bundle = Bundle().apply {
    putParcelable("fridge_data", fridgeData)
}
findNavController().navigate(R.id.action_fridge_to_fridgeDishViewFragment, bundle)

3. 接收参数

在目标Fragment中获取对象:

val fridgeData = arguments?.getParcelable<Fridge.fridge>("fridge_data")
// 注意判空处理
fridgeData?.let {
    // 使用数据
}

注意事项

  • 确保所有嵌套数据类(如Result)都实现Parcelable,否则List<Result>无法正常序列化。
  • 传递的对象体积不宜过大,避免Bundle超限引发异常。

内容的提问来源于stack exchange,提问作者Shivansh Tariyal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:10:23