我想将一个 fragment 中的一些整数值共享到另一个 fragment 。我不想在设备更改配置时丢失数据。
因此,我遇到并想知道哪一种更适合我的用例的两种方法是:
1。分享ViewModel
多个 fragment 之间
class SharedViewModel : ViewModel(){
...
}
class FragmentA : Fragment(){
private val model: SharedViewModel by activityViewModels()
...
}
class FragmentB : Fragment(){
private val model: SharedViewModel by activityViewModels()
...
}
2。使用 SafeArgs 和自定义的组合 ViewModelProvider.Factory
使用 SafeArgs 将数据作为参数传递到从一个 fragment (例如 A)到另一个 fragment (例如 B)的导航操作。实现ViewModel
(参数化)和 ViewModelFactory
fragment B 的类。将数据从 SafeArgs 传递到 ViewModelFactory 以创建 ViewModel(使用 ViewModelProvider
)
类似这样的事情:
class B : Fragment() {
//Seperate classes for ViewModelB & ViewModelFactoryB
private lateinit var viewModel: ViewModelB
private lateinit var viewModelFactory: ViewModelFactoryB
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding: BFragmentBinding = DataBindingUtil.inflate(
inflater,
R.layout.b_fragment,
container,
false
)
viewModelFactory = ViewModelFactoryB(BFragmentArgs.fromBundle(requireArguments()).data)
viewModel = ViewModelProvider(this, viewModelFactoryB).get(ViewModelB::class.java)
return binding.root
}
}
最佳答案
这完全取决于您的用例、您在 fragment 之间共享哪些数据以及如何使用这些数据。
尽管这两种情况都支持传递自定义对象,但您必须考虑一些事情。
对于导航组件,关于自定义对象:
- 数据必须是可打包的(首选)或可序列化的;
- 使用
Bundle
对象传递的所有数据都有其自身的局限性,并且数据量较大时可能会导致TransactionTooLargeException
( more about it )。使用共享 View 模型时可以轻松避免这种情况。
对于共享 View 模型:
- 您必须定义新的类来包装您的模型;
- 您必须添加新的类成员来保存共享 View 模型;
- 共享 View 模型将占用内存,直到 Activity 完成或 View 模型存储被清除。
那么答案是什么?
这样的问题会导致固执己见的答案,但我考虑在 safe argument 之间进行选择时遵循一组提示。和 shared view model .
在以下情况下使用安全参数:
- 数据较小;
- 当您在使用此数据后不需要需要将结果返回到前一个 fragment 时;
- 您并不关心这些数据在使用完毕后是否会从内存中删除,并且每次都必须再次查询。
在以下情况下使用共享 View 模型:
- 数据相对较大,或者您认为它可能很大;
- 您有多个数据模型/集;
- 当您在使用此数据后确实需要将结果返回到前一个 fragment 时;
- 当数据查询成本高昂时。共享 View 模型通常与 Activity 一起存在。
关于android - 在 Fragment 之间共享数据的更好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63235825/