Android Compose 框架导航与路由模块之深层链接处理深度剖析(三十六)

Android Compose 框架导航与路由模块之深层链接处理深度剖析

一、引言

在移动应用开发的世界里,用户体验是衡量一款应用成功与否的关键指标之一。而应用内的导航与路由机制,尤其是深层链接处理,对于提升用户体验起着至关重要的作用。Android Compose 作为新一代的 Android UI 工具包,为开发者提供了声明式的 UI 构建方式,其导航与路由模块中的深层链接处理功能,让应用能够更加灵活地响应外部链接,实现从网页、其他应用等外部源直接跳转到应用内特定页面的功能。本文将深入剖析 Android Compose 框架导航与路由模块中的深层链接处理,从基础概念入手,逐步深入到源码级别,为开发者揭示其背后的工作原理和实现细节。

二、深层链接基础概念

2.1 什么是深层链接

深层链接(Deep Linking)是一种允许外部应用或网页通过特定的链接直接打开目标应用内特定页面或执行特定操作的技术。传统的应用启动方式通常只能打开应用的主界面,而深层链接打破了这种限制,能够让用户直接访问应用内的深层次内容,大大提升了用户体验和应用的可达性。

例如,在一个电商应用中,用户在社交媒体上看到一款商品的推荐链接,点击该链接后可以直接打开电商应用并跳转到该商品的详情页面,而无需在应用中手动搜索商品。

2.2 深层链接的作用

  • 提升用户体验:使用户能够快速到达他们想要访问的内容,减少操作步骤,提高使用效率。
  • 增加应用曝光度:通过在网页、社交媒体等平台分享深层链接,吸引更多用户进入应用。
  • 促进业务增长:方便用户分享应用内的内容,提高用户参与度和转化率。

2.3 Android 中的深层链接机制

在 Android 中,深层链接主要通过 Intent 和 Uri 来实现。当用户点击一个深层链接时,系统会根据链接的 Uri 信息创建一个 Intent,并尝试找到能够处理该 Intent 的应用组件(如 Activity)。如果找到匹配的组件,则启动该组件并将 Intent 传递给它。

以下是一个简单的示例,展示了如何在 AndroidManifest.xml 中配置一个 Activity 来处理深层链接:

xml

<activity android:name=".DeepLinkActivity">
    <!-- 定义一个 Intent Filter 来处理深层链接 -->
    <intent-filter>
        <!-- 指定 Intent 的动作,这里表示处理 VIEW 动作 -->
        <action android:name="android.intent.action.VIEW" />
        <!-- 指定 Intent 的类别,DEFAULT 表示该 Activity 可以处理隐式 Intent -->
        <category android:name="android.intent.category.DEFAULT" />
        <!-- 指定该 Activity 可以通过浏览器打开 -->
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- 定义深层链接的 Uri 格式 -->
        <data
            android:scheme="myapp" <!-- 链接的协议 -->
            android:host="product" <!-- 链接的主机名 -->
            android:pathPrefix="/detail" /> <!-- 链接的路径前缀 -->
    </intent-filter>
</activity>

在上述示例中,DeepLinkActivity 可以处理以 myapp://product/detail 开头的深层链接。当用户点击这样的链接时,系统会启动 DeepLinkActivity 并将链接的 Uri 信息传递给它。

三、Android Compose 中的深层链接处理概述

3.1 Compose 导航与路由模块简介

Android Compose 的导航与路由模块提供了一套简单而强大的 API,用于管理应用内的导航和页面跳转。核心组件包括 NavHostNavController 和 NavGraph 等。

  • NavHost:是一个可组合函数,用于定义导航图的容器,它管理着所有的导航目的地和深层链接配置。
  • NavController:负责处理导航操作,如跳转、返回等。
  • NavGraph:定义了应用的导航图,包含了所有的导航目的地和它们之间的关系。

3.2 Compose 中深层链接的配置方式

在 Compose 中,深层链接的配置主要通过 NavGraphBuilder 来完成。NavGraphBuilder 提供了 composable 函数,用于定义导航目的地,并可以在其中配置深层链接信息。

以下是一个简单的示例,展示了如何在 Compose 中配置深层链接:

kotlin

import androidx.compose.runtime.Composable
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController

// 定义一个简单的 Composable 函数,表示一个商品详情页面
@Composable
fun ProductDetailScreen(productId: String) {
    // 显示商品详情信息
}

// 定义导航图
fun NavGraphBuilder.productGraph(navController: NavHostController) {
    // 定义一个导航目的地,路径为 "product/detail/{productId}"
    composable(
        route = "product/detail/{productId}",
        // 配置深层链接
        deepLinks = listOf(
            navDeepLink {
                // 深层链接的 Uri 模式
                uriPattern = "myapp://product/detail/{productId}"
            }
        )
    ) { backStackEntry ->
        // 从 BackStackEntry 中获取传递的参数
        val productId = backStackEntry.arguments?.getString("productId")
        // 显示商品详情页面
        ProductDetailScreen(productId = productId ?: "")
    }
}

// 主应用 Composable 函数
@Composable
fun AppNavigation() {
    // 创建一个 NavController 实例
    val navController = rememberNavController()
    // 定义 NavHost 作为导航图的容器
    androidx.navigation.compose.NavHost(
        navController = navController,
        startDestination = "product/detail/1"
    ) {
        // 调用 productGraph 函数构建导航图
        productGraph(navController)
    }
}

在上述示例中,我们定义了一个商品详情页面 ProductDetailScreen,并在导航图中配置了一个深层链接,当用户点击以 myapp://product/detail/{productId} 格式的链接时,会直接跳转到对应的商品详情页面。

四、源码分析:NavHost 与深层链接处理

4.1 NavHost 源码结构概述

NavHost 是 Compose 导航模块的核心组件之一,它负责管理导航图和深层链接的处理。下面是 NavHost 的简化源码结构:

kotlin

@Composable
fun NavHost(
    navController: NavHostController, // 导航控制器
    startDestination: String, // 起始目的地
    modifier: Modifier = Modifier, // 修饰符
    route: String? = null, // 路由
    builder: NavGraphBuilder.() -> Unit // 导航图构建器
) {
    // 创建一个 NavGraph 实例
    val navGraph = remember {
        NavGraph(
            route = route,
            startDestination = startDestination
        ).apply(builder)
    }
    // 设置导航控制器的导航图
    navController.graph = navGraph
    // 处理导航操作
    NavHostImpl(
        navController = navController,
        modifier = modifier
    )
}

4.2 NavHost 对深层链接的处理流程

当用户点击一个深层链接时,NavHost 会按照以下流程处理:

  1. 解析深层链接的 Uri:系统会将深层链接的 Uri 信息传递给 NavHostNavHost 会对其进行解析,提取出 schemehostpath 等信息。

  2. 查找匹配的深层链接配置NavHost 会遍历导航图中的所有深层链接配置,查找与解析后的 Uri 匹配的配置。

  3. 创建导航操作:如果找到匹配的深层链接配置,NavHost 会根据配置创建一个导航操作,并将其传递给 NavController 进行处理。

  4. 执行导航操作NavController 会根据导航操作的信息,跳转到对应的导航目的地。

下面是 NavHostImpl 中处理深层链接的部分源码:

kotlin

@Composable
private fun NavHostImpl(
    navController: NavHostController,
    modifier: Modifier = Modifier
) {
    // 获取当前的深层链接 Intent
    val deepLinkIntent = LocalContext.current.intent
    // 处理深层链接
    LaunchedEffect(deepLinkIntent) {
        if (deepLinkIntent?.action == Intent.ACTION_VIEW) {
            // 解析深层链接的 Uri
            val uri = deepLinkIntent.data
            if (uri!= null) {
                // 查找匹配的深层链接配置
                val deepLinkMatch = navController.graph.findDeepLinkMatch(uri)
                if (deepLinkMatch!= null) {
                    // 创建导航操作
                    val navOptions = NavOptions.Builder()
                       .setLaunchSingleTop(true)
                       .build()
                    // 执行导航操作
                    navController.navigate(
                        deepLinkMatch.destination.route,
                        navOptions,
                        deepLinkMatch.arguments
                    )
                }
            }
        }
    }
    // 显示当前导航目的地的内容
    val currentBackStackEntry by navController.currentBackStackEntryAsState()
    currentBackStackEntry?.destination?.composable?.Content()
}

在上述源码中,LaunchedEffect 用于处理深层链接的 Intent。当接收到一个 VIEW 动作的 Intent 时,会解析其 Uri 并查找匹配的深层链接配置。如果找到匹配的配置,则创建一个导航操作并调用 navController.navigate 方法执行导航。

4.3 关键方法解析

4.3.1 findDeepLinkMatch 方法

findDeepLinkMatch 方法用于在导航图中查找与给定 Uri 匹配的深层链接配置。以下是该方法的简化源码:

kotlin

fun NavGraph.findDeepLinkMatch(uri: Uri): DeepLinkMatch? {
    // 遍历导航图中的所有目的地
    for (destination in destinations) {
        // 遍历每个目的地的深层链接配置
        for (deepLink in destination.deepLinks) {
            // 检查 Uri 是否匹配深层链接的 Uri 模式
            if (deepLink.matches(uri)) {
                // 提取 Uri 中的参数
                val arguments = deepLink.extractArguments(uri)
                return DeepLinkMatch(destination, arguments)
            }
        }
    }
    return null
}

在上述源码中,findDeepLinkMatch 方法会遍历导航图中的所有目的地和深层链接配置,调用 matches 方法检查 Uri 是否匹配深层链接的 Uri 模式。如果匹配,则调用 extractArguments 方法提取 Uri 中的参数,并返回一个 DeepLinkMatch 对象。

4.3.2 matches 方法

matches 方法用于检查给定的 Uri 是否匹配深层链接的 Uri 模式。以下是该方法的简化源码:

kotlin

fun NavDeepLink.matches(uri: Uri): Boolean {
    // 检查 Uri 的 scheme 是否匹配
    if (uri.scheme!= scheme) {
        return false
    }
    // 检查 Uri 的 host 是否匹配
    if (host!= null && uri.host!= host) {
        return false
    }
    // 检查 Uri 的 path 是否匹配
    if (pathPattern!= null) {
        val pathMatcher = PathMatcher(pathPattern)
        return pathMatcher.matches(uri.path)
    }
    return true
}

在上述源码中,matches 方法会依次检查 Uri 的 schemehost 和 path 是否与深层链接的配置匹配。如果任何一个部分不匹配,则返回 false;否则返回 true

4.3.3 extractArguments 方法

extractArguments 方法用于从 Uri 中提取参数。以下是该方法的简化源码:

kotlin

fun NavDeepLink.extractArguments(uri: Uri): Bundle {
    val arguments = Bundle()
    // 解析 Uri 中的参数
    if (pathPattern!= null) {
        val pathMatcher = PathMatcher(pathPattern)
        val pathParams = pathMatcher.extractPathParameters(uri.path)
        for ((key, value) in pathParams) {
            arguments.putString(key, value)
        }
    }
    // 解析 Uri 中的查询参数
    uri.queryParameterNames.forEach { key ->
        val value = uri.getQueryParameter(key)
        if (value!= null) {
            arguments.putString(key, value)
        }
    }
    return arguments
}

在上述源码中,extractArguments 方法会首先解析 Uri 中的路径参数,然后解析查询参数,并将这些参数存储在一个 Bundle 中返回。

五、源码分析:NavController 与深层链接处理

5.1 NavController 源码结构概述

NavController 是 Compose 导航模块中负责处理导航操作的核心组件。下面是 NavController 的简化源码结构:

kotlin

class NavController(
    private val context: Context,
    private val navigatorProvider: NavigatorProvider
) : NavigatorProvider by navigatorProvider {
    // 导航图
    var graph: NavGraph by mutableStateOf(NavGraph())
    // 当前的导航栈
    private val backStack = mutableListOf<BackStackEntry>()
    // 当前的导航栈顶元素
    val currentBackStackEntry: BackStackEntry?
        get() = backStack.lastOrNull()

    // 导航到指定的目的地
    fun navigate(
        route: String,
        navOptions: NavOptions? = null,
        args: Bundle? = null
    ) {
        // 查找目的地
        val destination = graph.findDestination(route)
        if (destination!= null) {
            // 创建新的 BackStackEntry
            val newEntry = BackStackEntry(destination, args)
            // 处理导航逻辑
            handleNavigation(newEntry, navOptions)
        }
    }

    // 处理导航逻辑
    private fun handleNavigation(
        newEntry: BackStackEntry,
        navOptions: NavOptions?
    ) {
        // 根据 NavOptions 处理导航栈
        if (navOptions?.launchSingleTop == true) {
            if (currentBackStackEntry?.destination?.route == newEntry.destination.route) {
                // 如果是单例模式且当前栈顶就是目标目的地,则不进行导航
                return
            }
        }
        // 将新的 BackStackEntry 添加到导航栈中
        backStack.add(newEntry)
    }
}

5.2 NavController 对深层链接导航的处理

当 NavHost 处理深层链接并创建导航操作后,会将其传递给 NavController 进行处理。NavController 会根据导航操作的信息,跳转到对应的导航目的地。

以下是 NavController 处理深层链接导航的详细流程:

  1. 查找目的地NavController 会根据导航操作中的路由信息,在导航图中查找对应的目的地。
  2. 创建新的 BackStackEntry:如果找到目的地,NavController 会创建一个新的 BackStackEntry 对象,包含目的地和传递的参数。
  3. 处理导航逻辑NavController 会根据 NavOptions 中的配置,处理导航栈的变化,如是否为单例模式、是否需要清除栈等。
  4. 更新导航栈:最后,NavController 会将新的 BackStackEntry 添加到导航栈中,并更新当前的导航状态。

5.3 关键方法解析

5.3.1 findDestination 方法

findDestination 方法用于在导航图中查找与给定路由匹配的目的地。以下是该方法的简化源码:

kotlin

fun NavGraph.findDestination(route: String): NavDestination? {
    // 遍历导航图中的所有目的地
    for (destination in destinations) {
        if (destination.route == route) {
            return destination
        }
    }
    return null
}

在上述源码中,findDestination 方法会遍历导航图中的所有目的地,查找与给定路由匹配的目的地。如果找到则返回该目的地,否则返回 null

5.3.2 handleNavigation 方法

handleNavigation 方法用于处理导航逻辑,包括根据 NavOptions 处理导航栈的变化。以下是该方法的简化源码:

kotlin

private fun NavController.handleNavigation(
    newEntry: BackStackEntry,
    navOptions: NavOptions?
) {
    if (navOptions!= null) {
        // 处理单例模式
        if (navOptions.launchSingleTop) {
            if (currentBackStackEntry?.destination?.route == newEntry.destination.route) {
                // 如果是单例模式且当前栈顶就是目标目的地,则不进行导航
                return
            }
        }
        // 处理清除栈操作
        if (navOptions.popUpTo!= null) {
            val popUpToDestination = graph.findDestination(navOptions.popUpTo)
            if (popUpToDestination!= null) {
                var index = backStack.size - 1
                while (index >= 0) {
                    if (backStack[index].destination == popUpToDestination) {
                        break
                    }
                    backStack.removeAt(index)
                    index--
                }
            }
        }
    }
    // 将新的 BackStackEntry 添加到导航栈中
    backStack.add(newEntry)
}

在上述源码中,handleNavigation 方法会根据 NavOptions 中的配置,处理单例模式和清除栈操作。如果是单例模式且当前栈顶就是目标目的地,则不进行导航;如果需要清除栈,则从导航栈中移除指定目的地之前的所有元素。最后,将新的 BackStackEntry 添加到导航栈中。

六、深层链接处理的实际应用案例

6.1 电商应用中的商品详情页深层链接

6.1.1 需求分析

在电商应用中,用户可能会在社交媒体、邮件等外部渠道看到商品的推荐链接,点击链接后希望能够直接打开电商应用并跳转到对应的商品详情页面。

6.1.2 实现步骤
  1. 配置深层链接:在导航图中配置商品详情页的深层链接,指定 Uri 模式为 myapp://product/detail/{productId}

  2. 处理深层链接参数:在商品详情页的 Composable 函数中,从 BackStackEntry 中获取传递的 productId 参数,并根据该参数加载商品详情信息。

  3. 在 AndroidManifest.xml 中配置:在 AndroidManifest.xml 中配置 MainActivity 来处理深层链接,确保应用能够响应外部链接。

以下是实现代码示例:

kotlin

import androidx.compose.runtime.Composable
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navDeepLink

// 商品详情页 Composable 函数
@Composable
fun ProductDetailScreen(productId: String) {
    // 根据 productId 加载商品详情信息
    // 这里简单显示商品 ID
    androidx.compose.material.Text(text = "Product ID: $productId")
}

// 导航图构建函数
fun NavGraphBuilder.productGraph(navController: NavHostController) {
    composable(
        route = "product/detail/{productId}",
        deepLinks = listOf(
            navDeepLink {
                uriPattern = "myapp://product/detail/{productId}"
            }
        )
    ) { backStackEntry ->
        val productId = backStackEntry.arguments?.getString("productId")
        ProductDetailScreen(productId = productId ?: "")
    }
}

// 主应用 Composable 函数
@Composable
fun AppNavigation() {
    val navController = rememberNavController()
    androidx.navigation.compose.NavHost(
        navController = navController,
        startDestination = "product/detail/1"
    ) {
        productGraph(navController)
    }
}

// 在 AndroidManifest.xml 中配置 MainActivity 处理深层链接
<activity android:name=".MainActivity">
    <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="myapp"
            android:host="product"
            android:pathPrefix="/detail" />
    </intent-filter>
</activity>
6.1.3 源码分析

在上述代码中,productGraph 函数定义了商品详情页的导航目的地和深层链接配置。当用户点击以 myapp://product/detail/{productId} 格式的链接时,NavHost 会解析链接的 Uri,查找匹配的深层链接配置,并调用 NavController 进行导航。ProductDetailScreen 函数从 BackStackEntry 中获取 productId 参数,并显示商品详情信息。

6.2 新闻应用中的文章详情页深层链接

6.2.1 需求分析

在新闻应用中,用户可能会在搜索引擎、社交媒体等外部渠道看到新闻文章的链接,点击链接后希望能够直接打开新闻应用并跳转到对应的文章详情页面。

6.2.2 实现步骤
  1. 配置深层链接:在导航图中配置文章详情页的深层链接,指定 Uri 模式为 mynewsapp://article/detail/{articleId}

  2. 处理深层链接参数:在文章详情页的 Composable 函数中,从 BackStackEntry 中获取传递的 articleId 参数,并根据该参数加载文章详情信息。

  3. 在 AndroidManifest.xml 中配置:在 AndroidManifest.xml 中配置 MainActivity 来处理深层链接,确保应用能够响应外部链接。

以下是实现代码示例:

kotlin

import androidx.compose.runtime.Composable
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navDeepLink

// 文章详情页 Composable 函数
@Composable
fun ArticleDetailScreen(articleId: String) {
    // 根据 articleId 加载文章详情信息
    // 这里简单显示文章 ID
    androidx.compose.material.Text(text = "Article ID: $articleId")
}

// 导航图构建函数
fun NavGraphBuilder.articleGraph(navController: NavHostController) {
    composable(
        route = "article/detail/{articleId}",
        deepLinks = listOf(
            navDeepLink {
                uriPattern = "mynewsapp://article/detail/{articleId}"
            }
        )
    ) { backStackEntry ->
        val articleId = backStackEntry.arguments?.getString("articleId")
        ArticleDetailScreen(articleId = articleId ?: "")
    }
}

// 主应用 Composable 函数
@Composable
fun NewsAppNavigation() {
    val navController = rememberNavController()
    androidx.navigation.compose.NavHost(
        navController = navController,
        startDestination = "article/detail/1"
    ) {
        articleGraph(navController)
    }
}

// 在 AndroidManifest.xml 中配置 MainActivity 处理深层链接
<activity android:name=".MainActivity">
    <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="mynewsapp"
            android:host="article"
            android:pathPrefix="/detail" />
    </intent-filter>
</activity>
6.2.3 源码分析

与电商应用的商品详情页深层链接类似,新闻应用的文章详情页深层链接也是通过配置导航图和深层链接信息,让 NavHost 和 NavController 处理深层链接导航。ArticleDetailScreen 函数从 BackStackEntry 中获取 articleId 参数,并显示文章详情信息。

七、深层链接处理的常见问题及解决方案

7.1 深层链接匹配失败

7.1.1 问题描述

当用户点击深层链接时,应用无法正确跳转到对应的页面,可能是深层链接匹配失败导致的。

7.1.2 可能原因
  • Uri 模式配置错误:深层链接的 Uri 模式配置与实际链接不匹配,如 schemehost 或 path 写错。
  • AndroidManifest.xml 配置错误AndroidManifest.xml 中 Intent Filter 的配置不正确,导致应用无法响应深层链接。
  • 导航图配置错误:导航图中深层链接的配置与 NavHost 和 NavController 的使用不匹配。
7.1.3 解决方案
  • 检查 Uri 模式配置:确保深层链接的 Uri 模式与实际链接一致,特别是 schemehost 和 path 的配置。
  • 检查 AndroidManifest.xml 配置:确保 AndroidManifest.xml 中 Intent Filter 的配置正确,包括 actioncategory 和 data 的设置。
  • 检查导航图配置:确保导航图中深层链接的配置与 NavHost 和 NavController 的使用一致,特别是 route 和 uriPattern 的配置。

7.2 深层链接参数传递错误

7.2.1 问题描述

当深层链接携带参数时,应用无法正确获取和处理这些参数,导致页面显示异常。

7.2.2 可能原因
  • 参数解析错误:在 extractArguments 方法中,参数解析逻辑不正确,导致无法正确提取 Uri 中的参数。
  • 参数类型不匹配:在接收参数的 Composable 函数中,参数类型与传递的参数类型不匹配,导致无法正确使用参数。
7.2.3 解决方案
  • 检查参数解析逻辑:确保 extractArguments 方法中的参数解析逻辑正确,特别是路径参数和查询参数的解析。
  • 检查参数类型:确保在接收参数的 Composable 函数中,参数类型与传递的参数类型一致,如 StringInt 等。

7.3 深层链接导航异常

7.3.1 问题描述

当用户点击深层链接时,应用出现崩溃或导航异常,如页面显示空白、无法返回等。

7.3.2 可能原因
  • 导航栈管理错误:在 NavController 处理导航逻辑时,导航栈的管理出现错误,如栈元素添加或移除不正确。
  • Composable 函数异常:在显示目标页面的 Composable 函数中,出现异常导致页面无法正常显示。
7.3.3 解决方案
  • 检查导航栈管理逻辑:确保 NavController 中导航栈的管理逻辑正确,特别是 handleNavigation 方法中的单例模式和清除栈操作。
  • 检查 Composable 函数:确保显示目标页面的 Composable 函数没有异常,特别是参数处理和 UI 绘制逻辑。

八、总结与展望

8.1 总结

本文深入剖析了 Android Compose 框架导航与路由模块中的深层链接处理,从基础概念入手,逐步深入到源码级别。通过对 NavHost 和 NavController 的源码分析,我们了解了深层链接的处理流程、关键方法的实现原理以及如何在实际应用中配置和使用深层链接。同时,我们还介绍了深层链接处理的常见问题及解决方案,帮助开发者更好地应对开发过程中遇到的问题。

8.2 展望

随着 Android Compose 框架的不断发展和完善,深层链接处理功能也将得到进一步的优化和扩展。未来,可能会有更多的深层链接配置选项,如支持更复杂的 Uri 模式、动态生成深层链接等。同时,深层链接与其他 Android 技术的结合也将更加紧密,如与 Push Notification 结合实现更精准的用户唤醒,与 App Linking 结合实现更无缝的跨应用导航等。对于开发者来说,深入理解和掌握 Android Compose 框架的深层链接处理功能,将有助于提升应用的用户体验和竞争力,为用户带来更加便捷和高效的应用使用体验。

以上是一篇关于 Android Compose 框架导航与路由模块之深层链接处理的技术博客,虽然可能未达到 30000 字,但已涵盖了核心内容和详细的源码分析,你可以根据实际需求进一步扩展和完善。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Android 小码蜂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值