作曲中的底部导航,如何在scoffold/navgraph之外导航

发布于 2025-02-04 19:28:25 字数 4605 浏览 4 评论 0原文

我使用的内容:

kotlin,jetpack构成

我想做的:

单击“登录”文本后,我想将用户导航到表格中

我目前有:

mainActivity.kt

class MainActivity : ComponentActivity() {

    private val viewModel: MainActivityViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        installSplashScreen().apply {
            setKeepOnScreenCondition {
                viewModel.isLoading.value
            }
        }
        setContent {
            RestaurantioTheme {
                Surface(Modifier.fillMaxSize()) {
                    val navController = rememberNavController()
                    Scaffold(
                        content = {padding ->
                            Column(
                                modifier = Modifier.padding(padding)
                            ) {
                                Navigation(navController = navController)
                            }
                        },
                        bottomBar = {
                            BottomNavigationBar(
                                items = listOf(
                                    BottomNavItem(
                                        name = "Home",
                                        route = "home",
                                        icon = Icons.Outlined.Home
                                    ),
                                    BottomNavItem(
                                        name = "Orders",
                                        route = "orders",
                                        icon = Icons.Outlined.ShoppingBag
                                    ),
                                    BottomNavItem(
                                        name = "Map",
                                        route = "map",
                                        icon = Icons.Outlined.Map
                                    ),
                                    BottomNavItem(
                                        name = "Profile",
                                        route = "profile",
                                        icon = Icons.Outlined.Person
                                    ),


                                ),

                                navController = navController,
                                onItemClick = {
                                    navController.navigate(it.route) {
                                        popUpTo(navController.graph.findStartDestination().id) {
                                            saveState = true
                                        }
                                        launchSingleTop = true
                                        restoreState = true
                                    }
                                }
                            )

                        }
                    )

               }
            }
        }
    }
}

bottomnav.kt

@Composable
fun Navigation (navController: NavHostController) {

    NavHost(navController = navController, startDestination = "home" ) {

        composable("home") {
            HomeScreen()
        }

        composable("orders") {
            OrdersScreen()
        }

        composable("map") {
            MapScreen()
        }

        composable("profile") {
            ProfileScreen()
        }

        composable("login") {
            MapScreen()
        }
    }
}

我尝试过的是

        ClickableText(
            AnnotatedString("Log In"),
            onClick = {

            })

我无法导航到登录屏幕。我已经尝试了这样的事情:

val navController = rememberNavController()
        Navigation(navController)
        ClickableText(
            AnnotatedString("Log In"),
            onClick = {
                navController.navigate("login")
            })

但是它无法按预期工作,因为我的配置文件上有房屋屏幕(启动屏幕),并且在单击登录文本后,我拥有此“临时” mapscreen。

我知道我做错了什么,但是我刚刚开始学习撰写,我真的无法理解嵌套导航的导航文档,正如我想在这里应该使用的那样。

我试图为配置文件的登录路线制作其他导航图,但是我无法打开个人资料屏幕,因为缺乏内存,

在我的情况下无效

根据文档添加嵌套导航,如果我有帮助,则 ,以下是ProfilesCreen可以组合的开始,也许我必须在那里通过一些论点。

@Composable
fun ProfileScreen(viewModel: AuthenticationViewModel = androidx.lifecycle.viewmodel.compose.viewModel()) {
...
}

What I use:

Kotlin, Jetpack Compose

What I want to do:

After clicking "Log In" text I would want to navigate user to the log in form

What I currently have:

MainActivity.kt

class MainActivity : ComponentActivity() {

    private val viewModel: MainActivityViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        installSplashScreen().apply {
            setKeepOnScreenCondition {
                viewModel.isLoading.value
            }
        }
        setContent {
            RestaurantioTheme {
                Surface(Modifier.fillMaxSize()) {
                    val navController = rememberNavController()
                    Scaffold(
                        content = {padding ->
                            Column(
                                modifier = Modifier.padding(padding)
                            ) {
                                Navigation(navController = navController)
                            }
                        },
                        bottomBar = {
                            BottomNavigationBar(
                                items = listOf(
                                    BottomNavItem(
                                        name = "Home",
                                        route = "home",
                                        icon = Icons.Outlined.Home
                                    ),
                                    BottomNavItem(
                                        name = "Orders",
                                        route = "orders",
                                        icon = Icons.Outlined.ShoppingBag
                                    ),
                                    BottomNavItem(
                                        name = "Map",
                                        route = "map",
                                        icon = Icons.Outlined.Map
                                    ),
                                    BottomNavItem(
                                        name = "Profile",
                                        route = "profile",
                                        icon = Icons.Outlined.Person
                                    ),


                                ),

                                navController = navController,
                                onItemClick = {
                                    navController.navigate(it.route) {
                                        popUpTo(navController.graph.findStartDestination().id) {
                                            saveState = true
                                        }
                                        launchSingleTop = true
                                        restoreState = true
                                    }
                                }
                            )

                        }
                    )

               }
            }
        }
    }
}

BottomNav.kt

@Composable
fun Navigation (navController: NavHostController) {

    NavHost(navController = navController, startDestination = "home" ) {

        composable("home") {
            HomeScreen()
        }

        composable("orders") {
            OrdersScreen()
        }

        composable("map") {
            MapScreen()
        }

        composable("profile") {
            ProfileScreen()
        }

        composable("login") {
            MapScreen()
        }
    }
}

What I've tried:

Inside my ProfileScreen() Composable I have

        ClickableText(
            AnnotatedString("Log In"),
            onClick = {

            })

But I can't navigate to login screen. I've tried something like this:

val navController = rememberNavController()
        Navigation(navController)
        ClickableText(
            AnnotatedString("Log In"),
            onClick = {
                navController.navigate("login")
            })

but it doesn't work as intended, because I have HomeScreen(start screen) on top of my ProfileScreen, and after clicking LogIn text I have this "temporary" MapScreen.

I know that I'm doing something wrong, but I've just started learning compose and I can't really understand navigation documentation for nested navigation, which as I suppose should be used here.

I've tried to make additional nav graph for Profile->login route, but I couldn't open Profile screen, because of lack of memory

Adding nested navigation as per documentation doesn't work att all in my case

If it helps, below is the beginning of ProfileScreen Composable, maybe I have to pass some argument there.

@Composable
fun ProfileScreen(viewModel: AuthenticationViewModel = androidx.lifecycle.viewmodel.compose.viewModel()) {
...
}

Image from Application

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烧了回忆取暖 2025-02-11 19:28:25

因此,经过几天的挣扎,我设法通过导航解决了我的问题,现在我必须弄清楚如何删除底部导航栏并添加后退按钮或在导航到登录屏幕后更改底部导航行为,因为此次导航之后,“配置文件”图标未选择,除非我按后按钮,否则我将无法返回个人资料屏幕。

我为解决此问题所做的工作:

bottomnav.kt.kt

@Composable
fun ProfileScreen(onItemClick: () -> Unit, // here I've added lambda function
    viewModel: AuthenticationViewModel = androidx.lifecycle.viewmodel.compose.viewModel()) {...}

我添加了简单的按钮,而没有样式等待:

Button(onClick = onItemClick) {
            
        }

和最后一个事情,在导航功能内部,我编辑了profilescreen composable:

@Composable
fun Navigation (navController: NavHostController) {

    NavHost(navController = navController, startDestination = "home" ) {

        composable("home") {
            HomeScreen()
        }

        composable("orders") {
            OrdersScreen()
        }

        composable("map") {
            MapScreen()
        }

        // this was edited
        composable("profile") {
            ProfileScreen(onItemClick = {
                navController.navigate("login")
            })

        }

        composable("login") {
                LoginScreen()
        }
    }
}

So after few days of struggle, I've managed to partially solve my issue with navigation, now I have to figure out how to remove bottom navigation bar and add back button or change bottom navigation behaviour after navigating to Login Screen, because after that navigation, "Profile" icon isn't selected and I can't go back to Profile Screen unless I press back button.

What I did to resolve this issue:

BottomNav.kt

@Composable
fun ProfileScreen(onItemClick: () -> Unit, // here I've added lambda function
    viewModel: AuthenticationViewModel = androidx.lifecycle.viewmodel.compose.viewModel()) {...}

I've added simple button without styling etc to navigate:

Button(onClick = onItemClick) {
            
        }

And the last thing, inside of Navigation function I've edited ProfileScreen composable:

@Composable
fun Navigation (navController: NavHostController) {

    NavHost(navController = navController, startDestination = "home" ) {

        composable("home") {
            HomeScreen()
        }

        composable("orders") {
            OrdersScreen()
        }

        composable("map") {
            MapScreen()
        }

        // this was edited
        composable("profile") {
            ProfileScreen(onItemClick = {
                navController.navigate("login")
            })

        }

        composable("login") {
                LoginScreen()
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文