android - 如何在 Kotlin 中使用 Koin 注入 ViewModel?
问题描述
我们如何使用 Koin 注入具有依赖关系的 ViewModel?
所以例如我有一个ViewModel
这样的:
class SomeViewModel(val someDependency: SomeDependency, val anotherDependency: AnotherDependency): ViewModel()
现在这里的官方文档指出,要提供 aViewModel
我们可以执行以下操作:
val myModule : Module = applicationContext {
// ViewModel instance of MyViewModel
// get() will resolve Repository instance
viewModel { SomeViewModel(get(), get()) }
// Single instance of SomeDependency
single<SomeDependency> { SomeDependency() }
// Single instance of AnotherDependency
single<AnotherDependency> { AnotherDependency() }
}
然后注入它,我们可以这样做:
class MyActivity : AppCompatActivity(){
// Lazy inject SomeViewModel
val model : SomeViewModel by viewModel()
override fun onCreate() {
super.onCreate()
// or also direct retrieve instance
val model : SomeViewModel= getViewModel()
}
}
对我来说令人困惑的部分是,通常你需要一个ViewModelFactory
提供ViewModel
依赖项。这里在哪里ViewModelFactory
?它不再需要了吗?
解决方案
你好 viewmodel() 它是一个领域特定语言 (DSL) 关键字,有助于创建 ViewModel 实例。
在官方文档的 [链接][1] 中,您可以找到更多信息
viewModel 关键字有助于声明 ViewModel 的工厂实例。此实例将由内部 ViewModelFactory 处理,并在需要时重新附加 ViewModel 实例。
这个 koin 版本 2.0 [1] 的例子:https ://insert-koin.io/docs/2.0/documentation/koin-android/index.html#_viewmodel_dsl
// Given some classes
class Controller(val service : BusinessService)
class BusinessService()
// just declare it
val myModule = module {
single { Controller(get()) }
single { BusinessService() }
}
推荐阅读
- java - RequestQueue:如何等待响应被处理以运行下一个请求
- python - PUT 文件上传的 S3 权限
- r - 有没有办法将 R 中的 flextable 保存到 LaTex 文件中?
- vue.js - 如果父标签包含活动类,则有条件地显示不同的组件 - Vue Bootstrap
- python-3.x - discord.py channel.history 返回对象“上下文”没有属性“id”
- ios - UIViewController userInterfaceStyle 总是很轻
- c# - C#如何移动代码段以从不同的事件中调用
- python - 类定义包装函数的 Python `self` 参数
- hybris - Hybris,使用 Impex Export 导出主页及其所有数据
- r - 如何使用 Shiny 中的反应参数从导入的文件列表中创建 R Shiny 中已处理文件的列表以进行处理?