In meinem ViewModel stellt der Zeitplan StateFlow alle Werte in der Datenbank dar, und der selectedDateAvailableTime StateFlow basiert darauf. Ich fülle meine Datenbank mit fillScheduleEntities(), aber die Benutzeroberfläche – die selectedDateAvailableTime erfasst – wird nicht mit den neuen Werten aktualisiert: Welches Datum auch immer ausgewählt ist, es werden nie irgendwelche Zeiten angezeigt.
Mein ViewModel:
@Dao
interface ScheduleDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertAll(scheduleEntities: List): List
@Query("SELECT * FROM ScheduleEntity")
fun getAll(): Flow
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MainLayout() {
val viewModel: CalendarViewModel = hiltViewModel()
val schedule by viewModel.schedule.collectAsStateWithLifecycle()
val selectedDate by viewModel.selectedDateUiState.collectAsStateWithLifecycle()
val time by viewModel.selectedDateAvailableTime.collectAsStateWithLifecycle()
val datePickerState = rememberDatePickerState(initialSelectedDate = selectedDate.toJavaLocalDate())
LaunchedEffect(datePickerState.selectedDateMillis) {
viewModel.onDateChanged(datePickerState.selectedDateMillis)
}
Column {
DatePicker(datePickerState)
LazyVerticalGrid(
columns = GridCells.Fixed(7),
) {
items(time) { curTime ->
Text(curTime.format(viewModel.timeFormat))
}
}
}
}
In meinem ViewModel stellt der Zeitplan StateFlow alle Werte in der Datenbank dar, und der selectedDateAvailableTime StateFlow basiert darauf. Ich fülle meine Datenbank mit fillScheduleEntities(), aber die Benutzeroberfläche – die selectedDateAvailableTime erfasst – wird nicht mit den neuen Werten aktualisiert: Welches Datum auch immer ausgewählt ist, es werden nie irgendwelche Zeiten angezeigt. Mein ViewModel: [code]@HiltViewModel class CalendarViewModel @Inject constructor(private val scheduleDao: ScheduleDao) : ViewModel() { init { fillScheduleEntities() }
val schedule: StateFlow = scheduleDao.getAll().stateIn( scope = viewModelScope, started = SharingStarted.Lazily, initialValue = emptyList(), ) private val selectedDate = MutableStateFlow(LocalDate(2026, 1, 1)) val selectedDateUiState = selectedDate.asStateFlow() val selectedDateAvailableTime: StateFlow = selectedDate.map { date -> getAvailableTimeForDate(date) }.stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5000), initialValue = emptyList(), )
fun onDateChanged(dateMillis: Long?) { if (dateMillis != null) { selectedDate.value = Instant.fromEpochMilliseconds(dateMillis) .toLocalDateTime(TimeZone.currentSystemDefault()).date } }
private fun getAvailableTimeForDate(date: LocalDate): List { val availableTime = mutableListOf() try { if (date.year > 2000) { availableTime.plus(schedule.value.firstOrNull { it.date == date }?.availableTime) } } catch (e: Exception) { availableTime.clear() Log.e("CalendarViewModel.getAvailableTimeForDate", e.toString()) throw (e) } return availableTime }
private fun getScheduleEntities(): List { val scheduleEntities = mutableListOf() try { val startDate = LocalDate(2000, 1, 1) val endDate = java.time.LocalDate.now().toKotlinLocalDate() val startTime = java.time.LocalTime.of(9, 0, 0) val endTime = java.time.LocalTime.of(18, 0, 0) val timeList = generateSequence(startTime) { it.plusMinutes(30) } .takeWhile { it item.format(timeFormat) }
@TypeConverter fun stringToListLocalTime(value: String?): List? = value?.split(',')?.map { item -> LocalTime.parse(item.trim(), timeFormat) } } [/code] Dao: [code]@Dao interface ScheduleDao { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertAll(scheduleEntities: List): List
@Query("SELECT * FROM ScheduleEntity") fun getAll(): Flow } [/code] Mein Compose-Layout: [code]@OptIn(ExperimentalMaterial3Api::class) @Composable fun MainLayout() { val viewModel: CalendarViewModel = hiltViewModel()
val schedule by viewModel.schedule.collectAsStateWithLifecycle() val selectedDate by viewModel.selectedDateUiState.collectAsStateWithLifecycle() val time by viewModel.selectedDateAvailableTime.collectAsStateWithLifecycle() val datePickerState = rememberDatePickerState(initialSelectedDate = selectedDate.toJavaLocalDate())
In meinem Android Jetpack Compose-Projekt mit Room-Datenbank ist das ViewModel ein in den Griff eingefügtes Dao und verfügt über eine Eigenschaft vom Typ StateFlow, deren Wert das Ergebnis des...
In meinem Android Jetpack Compose-Projekt mit Room-Datenbank ist das ViewModel ein in den Griff eingefügtes Dao und verfügt über eine Eigenschaft vom Typ StateFlow, deren Wert das Ergebnis des...
In meinem Android Jetpack Compose-Projekt mit Room-Datenbank ist das ViewModel ein in den Griff eingefügtes Dao und verfügt über eine Eigenschaft vom Typ StateFlow, deren Wert das Ergebnis des...
In meinem Android Jetpack Compose-Projekt mit Room-Datenbank ist das ViewModel ein in den Griff eingefügtes Dao und verfügt über eine Eigenschaft vom Typ StateFlow, deren Wert das Ergebnis des...
In meinem Android Jetpack Compose-Projekt mit Room-Datenbank ist das ViewModel ein in den Griff eingefügtes Dao und verfügt über eine Eigenschaft vom Typ StateFlow, deren Wert das Ergebnis des...