首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >脚手架航行

脚手架航行
EN

Stack Overflow用户
提问于 2022-09-04 22:38:50
回答 1查看 73关注 0票数 1

我有一个应用程序使用Jetpack撰写。

我有两个屏幕:

代码语言:javascript
复制
1. NewsScreen
2. SettingsScreen

默认情况是NewsScreen。

我有一个叫NavHostAppNavigation.kt

代码语言:javascript
复制
@Composable
fun AppNavigation() {
val navController = rememberNavController()
val settingsViewModel: SettingsViewModel = viewModel()
NavHost(
    navController = navController,
    startDestination = AppScreens.NewsScreen.name
) {
    composable(AppScreens.NewsScreen.name) {
        NewsScreen(navController = navController, settingsViewModel)
    }
    composable(AppScreens.SettingsScreen.name) {
        SettingsScreen(navController = navController, settingsViewModel)
    }
}
}

还有枚举类:

代码语言:javascript
复制
enum class AppScreens {
NewsScreen,
SettingsScreen;
companion object {
    fun fromRoute(route: String): AppScreens
        = when (route?.substringBefore("/")) {
            NewsScreen.name -> NewsScreen
            SettingsScreen.name -> SettingsScreen
            else -> throw  IllegalArgumentException("Unknown route: $route")
    }
}
}

我的脚手架在HomePage.kt里是这样的

代码语言:javascript
复制
@Composable
fun HomeScreen(navController: NavController, settingsViewModel: SettingsViewModel) {
val scaffoldState = rememberScaffoldState()
val scope = rememberCoroutineScope()
Scaffold(
    Modifier.background(Color.Transparent),
    scaffoldState = scaffoldState,
    drawerContent = {
        CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
            Card(
                modifier = Modifier.padding(vertical = 15.dp),
                shape = RoundedCornerShape(15.dp, 0.dp, 0.dp, 15.dp),
            ) {
                Column(
                    modifier = Modifier.fillMaxHeight(),

                    verticalArrangement = Arrangement.SpaceBetween
        ) {
/* ... */
                }
            }
        }
    },
    bottomBar = {
        BottomAppNavigationBar(navController = navController)
    },
    floatingActionButton = {
        FloatingActionButton(
            backgroundColor = Color.White,
            modifier = Modifier.size(75.dp),
            onClick = { /* ... */ }
        ) {
            /* FAB content */
        }
    },
    floatingActionButtonPosition = FabPosition.Center,
    isFloatingActionButtonDocked = true,


    )
{ contentPadding ->
    // Screen content
    Box(
        modifier = Modifier
            .padding(contentPadding)
            .background(
                Color("#C8DBE2".toColorInt())
            )
    ) {
        TopAppBar(
            modifier = Modifier.padding(20.dp, 10.dp),
            backgroundColor = Color.Transparent,
            elevation = 0.dp
        ) {
            Row(
                Modifier.fillMaxWidth(),
                horizontalArrangement = Arrangement.SpaceBetween
            ) {
                NavMenuButton(scope, scaffoldState)
                ProfileMenuButton()
            }
        }

        CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
            NewsScreen(navController = navController)

        }
    }

}

}

最后,BottomAppNavigationBar

代码语言:javascript
复制
@Composable
fun BottomAppNavigationBar(navController: NavController) {
val navTextList = listOf(
    AppScreens.NewsScreen.name,
    AppScreens.SettingsScreen.name,
)
var selectIndex by remember { mutableStateOf(0) }
val iconList = listOf(
    painterResource(id = R.drawable.news),
    painterResource(id = R.drawable.settings),
)
BottomAppBar(
    // Defaults to null, that is, No cutout
    cutoutShape = MaterialTheme.shapes.small.copy(
        CornerSize(percent = 50)
    ),
    backgroundColor = Color.Transparent,
    elevation = 90.dp,
    modifier = Modifier
        .height(80.dp)
        .fillMaxWidth()
        .shadow(50.dp)
        .clip(
            (RoundedCornerShape(15.dp, 15.dp, 0.dp, 0.dp))
        )
) {
    Card(
        modifier = Modifier
            .fillMaxWidth()
            .padding(top = 5.dp)
            .background(Color.Transparent),
        shape = RoundedCornerShape(15.dp, 15.dp, 0.dp, 0.dp),
    ) {
        Row(
            horizontalArrangement = Arrangement.SpaceEvenly,
            modifier = Modifier.fillMaxWidth()
        ) {
            navTextList.forEachIndexed { index, str ->
                BottomNavigationItem(
                    label = { Text(str) },
                    selected = index == selectIndex,
                    modifier = Modifier.background(Color.White),
                    selectedContentColor = Color.LightGray,
                    unselectedContentColor = Color.Gray,
                    onClick = {
                        navController.navigate(str) {

                            navController.graph.startDestinationRoute?.let { screen_route ->
                                popUpTo(screen_route) {
                                    saveState = true
                                }
                            }
                            launchSingleTop = true
                            restoreState = true
                        }
                    },
                    icon = {
                        Icon(
                            modifier = Modifier
                                .size(47.dp)
                                .padding(top = 15.dp),
                            tint = Color.Black,
                            painter = iconList[index],
                            contentDescription = null
                        )
                    })
                if (index == 0) {
                    Spacer(modifier = Modifier.size(90.dp))
                }
            }
        }
    }
}

}

当单击底部导航栏时,如何使其更改为所有NewsScreen和SettingsScreen?

EN

回答 1

Stack Overflow用户

发布于 2022-09-13 08:02:15

您只需要调用navController.navigate(“路由”)就可以到达特定的路由。注意,该路由必须是应用程序导航中的注册路由。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73603243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档