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

标签 android dependency-injection viewmodel android-architecture-components koin

我们在我们的项目中使用 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/

相关文章:

android - 安卓手机上的第一个工作日

android - ListActivity 和 Activity 之间有什么区别?

javascript - 如何获取用户在手机上使用的浏览器版本?

android - ViewModelProviders.of(getActivity()) "Cannot resolve method of(android.app.Activity)"

javascript - 模型属性更新时 UI 不更新,由 knockout ES5 跟踪

wpf - 在 MVVM 中,如何将 View 逻辑与模型和业务逻辑保持在 View 模型之外?

android - 扩展 MediaRouteButton 行为

Xamarin、Autofac、NavigationService 和 BeginLifetimeScope

flutter - 带参数的类的 Dart 依赖注入(inject)

c# - 如何在不同的范围内获取同一服务接口(interface)的多个实现