Compose中使用Navigation导航组件

725 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

在2018年的Google IO大会中,Google在JetPack中新增了NavigationPagingWorkManager,Navigation的出现是为了帮助我们很好处理的在Activity和Fragment之间通过FragmentTransaction进行交互,并且还为我们提供了很好的导航转场的效果。我相信大家在原生的View系统开发已经使用的很熟悉了。那么我们就来了解以下NavigationCompose中是如何使用的呢?

导入Navigation-compose的相关依赖库

dependencies {
    def nav_version = "2.4.2"

    implementation "androidx.navigation:navigation-compose:$nav_version"
}

下面我们就来进行简单的使用

创建NavController

在Compose中NavCotroller是一个状态相关的Api,并且他是最重要的Api,我们可以使用 NavController.navigate(RoutePath)来进行可组合项的导航,可以使用它来获取跟踪可组合项的返回栈navigation.currentBackStackEntryAsState(),以及管理每个Screen的状态,我们可以使用remeberNavController()方法来创建

val navController = rememberNavController()

既然知道navController是状态相关Api,如果其他可组合项需要访问时,我们可以遵循Compose的状态提升原则去作为其他可组合项进行重组的可信源。

NavHost的创建

那么导航指示器创建好了,没有导航图我们视乎不能进行管理,NavHost就是用于指定我们的应用进行导航的地图

@Composable
fun NavHostScreen(){
    val navController = rememberNavController()
  		NavHost(
            navController = navController, //需要将navController与Navhost进行关联
            startDestination = "HomeScreen", //导航图的起始可组合函数
            modifier = Modifier.fillMaxSize()
        ) {
            composale("HomeScreen"){
                
            }
            composale("LoginScreen"){
                
            }
            composale("SettingScreen"){
                
            }
        }  
}

我们在NavHost的尾随Lambda中创建个一张导航图,每一个composable()都像是目的地,composable()接收两个参数:第一个参数是String,用来描述每一个目的地的路径地址,第二参数是接收一个Compose函数,是我们的每一个可组合项

导航目的地

就如前面讲到的我们可以使用NavController.navigate() 方法来进行可组合项的导航,但是使用navigate()方法还有许多可配置的参数,下面就了解下我们常用的参数

/**
* builder:用于构建新NavOptions的 DSL
*/
public fun navigate(route: String, builder: NavOptionsBuilder.() -> Unit) {
        navigate(route, navOptions(builder))
    }

那么我们可以看下NavOptions支持哪些配置

public class NavOptions internal constructor(
    private val singleTop: Boolean,
    private val restoreState: Boolean,
    @field:IdRes @get:IdRes @param:IdRes
    public val popUpToId: Int,
    private val popUpToInclusive: Boolean,
    private val popUpToSaveState: Boolean,
    @get:AnimatorRes @get:AnimRes @param:AnimRes @param:AnimatorRes
    public val enterAnim: Int,
    @get:AnimatorRes @get:AnimRes @param:AnimRes @param:AnimatorRes
    public val exitAnim: Int,
    @get:AnimatorRes @get:AnimRes @param:AnimRes @param:AnimatorRes
    public val popEnterAnim: Int,

    @get:AnimatorRes @get:AnimRes @param:AnimRes @param:AnimatorRes
    public val popExitAnim: Int
) {
    ····
}
  • singleTop:与我们Acitivity的启动模式相同,保证我们发挥堆栈栈顶只有一个可组合项
  • restoreState 用来许都需要恢复之前保存状态的标志
  • popUpToId导航的目的站点之前,将指定的目的地弹出返回堆栈
  • popUpToInclusive 在导航到目的地之前,将返回堆栈所有内容弹出
  • 下面其他的都是navigation的一些转场动画设置,在这里就不做过多的赘述

我们开可以使用navigate()方法携带目的可组合项需要的参数进行跳转

NavHost(startDestination = "group/{arguments}") {
    composable("group/{arguments}") {
        ...
}

//上面这种方式默认携带参数类型为String,那么如果我们需要携带其他的基础数据类型怎么处理呢
NavHost(startDestination = "group/{arguments}") {
    composable(
        "group/{arguments}"//可以通过type指定传递数据类型
        arguments = listOf(navArgument("arguments") { type = NavType.StringType })
       ) {
        	  //在可组合函数中获取携带参数
        	   val arguments = it.arguments?.getString("arguments")
                HomeScreen(arguments) {
            
                }
	}
}

通过上面了解的内容,我们基本就可以使用单Activity的项目结构完成App的开发