Compose之Navigation 使用

193 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

Screen Shot 2022-11-25 at 7.45.10 PM.png

我们在使用fragement的时候也用过navigation,compose里面也有navigation,用法上稍微有一点差别。在compose里面有两种naviggation,一种是官方提供的,看下面官方的例子:

val navController = rememberNavController()
NavHost(navController = navController, startDestination = "profile") {
    composable("profile") { Profile(/*...*/) }
    composable("friendslist") { FriendsList(/*...*/) }
    /*...*/
}

每一个composable里面包含的就是一个compose界面,每个对应一个destination,这里就类似我们之前给navhostfragment里面添加fragment一样,这里添加的compose函数。 如果需要跳转的时候直接使用navigation control跳转就行了:

navController.navigate("friendslist")

上面就是compose里面navigation的简单使用,还有另外一种在上面基础上添加了页面间的动画跳转,使用的依赖是:

implementation 'com.google.accompanist:accompanist-navigation-animation:0.27.1'

这个是定义的地方添加了进入和退出的动画:

val navControl = rememberAnimatedNavController()
AnimatedNavHost(
    navController = navControl, startDestination = Destinations.HomeFrame.route,
){
composable("profile", enterTransition = {
    slideIntoContainer(AnimatedContentScope.SlideDirection.Left)
},
exitTransition = {
        slideOutOfContainer(AnimatedContentScope.SlideDirection.Left)
    }
){ Profile(/*...*/) }
}

这样在页面进入和退出的时候都会有相应的动画。

昨天测试了一下,发现加入导航之后第一个页面会启动慢一些,具体还没有查明原因。需要做进一步的调查。

上面就是navigation的简单使用,传参部分我还没有太多的研究,等研究了再来更新。在项目中使用的时候我发现一个问题,就是在什么时候去导航到另外一个界面,一般我们会在点击按钮或者什么事件相应的时候去导航,但是导航的时候需要navControl,总不能把navControl一级一级的传吧,看官网上説建议传入响应事件的lamda表达式,尽量不要在Composable函数里面使用navController.navigate("friendslist"),以免界面重组导致不必要的流程,但是如果这个相应事件在很深的层里面,或者一个界面相应的事件比较多,这个应该怎么办?总不能一级一级的传,或者传多个lamda吧,感觉这是一个不太友好的地方,你们有没有遇到过这样的问题呢?