Передача данных между двумя ViewModels - Jetpack Compose

Из заголовка понятно, что я пытаюсь передать данные из 1vm во 2vm. Использую BottomNavigationBar вместе с Jetpack Navigation. Экраны очень простые. в ScheduleScreen я выбираю дни (пн-вс) кликая по textButtin. Если день выбран то записываю его в массив. Например если выбрана среда, то массив

daysChoosen(0, 0, 1, 0, 0, 0, 0)

Этот массив хранится в vm - ScheduleScreenVM. Теперь я хочу переключится на CalendarScreen, у которой свом vm - CalendarScreenVM и увидеть массив из ScheduleScreenVM.

CalendarScreenVM:

class CalendarScreenVM(): ViewModel() {

    //state
    var openDialog by mutableStateOf(false)
    var monthString by mutableStateOf(CalendarData(currentMonth = Calendar.MONTH+2).currentMonth())
    var test by mutableStateOf(CalendarData().currentMonthINT(monthString))
    var weekList by mutableStateOf(CalendarData().weeksList(Calendar.getInstance(),test-1))
    var daysChoosen by mutableStateOf(ScheduleScreenVM().daysChoosen) //вот тут я пытаюсь вытащить значения
//...
}

ScheduleScreenVM:

class ScheduleScreenVM (): ViewModel() {

    //state
    var daysChoosen by mutableStateOf(mutableListOf(0,0,0,0,0,0,0))

    var rememem by mutableStateOf(
        SnapshotStateList<Boolean>().also {
            for(day in 0..6){
                it.add(false)
            }
        }
    )
//...
}

В @Composable функциях показываю текст на обоих экранах простым

Text("${viewModel.daysChoosen}")

В ScheduleScreen все ок. В CalendarScreen ничего не меняется. Как я понял лучшее решение в такой ситуации это использовать romm и hilt? Если это так, то как выглядит самое простое решение. Из кучи примеров из интернета я мало что понял о использовании этих двух библиотек вместе.


Ответы (1 шт):

Автор решения: Wlad

а причем тут Jetpack Compose ? идея архитектуру как раз в том, чтобы они подходила под любую реализацию UI.
вам надо передать даныне из 1-ой ВМ в другую.

Вариант №1.
если у вас фрагменты - то вы можете использовать sharedViewModel.
это тип ВМ, у которой владельцем является Активити и она привязывает к ее ЖЦ.
таким образом все фрагменты в этой Активити смог получить "общие" данные.

Вариант №2. у вас не фрагменты. (стоит задумать о том, чтобы использовать их).
вам надо создать какой Репозиторий, который будет статичным (сингл в DI).
1ая ВМ кладет/ложит туда данные. 2ая ВМ - забирает их оттуда.
да, вы можете подключить Рум, но это все таки более тяжелая библиотека. и данные будут "переживать" ЖЦ приложения (т.е. храниться постоянно).

→ Ссылка