如何从 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
}
}
我有一个扩展 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
}
}