Cha*_*har 7 android android-jetpack-compose
我的屏幕有一个按钮,单击它后,我想在短时间内显示一个小吃栏。所以这是我的可组合项:
@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)
}
}
)
}
Run Code Online (Sandbox Code Playgroud)
这段代码有什么问题?任何帮助,将不胜感激。
San*_*Sur 13
SnackbarHostState显示 a snackbarin aScaffold或 可以作为参数传递给可SnackBar组合项。
为什么小吃店主机不显示小吃店?
每当state更改时,snackBar 就没有任何Scaffold或 aSnackbarHost来显示内容。(snackbarHostState也可以在撰写SnackBar您已经完成的内容时通过 -检查解决方案 2)
在无效状态期间,您既没有使用 a ,也没有通过使用 a 来Scaffold编写 a 。SnackBarHostsnackBarHostState
解决方案1
我们需要附加SnackbarHostStateaScaffold才能使其显示。
when (uiState.value) {
is LocationUiState.Init -> RegisterLocation(locationVm, snackbarHostState)
is LocationUiState.Invalid -> {
LaunchedEffect(locationVm.locationState.value) {
snackbarHostState.showSnackbar(
"Failed Creating Location. Try Again!!!",
"label",
duration = SnackbarDuration.Long
)
}
Scaffold(
// attach snackbar host state to the scaffold
scaffoldState = rememberScaffoldState(snackbarHostState = snackbarHostState),
content = { } // content is not mandatory
)
}
}
Run Code Online (Sandbox Code Playgroud)

解决方案 2:-
你永远不会RegisterLocation(locationVm, snackbarHostState)在无效状态下作曲。根据代码,如果我们RegisterLocation在无效状态下组合可组合项,那么还应该显示一个作为可组合项添加的小吃栏。
when (uiState.value) {
is LocationUiState.Init -> RegisterLocation(locationVm, snackbarHostState)
is LocationUiState.Invalid -> {
RegistrationError(hostState = snackbarHostState)
LaunchedEffect(locationVm.locationState.value) {
snackbarHostState.showSnackbar(
"Failed Creating Location. Try Again!!!",
"label",
duration = SnackbarDuration.Long
)
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新(详细说明)
Compose 维护了一个GroupArray底层,其中包含根据其位置在屏幕上绘制的所有 UI 元素。因此,在重新组合期间,它仅比较并显示重新组合期间绘制的 UI 元素,并删除在先前组合期间构建的其他组件redundant(如我们在重新组合期间不访问的 UI 组件)被删除)。
对于您的情况:- 两者states完全不同,我们在第二次作曲期间永远不会访问该Init州。因此,compose 在重新组合期间看到我们永远不会访问该状态,因此它会从内存中删除 UI。(在引擎盖下使用)。InitInitpositional memoisation
请检查引擎盖下的撰写
| 归档时间: |
|
| 查看次数: |
8405 次 |
| 最近记录: |