gpt4 book ai didi

android - KOIN 图重组时,委托(delegate)函数 viewmodel() 不刷新 viewmodel 实例

转载 作者:行者123 更新时间:2023-11-29 16:30:50 26 4
gpt4 key购买 nike

我们在我们的项目中使用 KOIN像 DI 库。

在某些情况下,当 Koin 上下文正在终止并重新创建时,ViewModel 实例未刷新。我们需要实现像“在运行时重组依赖图”这样的功能,这个问题对我们来说非常关键。

我有这样的 ViewModel 模块:

object ViewModelModule {
val module by lazy {
module {
viewModel { AppLauncherViewModel(get(), get(), get(), get()) }
viewModel { AuthLoginPasswordViewModel(get(), get()) }
viewModel { SettingsViewModel(get(), get()) }
// some others
}
}
}

我的图表是通过这种方式在 android 应用程序中组装的:

    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() 被调用时——一切都很好,图中的另一个实例正在刷新,但注入(inject)到 Activity 中的 ViewModels 却没有,它们保留了旧的引用。我想,该 View 模型附加到 Activity 生命周期,可以帮助 Activity 重新创建,但我认为这不是最佳解决方案。

有人遇到同样的问题吗?请帮我提供建议,请如何解决。

最佳答案

您可以在 KOIN 中使用作用域来做到这一点。

1) 在范围内定义您的 ViewModel

scope(named("ViewModelScope")){
viewModel {
AppLauncherViewModel(get(), get(), get(), get())
AuthLoginPasswordViewModel(get(), get())
SettingsViewModel(get(), get())
}
}

2) 在您的应用程序类中使用以下行创建该特定范围。

val viewModelScope = getKoin().getOrCreateScope("ViewModelScope")

以上代码用于获取ViewModel。当你想重新创建范围时,你只需要关闭范围并重新创建。要关闭范围,请使用以下代码。

val viewModelScopeSession = getKoin().getOrCreateScope("ViewModelScope")
viewModelScopeSession.close()

一旦范围关闭,那么无论何时您请求创建或获取范围,它都会根据您的要求返回新实例。

如需进一步引用,您可以查看以下链接(第 8 点)。

Koin documentation

关于android - KOIN 图重组时,委托(delegate)函数 viewmodel() 不刷新 viewmodel 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55758617/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com