【问题标题】:How to pass data from one ViewModel to another ViewModel如何将数据从一个 ViewModel 传递到另一个 ViewModel
【发布时间】:2022-11-25 18:04:00
【问题描述】:
我有一个片段,其中有两个带有提示文本的 TextViews。当用户单击第一个时,底部工作表对话框将打开并显示可能的选项列表。用户选择一个选项,选项信息显示在第一个TextView而不是提示文本中。当用户点击第二个TextView时,同样的底部工作表对话框打开,但显示过滤后的选项列表(该列表是根据第一个选择过滤的)。用户选择一个选项,选项信息显示在第二个 TextView 而不是提示文本中。我已经通过仅对片段本身使用一个 ViewModel 来实现这一点,但这似乎不正确,因为 ViewModel 做的太多了。因此,我尝试使用两个 ViewModel:一个用于在选择选项时更新片段本身,另一个用于底部工作表对话框加载数据并将它们显示在列表中。但问题是我无法将所选选项从底部工作表对话框 ViewModel 共享到片段 ViewModel。有没有办法通过使用两个 ViewModel 来实现我想要实现的目标?
【问题讨论】:
标签:
android
mvvm
viewmodel
android-viewmodel
【解决方案1】:
我遇到了这个问题,我用界面解决了。我认为这是最佳实践。
示例:我展示了如何将字符串从底部工作表对话框发送到片段。
首先我们创建新界面
interface BottomSheetClickListener {
fun onDialogClick(view: View, string: String)
}
其次,我们从类构造函数中获取底部表单对话框片段。我们编写了如何触发此侦听器,例如单击 textView。
class BottomSheetDialog(
private val listener: BottomSheetClickListener
) : BottomSheetDialogFragment() {
textView.setOnClickListener {
listener.onDialogClick(it,"String")
}
}
最后,我们编写片段或活动代码,首先从我们的侦听器继承并创建 bottomSheetDialog 对象。
class HomeFragment : Fragment(), BottomSheetClickListener {
private fun openBottomSheetDialog(){
val dialog = BottomSheetDialog(this)
dialog.show(childFragmentManager, "dialog")
}
override fun onDialogClick(string: String, id: Int) {
//Get string from bottom sheet dialog string
}
}
【解决方案2】:
目前,据我所知,Google 推荐的方法是针对此类情况使用 shared view model。
我不确定你是如何在你的案例中实施它的——但如果它类似于谷歌推荐的东西——那么就可以了。
当然,您可以创建一个由多个视图模型通过接口和 UI 调用连接起来的精心设计的架构,但我不知道这是否值得。
实现此类案例的一般规则不是使用具有大量抽象和泛化的最干净的方法,而是使用仍然试图遵循 OOD 原则的最佳方法(在花费的时间和代码的简单性/可读性方面)。
希望能帮助到你。