我尝试注入的对象之一捕获 lambda 中的引用。该 lambda 用作更新我的 viewModel 的回调。我如何使用 koin 来注入该对象?
不使用依赖注入的工作代码:
private val viewModel: MyViewModel by viewModel()
private val barcodeDataReceiver =
BarcodeDataReceiver {
viewModel.addItem(it)
}
理想情况下,我希望使用
BarcodeDataReceiver
创建我的 koin
,但是当我使用 get<MyViewModel>()
时,我会得到 MyViewModel
的新实例。我知道koin
的viewModel { }
是一个工厂,但是有什么办法获得单例吗?
我尝试用
viewModel { }
包裹 single { }
,但这不起作用。
我不确定您是否已经找到问题的答案,但由于还没有答案,我将分享我找到的解决方案:
使用 Koin,可以像使用单个声明的任何其他对象一样将 ViewModel 创建为单例,无论它是完整的
single{SingletonViewModel(get())}
,使用 get() 可以接收 ViewModel 构造函数参数
或速记声明
singleOf(::SingletonViewModel)
并使用
koinInject<SingletonViewModel>()
注入代码中。
我在 KMM 应用程序中测试了这种方法,确实得到了相同的数据模型。我相信这也适用于纯 Android 应用程序。