Fragment间通过Bundle传多少值需要改用共享ViewModel?
官方推荐标准与Bundle传值限制
Google官方没有明确规定Bundle传递的参数数量阈值,但有两个不可突破的核心约束:
- 所有放入Bundle的参数必须支持
Parcelable/Serializable/基础数据类型/String等系统默认支持的序列化类型,未实现Parcelable的自定义类(比如你提到的普通Person类)完全不能通过Bundle传递 - Android系统的Binder事务缓冲区总大小为1MB,所有跨进程/跨组件的事务共享该空间,Bundle传递的总数据大小超过阈值会触发
TransactionTooLargeException崩溃,因此即便参数都是可序列化类型,只要总大小接近1MB也不能使用Bundle传递
两种传值方案的适用场景
适合用Bundle传值的场景
- 传递的参数均为系统支持的序列化类型,总大小远小于1MB
- 两个Fragment属于一次性单向数据传递场景,不需要后续双向同步数据
- 你提到的场景1(仅传递1个ID这类简单值)是Bundle的典型适用场景,操作成本极低,完全没有必要为了单个简单值额外引入共享ViewModel
适合用共享ViewModel传值的场景
- 需要传递的参数包含不可序列化的自定义类型、或者总数据量较大接近1MB
- 两个Fragment需要后续双向同步数据,一方修改数据后另一方需要实时响应
- 你提到的场景2(需要传递10个值,且Person类未实现Parcelable)完全不符合Bundle的使用要求,必须采用共享ViewModel方案
补充场景(点击RecyclerView弹出BottomSheetDialogFragment)的方案选择
这种场景不需要改造原有的Fragment1ViewModel为共享ViewModel,可根据需求二选一:
- 如果仅需要传递选中条目的ID给弹窗,直接调用
setArguments给BottomSheetDialogFragment传Bundle即可,实现成本最低 - 如果需要传递完整的条目数据、或者弹窗操作后需要同步更新Fragment1的列表数据,直接引入宿主Activity级别的共享ViewModel即可,不需要修改原有Fragment1的ViewModel逻辑,避免职责混淆
内容的提问来源于stack exchange,提问作者SilleBille
相关产品推荐
相关产品推荐

