diff --git a/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt b/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt index 0a1735755..7d18607db 100644 --- a/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt +++ b/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt @@ -14,7 +14,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.material.ripple.rememberRipple -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.ExperimentalComposeUiApi @@ -31,6 +30,7 @@ import org.tasks.R import org.tasks.activities.DateAndTimePickerActivity import org.tasks.compose.AddReminderDialog import org.tasks.compose.AlarmRow +import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.data.Alarm import org.tasks.data.Alarm.Companion.TYPE_DATE_TIME import org.tasks.data.Alarm.Companion.TYPE_REL_END @@ -135,7 +135,7 @@ class ReminderControlSet : TaskEditControlFragment() { it.alertContainer.setContent { MdcTheme { - val alarms = viewModel.selectedAlarms.collectAsState() + val alarms = viewModel.selectedAlarms.collectAsStateLifecycleAware() Column { alarms.value.forEach { alarm -> AlarmRow(alarmToString.toString(alarm)) { diff --git a/app/src/main/java/org/tasks/compose/FlowHelpers.kt b/app/src/main/java/org/tasks/compose/FlowHelpers.kt new file mode 100644 index 000000000..ba213180d --- /dev/null +++ b/app/src/main/java/org/tasks/compose/FlowHelpers.kt @@ -0,0 +1,39 @@ +package org.tasks.compose + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.State +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.remember +import androidx.compose.ui.platform.LocalLifecycleOwner +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.flowWithLifecycle +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.StateFlow +import kotlin.coroutines.CoroutineContext +import kotlin.coroutines.EmptyCoroutineContext + +// https://proandroiddev.com/how-to-collect-flows-lifecycle-aware-in-jetpack-compose-babd53582d0b + +@Composable +fun rememberFlow( + flow: Flow, + lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current +): Flow { + return remember(key1 = flow, key2 = lifecycleOwner) { flow.flowWithLifecycle(lifecycleOwner.lifecycle, Lifecycle.State.STARTED) } +} + +@Composable +fun Flow.collectAsStateLifecycleAware( + initial: R, + context: CoroutineContext = EmptyCoroutineContext +): State { + val lifecycleAwareFlow = rememberFlow(flow = this) + return lifecycleAwareFlow.collectAsState(initial = initial, context = context) +} + +@Suppress("StateFlowValueCalledInComposition") +@Composable +fun StateFlow.collectAsStateLifecycleAware( + context: CoroutineContext = EmptyCoroutineContext +): State = collectAsStateLifecycleAware(value, context)