【发布时间】:2022-12-14 22:53:38
【问题描述】:
我想实现一个简单的用户流程,用户可以看到多个屏幕来输入数据。该流程应该共享一个公共导航栏,其中每个屏幕都可以在其处于活动状态时贡献其菜单项(例如添加“搜索”或“下一步”按钮)。导航栏也有概念上属于用户流的按钮,而不是单独的屏幕(如后退按钮和关闭按钮)。屏幕应该可以在其他上下文中重复使用,因此屏幕不应该知道它们在其中运行的流程。
从技术上讲,用户流是作为定义导航栏和使用组合导航的组合函数实现的。每个屏幕都作为一个单独的组合函数实现。
在基于片段/视图的 Android 中,onCreateOptionsMenu 和相关函数开箱即用地支持这种情况。但是我将如何在撰写中做到这一点?我找不到关于该主题的任何指导。
用代码来说明问题:
@Composable
fun PaymentCoordinator(
navController: NavHostController = rememberNavController()
) {
AppTheme {
Scaffold(
bottomBar = {
BottomAppBar(backgroundColor = Color.Red) {
IconButton(onClick = navController::popBackStack) {
Icon(Icons.Filled.ArrowBack, "Back")
}
Spacer(modifier = Modifier.weight(1f))
// 0..n IconButtons provided by the active Screen
// should be inserted here
// How can we do that, because state should never
// go up from child to parent
// this button (or at least its text and onClick action) should
// be defined by the currently visible Screen as well
Button(
onClick = { /* How to call function of screen? */ }
) {
Text("Next"))
}
}
}
) { padding ->
Box(modifier = Modifier.padding(padding)) {
NavHost(
navController = navController,
startDestination = "selectAccount"
) {
// screens that can contribute items to the menu
composable("selectAccount") {
AccountSelectionRoute(
onAccountSelected = {
navController.navigate("nextScreen")
}
)
}
composable("...") {
// ...
}
}
}
}
}
}
【问题讨论】:
标签: android android-jetpack-compose android-jetpack-navigation