持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情
在2018年的Google IO大会中,Google在JetPack中新增了Navigation、Paging、WorkManager,Navigation的出现是为了帮助我们很好处理的在Activity和Fragment之间通过FragmentTransaction进行交互,并且还为我们提供了很好的导航转场的效果。我相信大家在原生的View系统开发已经使用的很熟悉了。那么我们就来了解以下Navigation在Compose中是如何使用的呢?
导入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的开发