当 KOIN 图重新组装时,委托函数 viewmodel() 不刷新视图模型实例



我们在项目中使用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 点(。

科因文档

相关内容

  • 没有找到相关文章