Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android kotlin中从另一个方法调用ViewModel方法?_Android_Kotlin_Android Viewmodel_Android Mvvm - Fatal编程技术网

如何在android kotlin中从另一个方法调用ViewModel方法?

如何在android kotlin中从另一个方法调用ViewModel方法?,android,kotlin,android-viewmodel,android-mvvm,Android,Kotlin,Android Viewmodel,Android Mvvm,我有一个UserViewModel,它扩展了AndroidViewModel类,这个类有一个类型为User的可变LiveData,里面有像用户信用这样的信息,这个视图模型还有一个editCredit方法,它设置了用户拥有的新信用量(保存在DB和postValue上的用户属性,以便在视图中观察) 我得到的另一个AndroidViewModel类是CourseViewModel,它具有courseList或currentCourse之类的属性。它还有一个名为buyCourse的方法,需要减少用户信用

我有一个UserViewModel,它扩展了AndroidViewModel类,这个类有一个类型为User的可变LiveData,里面有像用户信用这样的信息,这个视图模型还有一个editCredit方法,它设置了用户拥有的新信用量(保存在DB和postValue上的用户属性,以便在视图中观察)

我得到的另一个AndroidViewModel类是CourseViewModel,它具有courseList或currentCourse之类的属性。它还有一个名为buyCourse的方法,需要减少用户信用,并将该课程添加到用户课程列表中。第二个属性位于CourseViewModel类中,我更新该列表没有问题,但为了减少用户的信用,我需要调用位于其他viewModel类中的editCredit方法

我知道我可以在视图层中使用一些逻辑,在那里调用courseViewModel.buyCourse,然后添加一个可观察的方法,这样当它添加到用户的课程列表时,我可以得到通知并在该层调用userViewModel.editCredit,但我的问题是:

Is there any way, a viewModel class can call another ViewModel class's methods?
更新---

在我开始耦合视图模型之前,我有一个viewModel,其中包含400多行代码,但它可以轻松完成工作,但很难阅读(那里没有太多逻辑,只调用存储库函数)
所以我尝试将它们更改为更小的视图模型类,现在我被卡住了。

正如前面提到的,您不应该这样做。ViewModels不应该相互了解,但如果确实需要这样做:

您可能要做的是以接口的形式提供所需的方法。此接口将扩展一个ViewModel,并在初始化时使用
WeakReference
(请阅读相关内容)提供给第二个ViewModel,以确保安全,不会发生内存泄漏

interface EditCredit {
  fun editCredit()
}

一个viewModel类可以调用另一个viewModel类的方法吗?
似乎不是个好主意。如果一个组件需要数据才能工作,那么该数据就是一个依赖项,并且存在处理依赖项的已知方法。在虚拟机中需要另一个虚拟机只是一种隐藏事实的方式,即您实际上需要数据,这些数据可以在开始相互耦合ViewModel之前传递。我建议您阅读有关ViewModel的内容,以及它在应用程序中的实际用途。@ohhhthavarun感谢您的评论,事实上,一开始我只有一个类,但它开始不断增长,变成了400多行代码(主要是在ViewModelScope中调整存储库挂起函数),因此随着它的行数增加,读取和调试变得越来越困难,这就是为什么我试图将其拆分为更小的类,但是处理这些依赖关系似乎并不容易,有什么建议吗?@a_local_也没有人感谢你的评论,实际上我正在寻找一种在viewModel之间进行协商的方法,以保持它们的独立性,而一个巨大的viewModel可以拆分为较小的viewModel,但是似乎没有一个标准的方法来实现这一点。感谢这是一个很好的解决方案,正如你所说,这可能不是最佳实践,但因为它使我的程序更易于阅读和调试,我相信它值得使用
class UserViewModel : EditCredit {
   override fun editCredit() {
      // do sth
   }
}
class CourseViewModel {
  var editCredit: EditCredit? by weak() // by using weak() I just want to indicate you should handle it properly

   fun someFunctionThatNeedsEditCredit() {
      editCredit?.editCredit()
   }
}
class SomeActivity {
     val userViewModel: UserViewModel
     val courseViewModel: CourseViewModel

     override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        userViewModel = //initialize it
        courseViewModel = //initialize it
        courseViewModel.editCredit = userViewModel
     }

}