【发布时间】:2021-08-04 22:37:28
【问题描述】:
我的屏幕有一个按钮,点击它,我想在短时间内显示一个小吃栏。所以这是我的可组合:
@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)
}
}
)
}
这段代码有什么问题?任何帮助将不胜感激。
【问题讨论】:
-
你试过用 coroutineScope.launch 代替 LaunchedEffect 吗?
-
检查
coroutineScope.launch(Dispatchers.Main) {}不工作。直接启动协程也会出现以下错误。Calls to launch should happen inside a LaunchedEffect and not composition@GabrieleMariotti
标签: android android-jetpack-compose