【发布时间】:2020-08-03 19:32:54
【问题描述】:
我想将一些整数值从一个片段共享到另一个片段。我不想在设备更改配置时丢失数据。
因此,我遇到了两种方法并想知道哪一种更适合我的用例:
1。在多个片段之间共享ViewModel
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 将数据作为参数传递给从片段(例如 A)到另一个片段(例如 B)的导航操作。为片段 B 实现 ViewModel(参数化)和 ViewModelFactory 类。将数据从 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
}
}
【问题讨论】:
-
当你要求最好但你没有提到在什么情况下,每个即将到来的答案可能会根据每个人的看法而有所偏差。但我认为看到这个页面对你来说是一个好的开始。 developer.android.com/guide/navigation/navigation-pass-data
-
我希望我的问题现在清楚地解释了我的用例。很抱歉之前没有正确构图。
标签: android android-fragments android-architecture-components android-viewmodel android-safe-args