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

Kotlin中Fragment间Iterable数据传递的可行方案咨询

可行的非hacky实现方案

方案1:让数据类实现Parcelable(官方推荐)

Bundle和Navigation Component的navArgs其实支持传递实现Parcelable接口的对象集合,这是Android官方推荐的序列化方式,性能优于Serializable。

步骤:

  • 让数据模型类实现Parcelable接口。Kotlin可以用@Parcelize注解自动生成实现代码,无需手动编写Parcel/Creator逻辑:
@Parcelize
data class YourDataModel(val id: Int, val name: String) : Parcelable
  • 若你的Iterable是List(如ArrayList),直接通过导航组件传递:
    • 在导航图的action中定义参数类型为ParcelableArrayList:
<argument
    android:name="dataList"
    app:argType="androidx.collection.ParcelableArrayList&lt;com.yourpackage.YourDataModel&gt;"/>
  • 第一个Fragment中发起跳转并传参:
val dataList: List<YourDataModel> = yourIterableData.toList()
findNavController().navigate(
    FirstFragmentDirections.actionFirstToSecond(dataList as ArrayList<YourDataModel>)
)
  • 第二个Fragment通过navArgs接收:
val args: SecondFragmentArgs by navArgs()
val receivedList: List<YourDataModel> = args.dataList
  • 若是自定义Iterable实现类,让该类也实现Parcelable,即可直接传递对象。

方案2:使用共享ViewModel传递

如果两个Fragment同属一个Activity或导航图,可通过共享ViewModel传递数据,无需依赖Bundle/navArgs:

  • 创建共享ViewModel:
class SharedViewModel : ViewModel() {
    val dataIterable = MutableLiveData<Iterable<YourDataModel>>()
}
  • 第一个Fragment中设置数据并跳转:
val viewModel = ViewModelProvider(requireActivity())[SharedViewModel::class.java]
viewModel.dataIterable.value = yourIterableData
findNavController().navigate(R.id.action_first_to_second)
  • 第二个Fragment中监听并获取数据:
val viewModel = ViewModelProvider(requireActivity())[SharedViewModel::class.java]
viewModel.dataIterable.observe(viewLifecycleOwner) { iterableData ->
    // 处理数据逻辑
}

这种方式适合数据量较大、无需持久化传递的场景,ViewModel会在Activity生命周期内保留数据。

方案3:让数据类实现Serializable

这是兼容性更强但性能稍弱的方案,Bundle同样支持传递Serializable对象:

  • 让数据类实现Serializable接口:
data class YourDataModel(val id: Int, val name: String) : Serializable
  • 传递时将Iterable转为List,通过navArgs传递(导航图参数类型设为Serializable):
val dataList = yourIterableData.toList()
findNavController().navigate(FirstFragmentDirections.actionFirstToSecond(dataList))
  • 第二个Fragment接收并强转:
val args: SecondFragmentArgs by navArgs()
val receivedList = args.dataList as List<YourDataModel>

补充说明

navArgs崩溃通常是因为参数类型配置错误,或数据类未实现Parcelable/Serializable接口。按官方规范配置后,navArgs可正常传递对象集合,无需hack方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 18:10:49