Передача данных между двумя 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 шт):
а причем тут Jetpack Compose ? идея архитектуру как раз в том, чтобы они подходила под любую реализацию UI.
вам надо передать даныне из 1-ой ВМ в другую.
Вариант №1.
если у вас фрагменты - то вы можете использовать sharedViewModel.
это тип ВМ, у которой владельцем является Активити и она привязывает к ее ЖЦ.
таким образом все фрагменты в этой Активити смог получить "общие" данные.
Вариант №2.
у вас не фрагменты. (стоит задумать о том, чтобы использовать их).
вам надо создать какой Репозиторий, который будет статичным (сингл в DI).
1ая ВМ кладет/ложит туда данные. 2ая ВМ - забирает их оттуда.
да, вы можете подключить Рум, но это все таки более тяжелая библиотека. и данные будут "переживать" ЖЦ приложения (т.е. храниться постоянно).