Очистка sharedViewModel

Я использую Koin для вставки viewModel во фрагмент. Мое приложение - одно действие. Мне нужна эта sharedViewModel только в servisFragment и partFragment. Я хотел бы удалить этот viewModel из Activity после навигации, отмеченной красным.

Как я могу это сделать?

навигация

Код для внедрения viewModel

    private val servisViewModel by sharedViewModel<ServisViewModel>()

Коин sharedViewModel

inline fun <reified T : ViewModel> Fragment.sharedViewModel(
    name: String? = null,
    noinline from: ViewModelStoreOwnerDefinition = { activity as 
    ViewModelStoreOwner },
    noinline parameters: ParametersDefinition? = null
) = lazy { getSharedViewModel<T>(name, from, parameters) }

Спасибо за любую помощь.


person solaza    schedule 10.07.2019    source источник
comment
В традиционном вложенном фрагменте мы можем использовать by sharedViewModel(from = { parentFragment as ViewModelStoreOwner}) для привязки жизненного цикла ViewModel к жизненному циклу родительского фрагмента. Но в компоненте навигации я не знаю, как получить экземпляр родительского фрагмента.   -  person HvSimon    schedule 11.07.2019
comment
Мне удалось выполнить привязку с помощью Koin и кода выше, но я не знаю, как очистить / расчленить его, и если это вообще необходимо.   -  person solaza    schedule 11.07.2019
comment
Вам не нужно очищать, как by viewModel() может автоматически очищаться при уничтожении фрагмента.   -  person HvSimon    schedule 11.07.2019
comment
Добавлен код для sharedViewModel. Очищается ли он при уничтожении фрагмента, даже если он использует активность как ViewModelStoreOwner, как в коде выше?   -  person solaza    schedule 11.07.2019
comment
Вы пользуетесь навигационным компонентом? Если это правда, вы не можете получить родительский фрагмент, вызвав getParentFragment(). Он всегда возвращает NavHostFragment, а не ваш servisFragment.   -  person HvSimon    schedule 11.07.2019
comment
Да я им пользуюсь. Зачем нужен родительский фрагмент? Как я уже сказал, у меня есть одно приложение Activity и все фрагменты внутри этого Activity.   -  person solaza    schedule 11.07.2019
comment
I need that sharedViewModel only in servisFragment and partFragment. На вашем графике partFragment - дочерний фрагмент, а servisFragment - родительский фрагмент. Итак, если мы сможем привязать sharedViewModel к родительскому фрагменту, sharedViewModel будет очищен, когда вы перейдете по красному пути.   -  person HvSimon    schedule 11.07.2019
comment
Взгляните на github.com/InsertKoinIO/koin/issues/183 и ответ на него.   -  person HvSimon    schedule 11.07.2019
comment
Когда я использую findNavController().navigate(ServisFragmentDirections.Action_servisFragment_to_menuFragment()), чтобы вернуться к menuFragment, а затем снова перейти к servisFragment, все еще в нем (данные не очищены).   -  person solaza    schedule 11.07.2019
comment
Проверьте свой родительский фрагмент в partFragment. Если вы привяжете не того родителя, ViewModel будет нечетким   -  person HvSimon    schedule 11.07.2019
comment
Как вы сказали ранее, getParentFragment() возвращает NavHostFragment. Есть ли способ получить servisFragment?   -  person solaza    schedule 11.07.2019


Ответы (1)


если вам нужно удалить все viewModels из этого Fragment, попробуйте это в своем Fragment

viewModelStore.clear()

если вам нужно очистить бетон ViewModel попробуйте это

getViewModelStore(ViewModelParameters(...)).clear()
person Hayk Melkonyan    schedule 05.08.2019