如何使用 navController 在 Jetpack Compose 中从一个屏幕导航到另一个屏幕?

How to navigate from a screen to another in Jetpack Compose using navController?

我有这样的结构:

val navController = rememberNavController()
NavHost(
    navController = navController,
    startDestination = "auth"
) {
    composable(
        route = "auth"
    ) {
        AuthScreen(
            navController = navController
        )
    }
    composable(
        route = "profile"
    ) {
        ProfileScreen(
            navController = navController
        )
    }
}

当我第一次打开应用程序时,根据身份验证状态显示屏幕:

if (!viewModel.isUserAuthenticated) {
    AuthScreen(navController = navController)
} else {
    ProfileScreen(navController = navController)
}

效果很好。问题来了,当我尝试在 AuthScreen 中输入时:

when(val response = authViewModel.signInState.value) {
    is Response.Loading -> CircularProgressIndicator()
    is Response.Success -> {
        if (response.data) {
            navController.navigate("profile")
            Log.d(TAG, "Success")
        }
    }
    is Response.Error -> Log.d(TAG, response.message)
}

日志语句打印“成功”,但没有导航到下一个 ProfileScreen。如何解决?

您可以从 setContent 中删除 if-else。相反,将 ProfileScreen 作为主页目的地,您可以在其中检查用户是否已通过身份验证。如果他不在,请导航至 AuthScreen

@Composable
fun ProfileScreen(navController: NavController) {
    LaunchedEffect(Unit) {
        if(!viewModel.isUserAuthenticated) {
            navController.navigate("auth")
        }
    }
}

如果用户可以从此屏幕注销(即身份验证状态可以更改),则不要使用 Unit,而是使用 viewModel.isUserAuthenticated 作为 LaunchedEffect 的密钥(假设 isUserAuthenticatedState)