首页 > 解决方案 > 如何在另一个 ViewModel withKoin 中获取 ViewModel 实例

问题描述

我是 koin 和 kotlin 的新手,我刚刚开始在我的项目中使用 koin,它工作得很好。我有两个视图模型类,SubscritpionViewModel 和 LoginViewModel。有没有办法可以在 SubscriptionViewModel 中获取 LoginViewModel 的实例。我不知道它是否正确,但如果我可以访问另一个视图模型,它对我来说会很方便。

val viewModule = module {
   viewModel { SubscriptionViewModel(get(), get()) }
   viewModel { LoginViewModel(get()) }
} 

订阅视图模型

class SubscriptionViewModel(val api: ServiceApi,  var user: LoginViewModel) : BaseViewModel() {
   ...
} 

我还为此创建了一个单独的模块,但我不知道初始化它的正确方法是什么。

val userModule = module {

single( definition = {
    get<LoginViewModel>() }) 
}

标签: androidkotlinkoin

解决方案


我认为这是一个糟糕的设计。我认为您应该做的是在 LoginViewModel 和 SubscriptionViewModel 之间创建一个公共对象,并通过构造函数将其注入 LoginViewModel 和 SubscriptionViewModel。也许存储库模式会很好?请描述您想要实现的功能,以便我们了解为什么您需要一个 ViewModel 包含在另一个 ViewModel 中。使用存储库,您可以执行以下操作:

class UserRepository(private val serviceApi: ServiceApi) {

}

class SubscriptionViewModel(val userRepository: UserRepository) : BaseViewModel() {
   ...
} 

class LoginViewModel(val userRepository: UserRepository) : BaseViewModel() {
 ...
}

在 Koin 模块中:

module {
   single { UserRepository(get()) }

   viewModel { SubscriptionViewModel(get()) }
   viewModel { LoginViewModel(get()) }
} 

推荐阅读