StateFlow wird nicht aktualisiert, wenn Einträge in die zugrunde liegende Room-Datenbank eingefügt werdenAndroid

Forum für diejenigen, die für Android programmieren
Anonymous
 StateFlow wird nicht aktualisiert, wenn Einträge in die zugrunde liegende Room-Datenbank eingefügt werden

Post by Anonymous »

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: Select all

@HiltViewModel
class CalendarViewModel @Inject constructor(private val scheduleDao: ScheduleDao) : ViewModel() {
init {
fillScheduleEntities()
}

val timeFormat = LocalTime.Format { hour(); char(':'); minute(); char(':'); second() }

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) }
}
Dao:

Code: Select all

@Dao
interface ScheduleDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertAll(scheduleEntities: List): List

@Query("SELECT * FROM ScheduleEntity")
fun getAll(): Flow
}
Mein Compose-Layout:

Code: Select all

@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))
}
}
}
}
Mein Projekt-Repo

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post