При повторной сборке графика KOIN делегировать функцию viewmodel () не обновляя экземпляр viewmodel - PullRequest
1 голос
/ 19 апреля 2019

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

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

1 Ответ

3 голосов
/ 16 мая 2019

Вы можете сделать это с помощью scope в 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

...