每当我旋转屏幕时,小吃栏都会再次显示

问题描述 投票:0回答:1

我的 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()
包含屏幕内容。如果您还需要什么,请告诉我

android kotlin user-interface android-jetpack-compose snackbar
1个回答
0
投票

原因是 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
                }
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.