在为 Jetpack Compose 编程时,我一直想知道为什么要使用 Navigation。仅仅提升一个状态,说
currentRoute
然后使用when {}
块来渲染适当的屏幕不是更简单吗?
结合使用导航和 compose 有什么好处?
@Composable
fun SetupNavigation() {
val navController = rememberNavController()
NavHost(
navController = navController,
startDestination = Routes.Home.route,
) {
composable(
route = Routes.Home.route,
) {
HomeScreen(
rollDice = {
val face = Random.nextInt(1..6)
navController.navigate(Routes.Show.route.replace("{${Routes.Show.arguments[0].name}}", face.toString()))
}
)
}
composable(
route = Routes.Show.route,
arguments = Routes.Show.arguments
) { backStackEntry ->
val face = backStackEntry.arguments?.getInt(Routes.Show.arguments[0].name)
ShowScreen(
face = face ?: -1,
navigateHome = { navController.navigate(Routes.Home.route) },
)
}
}
}
sealed class Routes(val route: String) {
object Home: Routes("home")
object Show: Routes("show/{face}") {
val arguments = listOf(navArgument("face") { type = NavType.IntType })
}
}
currentRoute
状态)@Composable
fun SetupNavigation() {
var currentRoute by remember { mutableStateOf(Route.Home as Route) }
when (currentRoute) {
Route.Home -> {
HomeScreen(
rollDice = {
val face = Random.nextInt(1..6)
currentRoute = Route.Show(face)
}
)
}
is Route.Show -> {
val face = (currentRoute as Route.Show).face
ShowScreen(
face = face,
navigateHome = { currentRoute = Route.Home },
)
}
}
}
sealed class Route() {
object Home: Route()
class Show(val face: Int): Route()
}
我只能在没有导航的情况下看到这种方法的好处:
导航 | 吊装
|
---|---|
路由是字符串(例如,容易出现拼写错误和忘记路由) | 路线是完整的对象(加上 不会让你错过
|
参数必须是简单类型 | 参数可以是路由对象可以容纳的任何东西 |
参数名称是字符串(仅运行时检查) | 参数是路由对象中的正式属性(编译器检查) |
对于实际的导航参数必须编组(见 ) |
比较
|
我认为拥有一堆路线(而不是只有一条当前路线)并不困难。处理后退按钮也是如此。
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
SetupNavigation()
}
}
}
@Composable
fun HomeScreen(rollDice: () -> Unit) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center,
) {
OutlinedButton(onClick = rollDice) {Text("Roll dice") }
}
}
@Composable
fun ShowScreen(face: Int, navigateHome: () -> Unit) {
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center,
) {
Text(
text = "$face",
fontSize = MaterialTheme.typography.titleLarge.fontSize,
)
Spacer(modifier = Modifier.size(24.dp))
OutlinedButton(onClick = navigateHome) { Text("Back") }
}
}
注意:我是 Android 编程和 Jetpack Compose 的新手。在学习了有关旧版布局 xml(以及导航图、数据绑定等)的基础知识后,我很快切换到 Compose(我想我不需要列举原因)。