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

How to call a ViewModel method from another one in android kotlin?

我有一个扩展 AndroidViewModel class 的 UserViewModel,这个 class 有一个 User 类型的 MutableLiveData,里面有用户信用等信息,这个视图模型还有一个 editCredit 方法,它设置用户拥有的新信用额度(保存在数据库中并为用户赋值 属性 因此可以在视图中观察到)

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

中的 editCredit 方法

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

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

更新---

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

如前所述,您不应该那样做。 ViewModels 不应该相互了解,但如果你真的需要这样做:

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

interface EditCredit {
  fun editCredit()
}
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
     }

}