Marius Bosler
02/29/2024, 7:42 PMprivate val _state = MutableStateFlow(AlarmsScreenState());
val state : StateFlow<AlarmsScreenState> = _state.asStateFlow()
var alarms : MutableList<Alarm> = mutableListOf();
// Events
fun toggleAlarm(alarm: Alarm) {
alarms.find { it == alarm }?.let {
it.enabled = !it.enabled
}
_state.value = _state.value.copy(alarms = alarms.toList())
println(_state.value.alarms.find{it == alarm }?.enabled)
}
And even though the println statement prints text alternating between true and false, the Switch in the UI does not update. Even though the _state.value gets updated. What am I missing here?
Relevant passages in the UI:
@Composable
fun AlarmsScreen(
viewModel: AlarmViewModel = viewModel(),
) {
val state by viewModel.state.collectAsState()
Box(modifier = Modifier.fillMaxSize()) {
AlarmCardList(alarms = state.alarms, onToggleAlarm = viewModel::toggleAlarm )
and
@Composable
fun AlarmCardList(
alarms: List<Alarm>,
onToggleAlarm: (Alarm) -> Unit
) {
LazyColumn(
modifier = Modifier.padding(8.dp),
verticalArrangement = Arrangement.spacedBy(2.dp)
) {
items(alarms) { alarm ->
AlarmCard(alarm) { onToggleAlarm(alarm) }
}
}
}
Let me know if I forgot to give some information, it would be amazing if you could help me 🙂Zach Klippenstein (he/him) [MOD]
02/29/2024, 8:21 PMAlarmsScreenState.enabled
a snapshot state object?Zach Klippenstein (he/him) [MOD]
02/29/2024, 8:22 PMMarius Bosler
02/29/2024, 8:58 PMdata class AlarmsScreenState(
val alarms: List<Alarm> = emptyList(),
val isAlarmCreationOpen: Boolean = false,
val currentEditedAlarm: Alarm? = null,
)
and my Alarm looks like this (annotations from Room)
@Entity
data class Alarm(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
val schedule: Schedule? = null,
var enabled: Boolean = true,
)
Marius Bosler
02/29/2024, 8:59 PMZach Klippenstein (he/him) [MOD]
02/29/2024, 10:26 PMMarius Bosler
03/01/2024, 1:31 AMval index = alarms.indexOfFirst { it == alarm }
if (index != -1) {
alarms[index] = alarms[index].copy(enabled = !alarms[index].enabled)
}
_state.value = _state.value.copy(alarms = alarms.toList())