Compose的Navigation(十五)

文章目录

    • 一、前言
    • 二、依赖
    • 三、NavHostController
    • 四、NavBackStackEntry
    • 五、路由跳转
    • 六、路由传参
    • 七、深度链接
    • 八、参考链接

一、前言

之前用写过一版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
}

依赖版本需要和其它版本相匹配

三、NavHostController

Compose中导航主要是用NavHostController来进行控制。通常这个实例是用rememberNavController()来获取。

val navController = rememberNavController()

四、NavBackStackEntry

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,hostpathPrefix

此代码实验室将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}"
    })
)

八、参考链接

  1. Compose学习

https://developer.android.google.cn/courses/pathways/compose#8

  1. Jetpack Compose 导航

https://developer.android.google.cn/codelabs/jetpack-compose-navigation

  1. NavHostController

https://developer.android.google.cn/reference/kotlin/androidx/navigation/NavHostController

  1. Navigation
    https://developer.android.google.cn/jetpack/compose/navigation

你可能感兴趣的:(JetPack)