При повторной сборке графа KOIN делегируйте функцию viewmodel (), не обновляя экземпляр viewmodel

мы используем в нашем проекте KOIN как библиотеку DI.

в некоторых случаях, когда экземпляр ViewModel не обновляется, когда контекст Koin убивает и воссоздает снова. Нам необходимо реализовать такую ​​функцию, как «повторная сборка графа зависимостей во время выполнения», и эта проблема очень важна для нас.

У меня есть такой модуль 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() вызывает - все в порядке, другие экземпляры в графике обновляются, но модели представления, внедренные в активность, - нет, и они сохраняют старые ссылки. Я предполагаю, что эта модель просмотра привязана к жизненному циклу активности и может помочь в восстановлении активности, но я думаю, что это не лучшее решение.

У кого-нибудь такие же проблемы? И помогите пожалуйста советом, как решить, пожалуйста.


person Scrobot    schedule 19.04.2019    source источник


Ответы (1)


Вы можете сделать это с помощью области видимости в KOIN.

1) Определите свои ViewModels в области видимости

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

person Sagar Kacha    schedule 16.05.2019