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

7

我的目标是拥有一个LoginScreen,从中可以导航到一个InternalScreenInternalScreen 应该具有 / 是底部导航栏,可以导航到内部空间中的多个其他屏幕/路由。

这就是我想象中的NavGraph应该是什么样子:

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

我的想法是在InternalScreen可组合部件中创建一个带有BottomNavigationBarScaffold,但我不知道在我的NavGraph中应该把它放在哪里,因为该NavGraph还必须包含BottomNavigationBar的各个路由。

我该如何处理?如果已经回答过这个问题,我很抱歉,因为我没有找到与这种情况有关的任何信息。

1个回答

15
我认为登录界面/流程必须是应用程序导航流程的一部分。简而言之,您的应用程序必须对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, // 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
                }
            }
        }
    }
}

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


这正是我担心的事情,不得不这样做。感谢您详细的描述。 - Einliterflasche
这是否意味着,在这种情况下,如果我们想要在登录后显示一个BottomTabBar,则需要根据当前屏幕的情况来显示和隐藏它的可见性?即在登录时将其隐藏,并在用户登录后显示它? - Karan_Rana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接