My screen has one button and on click of it, I want to show a snackbar for short duration. So here is my composable:
@Composable
fun RegisterLocation(
navController: NavController,
locationVm: LocationViewModel = LocationViewModel()
) {
val uiState = locationVm.locationState.collectAsState(LocationUiState.Init)
val snackbarHostState = remember { SnackbarHostState() }
when (uiState.value) {
is LocationUiState.Init -> RegisterLocation(locationVm, snackbarHostState)
is LocationUiState.Invalid -> {
LaunchedEffect(locationVm.locationState.value) {
snackbarHostState.showSnackbar(
"Failed Creating Location. Try Again!!!"
)
}
}
is LocationUiState.Valid -> navController.popBackStack()
}
}
@Composable
fun RegisterLocation(locationVm: WLocationViewModel, snackbarHostState: SnackbarHostState) {
Box(Modifier.fillMaxSize()) {
Column {
SubmitLocation(locationVm)
}
Column(
Modifier
.fillMaxWidth()
.align(Alignment.BottomCenter)
) {
Text(text = "Hello") // <-- This is a dummy text and it shows in the UI. Moreover, it animates up to give space for snackbar. But the snackbar doesn't show up :(
RegistrationError(snackbarHostState)
}
}
}
@ExperimentalCoroutinesApi
@Composable
fun SubmitLocation(vm: WLocationViewModel) {
Button(
onClick = { vm.onCreate(LocationUiState.Invalid) },
modifier = Modifier.fillMaxWidth()
) {
Text(text = "Submit Location")
}
}
@Composable
fun RegistrationError(hostState: SnackbarHostState) {
SnackbarHost(
hostState = hostState,
modifier = Modifier.fillMaxWidth(),
snackbar = {
Snackbar {
Text(text = "Hello", color = Color.White)
}
}
)
}
What is wrong in this code? Any help would be appreciated.