我认为登录界面/流程必须是应用程序导航流程的一部分。简而言之,您的应用程序必须对
isLoggedIn
状态做出反应,该状态应该是全局的,如果用户没有登录,则必须显示登录界面。
这就是我所做的:
@Composable
fun MainNavigation(
viewModel: MainViewModel,
navController: NavHostController,
) {
val auth = viewModel.auth
val initialRoute =
if (auth.isLoggedIn()) BooksFeature.route else LoginFeature.route
AnimatedNavHost(
navController,
startDestination = initialRoute
) {
loginGraph(auth, navController)
booksGraph(auth, navController)
settingsGraph(navController)
}
}
MainNavigation
可组合是我的应用程序的根(在MainActivity
中使用setContent
调用)。应用程序的每个功能都有一个导航图。例如booksGraph
:
fun NavGraphBuilder.booksGraph(
auth: Auth,
navController: NavHostController
) {
navigation(
route = BooksFeature.route,
startDestination = BooksList.route,
) {
composable("ScreenA") {
ScreenA()
}
...
}
}
在我的活动中(我只使用一个活动),我正在观察登录状态并正确地重定向到登录屏幕。
private fun launchLoginObserver() {
lifecycleScope.launch(Dispatchers.Main) {
mainViewModel.isLoggedIn.collect { isLoggedInState ->
if (isLoggedInState == false) {
navigationController.navigate(LoginScreen.route) {
popUpTo(0)
}
}
}
}
}
如果您想查看完整的实现代码,这里是我的代码库的链接。