我的 apk 出现错误。第一个小吃栏显示后,每当我旋转屏幕时,它都会再次显示该小吃栏。每当屏幕旋转时,我不想显示任何小吃栏。它发生在
RegistrationUiState.Error
状态。
有人可以帮我找出问题所在吗?如果您想要完整的代码,请参阅此https://github.com/openMF/mifos-mobile/pull/2565或询问我是否需要任何部分
这就是我的代码
@Composable
fun UpdatePasswordScreen(
viewModel: UpdatePasswordViewModel = hiltViewModel(),
navigateBack: () -> Unit
) {
val uiState by viewModel.updatePasswordUiState.collectAsStateWithLifecycle()
UpdatePasswordScreen(
uiState = uiState,
navigateBack = navigateBack
)
}
@Composable
fun UpdatePasswordScreen(
uiState: RegistrationUiState,
navigateBack: () -> Unit
) {
val context = LocalContext.current
val snackbarHostState = remember { SnackbarHostState() }
Scaffold(snackbarHost = {
SnackbarHost(hostState = snackbarHostState)
}, topBar = {
MifosTopBar(
title = { Text(text = stringResource(id = R.string.change_password)) },
navigateBack = navigateBack
)
}) {
Box(
modifier = Modifier.padding(it)
) {
UpdatePasswordContent()
when (uiState) {
is RegistrationUiState.Loading -> {
MifosProgressIndicator(
modifier = Modifier
.fillMaxSize()
.background(MaterialTheme.colorScheme.background.copy(0.8f))
)
}
is RegistrationUiState.Error -> {
LaunchedEffect(snackbarHostState) {
snackbarHostState.showSnackbar(
context.getString(R.string.could_not_update_password_error),
context.getString(R.string.dialog_action_ok),
duration = SnackbarDuration.Short
)
}
}
is RegistrationUiState.Initial -> Unit
is RegistrationUiState.Success -> {
LaunchedEffect(snackbarHostState) {
snackbarHostState.showSnackbar(
context.getString(R.string.password_changed_successfully),
context.getString(R.string.dialog_action_ok),
duration = SnackbarDuration.Short
)
}
navigateBack.invoke()
}
}
}
}
}
此处
UpdatePasswordContent()
包含屏幕内容。如果您还需要什么,请告诉我
原因是 Activity 重新创建并重新启动。
您可以使用 rememberSaveable 方法,通过它您可以跨活动和进程重新创建保留状态。
对于您的情况,您可以只保存布尔值来指示是否显示小吃栏。 简单的例子:
var showSnackBar by rememberSaveable { mutableStateOf(true) }
...
Scaffold(snackbarHost = {
SnackbarHost(hostState = snackbarHostState)
}) {
Box(
modifier = Modifier.padding(it)
) {
if (showSnackBar) {
LaunchedEffect(snackbarHostState) {
snackbarHostState.showSnackbar(
"Message",
"label",
duration = SnackbarDuration.Short
)
showSnackBar = false
}
}
}
}