android 如何将数据从一个ViewModel传递到另一个ViewModel

gzjq41n4  于 2022-11-27  发布在  Android
关注(0)|答案(3)|浏览(340)

我有一个片段,其中有两个带有提示文本的TextView。当用户点击第一个时,底部表单对话框打开,并显示可能的选项列表。用户选择一个选项,选项信息显示在第一个TextView中,而不是提示文本。当用户点击第二个TextView时,底部表单对话框打开,但显示筛选的选项列表(列表是根据第一个选项过滤的)。用户选择一个选项,选项信息显示在第二个TextView中,而不是提示文本。我已经通过对片段本身只使用一个ViewModel实现了这一点,但似乎不太合适,因为ViewModel做的太多了。因此,我尝试使用两个ViewModel:一个用于片段本身在选项被选择时更新,另一个用于底部工作表对话框加载数据并在列表中显示它们。但问题是我无法将所选选项从底部工作表对话框ViewModel共享到片段ViewModel。有没有办法通过使用两个ViewModel来实现我想要实现的目标?

eivgtgni

eivgtgni1#

就目前而言,据我所知,Google推荐的方法是为此类情况建立一个共享视图模型。
我不确定你是如何在你的情况下实现它的-但如果它是类似于谷歌推荐的东西-那么它是可以的。
当然,您可以创建通过接口和UI调用连接的多个视图模型的精细架构,但我不知道是否值得。
实现这种情况的一般规则不是使用具有大量抽象和生成的最干净的方法,而是使用仍然试图遵循OOD原则的最优化的方法(就所花费的时间和代码的简单性/可读性而言)。
希望能有所帮助。

nkoocmlb

nkoocmlb2#

我遇到了这个问题,我用接口解决了。我认为这是最好的做法。例如:我展示了如何将字符串从对话框底部表单发送到片段。
首先我们创建新界面

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
     }
}
k2fxgqgv

k2fxgqgv3#

您可以在一个Fragment中包含多个ViewModel,因此不需要保留一个巨大的共享ViewModel,其中包含3个较小的共享ViewModel的所有逻辑。
您可以创建一个额外的共享ViewModel,它只关心实际的公共数据,并将3个单独的片段特定ViewModel保持分离。

sharedModel = activity?.run {
        ViewModelProviders.of(this)[SharedViewModel::class.java]
    } ?: throw Exception("Invalid Activity")
localViewModel = ViewModelProviders.of(this).get(LocalViewModel::class.java)

相关问题