我们在项目中使用KOIN,就像DI库一样。
在某些情况下,当 ViewModel 实例不刷新时,Koin 上下文正在终止并再次重新创建。我们需要实现">在运行时重新组装依赖关系图"之类的功能,这个问题对我们来说非常关键。
我有这样的视图模型模块:
object ViewModelModule {
val module by lazy {
module {
viewModel { AppLauncherViewModel(get(), get(), get(), get()) }
viewModel { AuthLoginPasswordViewModel(get(), get()) }
viewModel { SettingsViewModel(get(), get()) }
// some others
}
}
}
我的图形通过以下方式在安卓应用程序中组装:
private fun assembleGraph() {
val graph = listOf(
AppModule.module,
StorageModule.module,
DatabaseConfigModule.module,
RepositoryModule.module,
InteractorModule.module,
ViewModelModule.module
)
application.startKoin(application, platformGraph)
}
fun reassembleGraph() {
stopKoin()
assembleGraph()
}
当reassembleGraph()
调用时 - 一切都很好,图中的另一个实例正在刷新,但注入活动的 ViewModel 不是,它们保留了旧的引用。我想,该视图模型附加到活动生命周期,可以帮助活动重新创建,但我认为这不是最好的解决方案。
有没有人有同样的问题?请帮我提供建议,请如何解决。
你可以在 KOIN 中使用 scope 来做到这一点。
1( 在范围内定义视图模型
scope(named("ViewModelScope")){
viewModel {
AppLauncherViewModel(get(), get(), get(), get())
AuthLoginPasswordViewModel(get(), get())
SettingsViewModel(get(), get())
}
}
2( 在应用程序类中使用以下行创建该特定范围。
val viewModelScope = getKoin().getOrCreateScope("ViewModelScope")
上面的代码用于获取视图模型。当您想要重新创建范围时,您只需要关闭范围并再次重新创建。要关闭范围,请使用以下代码。
val viewModelScopeSession = getKoin().getOrCreateScope("ViewModelScope")
viewModelScopeSession.close()
关闭范围后,每当此时请求创建或获取范围时,它将根据您的要求返回新实例。
如需进一步参考,请参阅以下链接(第 8 点(。
科因文档