Коин sharedViewModel с SavedStateHandle

У меня одно приложение активности и несколько фрагментов. Некоторые из этих фрагментов используют мою модель просмотра, обычно примерно так:

private val myViewModel: MyViewModel by sharedViewModel()

Что, если я хочу, чтобы модель одновременно shared и сохраняла свое состояние с помощью SavedStateHandle? Я не могу понять, поддерживается ли это, и если да, то как его нужно использовать (объявление модели просмотра как stateViewModel в активности хостинга не работает).


person ror    schedule 19.04.2020    source источник


Ответы (1)


Обновление: поскольку появился коин 2.1.6, они представили org.koin.androidx.viewmodel.ext.android.stateSharedViewModel, который вы можете использовать в своих фрагментах.


Хорошо, после часа копания образцов Koin и выяснения нескольких ошибок:

  1. Предполагая, что ваша модель представления похожа на эту:
class SavedStateViewModel(val handle: SavedStateHandle, val service: SimpleService) 
  1. ... и ваш DI выглядит так:
viewModel { (handle: SavedStateHandle) -> SavedStateViewModel(handle, get()) }
  1. Ваша модель представления общего состояния может быть использована в ваших фрагментах следующим образом:
val sharedSaved: SavedStateViewModel by sharedViewModel()
  1. (важно!) Вам понадобится это объявление в вашей деятельности:
lateinit var savedVm: SavedStateViewModel
  1. (важно) Вы должны вызвать это сразу после super.onCreate(savedInstanceState) в своей деятельности:
savedVm  = getStateViewModel() 

Важно не использовать ленивую версию для вышеуказанного (stateViewModel).

person ror    schedule 20.04.2020
comment
Вы работали с модулем koin multi в проекте приложения для Android? - person sashabeliy; 21.04.2020
comment
Неа. для чистой архитектуры? да, но он не подходит (слишком сложный, мало преимуществ) для большинства реальных проектов. раздута! - person ror; 21.04.2020
comment
Разве вам не нужно было бы также ввести дескриптор сохраненного состояния в действие? Как действие может создать SavedStateViewModel без передачи дескриптора в качестве параметра - person 11m0; 11.01.2021