Jetpack Compose with Navigation:为什么要使用它?

问题描述 投票:0回答:0

在为 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()
}

为什么?

我只能在没有导航的情况下看到这种方法的好处:

中的一个分支
导航 吊装
currentRoute
路由是字符串(例如,容易出现拼写错误和忘记路由) 路线是完整的对象(加上
sealed class
不会让你错过
when
参数必须是简单类型 参数可以是路由对象可以容纳的任何东西
参数名称是字符串(仅运行时检查) 参数是路由对象中的正式属性(编译器检查)
对于实际的导航参数必须编组(见
.navigate(Routes.Show.route.replace("{${Routes.Show.arguments[0].name}}", face.toString()))
比较
currentRoute = Route.Show(face)

我认为拥有一堆路线(而不是只有一条当前路线)并不困难。处理后退按钮也是如此。

剩下的代码

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(我想我不需要列举原因)。

android-jetpack-compose android-navigation jetpack-compose-navigation
© www.soinside.com 2019 - 2024. All rights reserved.