之前用写过一版Navigation,不过现在Compose中也对Navigation做了兼容。新的Navigation导航更加灵活,可以实现组件之间的切换, 所以这里也对navigation-compose
做下简单的记录。关于之前的Navigation,可以参考以下链接:
https://blog.csdn.net/Mr_Tony/article/details/103168229。
新的例子主要是通过官方教程进行理解
https://developer.android.google.cn/codelabs/jetpack-compose-navigation
除了必须的Compose
依赖库外,这里还需要引入单独的依赖库
dependencies {
implementation "androidx.navigation:navigation-compose:2.4.0-alpha04"
// other dependencies
}
依赖版本需要和其它版本相匹配
在Compose中导航主要是用NavHostController来进行控制。通常这个实例是用rememberNavController()
来获取。
val navController = rememberNavController()
NavBackStackEntry存储了导航中回退栈的信息。可以通过以下方式获取
val backstackEntry = navController.currentBackStackEntryAsState()
val route = backstackEntry.value?.destination?.route //获取当前的路由状态
Navigation有多种方式进行跳转,这里记录下路由跳转(使用路由跳转可以做到组件之间的解耦)。路由路径一般为字符串,需要使用composable(route)
进行包括。示例如下
NavHost(
navController = navController,//路由控制器
startDestination = RallyScreen.Overview.name//导航开始页面
){
composable("route") {
BillsBody(bills = UserData.bills) //组件内容,一个页面
}
}
跳转则使用以下方式
navController.navigate("route")
路由传递参数的话一般跟在路径后面,接受参数由navArgument()
来进行获取,接收参数示例如下
composable(
route = "$accountsName/{name}",
arguments = listOf(
navArgument("name") {
// Make argument type safe
type = NavType.StringType
}
),
deepLinks = listOf(navDeepLink {
uriPattern = "rally://$accountsName/{name}"
})
) {
entry -> // Look up "name" in NavBackStackEntry's arguments
val accountName = entry.arguments?.getString("name")
// Find first name match in UserData
val account = UserData.getAccount(accountName)
// Pass account to SingleAccountBody
SingleAccountBody(account = account)
}
发送参数如下
navController.navigate("${RallyScreen.Accounts.name}/$accountName")
Navigation支持深度链接,由外部跳转进来。
首先,将深层链接添加到AndroidManifest.xml
. 您需要为RallyActivity
操作VIEW
和类别BROWSABLE
以及DEFAULT
.
然后,使用data
标记,添加scheme
,host
和pathPrefix
。
此代码实验室将rally://accounts/{name}
用作深层链接 URL。
您不需要在 AndroidManifest 中声明“name”参数。它将被 Navigation 解析为参数。
AndroidManifest配置如下:
<activity
android:name=".RallyActivity"
android:windowSoftInputMode="adjustResize"
android:label="@string/app_name"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="rally" android:host="accounts" />
</intent-filter>
</activity>
接收参数如下
val accountsName = RallyScreen.Accounts.name
composable(
"$accountsName/{name}",
arguments = listOf(
navArgument("name") {
type = NavType.StringType
},
),
deepLinks = listOf(navDeepLink {
uriPattern = "rally://$accountsName/{name}"
})
)
https://developer.android.google.cn/courses/pathways/compose#8
https://developer.android.google.cn/codelabs/jetpack-compose-navigation
https://developer.android.google.cn/reference/kotlin/androidx/navigation/NavHostController