Colton Idle
10/24/2021, 5:07 AMif (viewModel.state.snackBarMessage.isNotEmpty()) {
coroutineScope.launch {
scaffoldState.snackbarHostState.showSnackbar(viewModel.state.snackBarMessage)
viewModel.state.snackBarMessage = ""
}
}
I get hit with a lint warning though.
Calls to async or launch should happen inside a LaunchedEffect and not composition
Can anyone point me in the right direction over the fix? Changing the if
with LaunchedEffect
makes the lint error go away, but I'm not sure if that's "right"/idiomatic compose here.Albert Chang
10/24/2021, 5:17 AMChannel
(or SharedFlow
depending on what you need) and collect it in a LaunchedEffect
.Colton Idle
10/24/2021, 1:02 PMColton Idle
10/24/2021, 2:24 PMAlbert Chang
10/24/2021, 5:10 PMWould I simply wrap it in a launched effect like I said?
Yes. The problem with your code is that you are launching a new coroutine on every recomposition, which is obviously not what you want.
Albert Chang
10/24/2021, 5:17 PMhasError
as a state. However what you are doing is setting the state from view model and clearing the state from UI. Modifying a state from both layers is absolutely a code smell.Colton Idle
10/24/2021, 10:26 PMLaunchedEffect (viewModel.state.snackBarMessage.isNotEmpty()) {
coroutineScope.launch {
scaffoldState.snackbarHostState.showSnackbar(viewModel.state.snackBarMessage)
viewModel.state.snackBarMessage = ""
}
}
2.
LaunchedEffect (viewModel.state.snackBarMessage) {
if (viewModel.state.snackBarMessage.isNotEmpty()) {
coroutineScope.launch {
scaffoldState.snackbarHostState.showSnackbar(viewModel.state.snackBarMessage)
viewModel.state.snackBarMessage = ""
}
}
}
3.
if (viewModel.state.snackBarMessage.isNotEmpty()) {
LaunchedEffect (viewModel.state.snackBarMessage) {
coroutineScope.launch {
scaffoldState.snackbarHostState.showSnackbar(viewModel.state.snackBarMessage)
viewModel.state.snackBarMessage = ""
}
}
}
Albert Chang
10/25/2021, 4:10 AMcoroutineScope.launch {}
as it is unnecessary and will break the cancellation of LaunchedEffect
.
If you want to show a new snack bar when the message changes, you should go with 2 or 3. They are essentially the same.Colton Idle
10/25/2021, 2:49 PM