作曲中的底部导航,如何在scoffold/navgraph之外导航
我使用的内容:
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()) {
...
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
因此,经过几天的挣扎,我设法通过导航解决了我的问题,现在我必须弄清楚如何删除底部导航栏并添加后退按钮或在导航到登录屏幕后更改底部导航行为,因为此次导航之后,“配置文件”图标未选择,除非我按后按钮,否则我将无法返回个人资料屏幕。
我为解决此问题所做的工作:
bottomnav.kt.kt
我添加了简单的按钮,而没有样式等待:
和最后一个事情,在导航功能内部,我编辑了profilescreen composable:
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
I've added simple button without styling etc to navigate:
And the last thing, inside of Navigation function I've edited ProfileScreen composable: