Jetpack Compose 导航:登录屏幕和带有底部导航的不同屏幕

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

我的目标是拥有一个

LoginScreen
,我可以从中导航到
InternalScreen
InternalScreen
应该有/是一个底部导航栏,可以导航到内部空间中的多个其他屏幕/路线。

这就是我想象中的

NavGraph
应该是什么样子:

 - LoginScreen
 - internal space
   - InternalScreen with BottomNavigation
     - some fragment
     - some other fragment 

我的想法是在

Scaffold
可组合项中创建一个带有
BottomNavigationBar
InternalScreen
,但我不知道将其放在
NavGraph
中的位置,因为说
NavGraph
还必须包含
 的不同路线BottomNavigationBar

我应该如何处理这个问题?如果这个问题已经得到解答,我很抱歉,我找不到有关此特定案例的任何信息。

android-jetpack-compose jetpack-compose-navigation
1个回答
19
投票

我认为登录屏幕/流程必须是应用程序导航流程的一部分。 总之,您的应用程序必须对

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
可组合项是我的应用程序的根(在
setContent
MainActivity
中调用)。该应用程序的每个功能都有一个导航图。喜欢
booksGraph

fun NavGraphBuilder.booksGraph(
    auth: Auth, // this is a simple class which 
                // knows if the user is logged in
    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) // reset stack
                }
            }
        }
    }
}

如果您想查看完整的实现,这里是我的存储库的链接。

© www.soinside.com 2019 - 2024. All rights reserved.