Android 开发者 09月12日
Jetpack Navigation 3:为 Jetpack Compose 打造的全新导航库
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

Jetpack Navigation 3 (Nav3) 是一款专为 Jetpack Compose 设计的全新导航库,旨在简化 Android 应用的导航体验。与前代库 (Nav2) 相比,Nav3 采用了声明式编程模型和 Compose 状态作为核心,解决了 Nav2 在与 Compose 结合使用时存在的限制,例如间接观察返回堆栈状态导致的不一致问题,以及难以实现大屏幕上的多窗格自适应布局。Nav3 的核心理念是让开发者完全掌控返回堆栈,通过简单的列表操作即可实现导航,并提供了开放、可扩展的设计,允许开发者深入定制。其关键功能包括内置的过渡动画、支持预测性返回、灵活的 Scenes API 以实现自适应布局,以及状态范围限定和模块化设计,为构建现代、灵活的 Compose 应用导航系统奠定了坚实基础。

✨ **全新 Compose 原生设计:** Jetpack Navigation 3 (Nav3) 是一个专为 Jetpack Compose 量身打造的全新导航库。它摒弃了传统基于 Fragment 的导航模式,转而采用声明式编程模型和 Compose 状态管理作为核心构建模块,旨在提供更流畅、更符合 Compose 生态的导航体验,并解决了前代库 Nav2 在与 Compose 结合使用时存在的限制。

🗂️ **开发者完全掌控返回堆栈:** Nav3 的核心原则是将返回堆栈的控制权完全交还给开发者。开发者可以使用 `SnapshotStateList` 来管理返回堆栈,通过添加或删除列表项即可实现导航。这种直接的状态管理方式消除了潜在的不一致性,并使得导航逻辑更加透明和易于理解。

🎨 **灵活的自适应布局与动画支持:** Nav3 引入了名为 `Scenes` 的灵活布局 API,可以方便地在同一布局中渲染多个目标位置,从而轻松实现如列表-详情布局这样的自适应设计,并支持在大屏幕设备上无缝切换单窗格和多窗格视图。同时,它还内置了过渡动画,包括对预测性返回手势的支持,并提供了灵活的 API 以实现自定义动画行为。

🛠️ **开放、可扩展与模块化:** Nav3 的设计秉承开放性和可扩展性原则,提供了基础构建模块和实用的默认设置,允许开发者根据需求深入定制导航行为。其模块化设计也使得导航代码可以拆分到多个模块中,有助于缩短构建时间并清晰划分各功能模块的职责。

原创 Android 2025-08-05 17:31 北京

Jetpack Navigation 3 是一个专为 Jetpack Compose 打造的全新导航库,可帮助您创建灵活的应用导航系统。

作者 / 开发者关系工程师 Don Turner

在应用中的不同屏幕之间导航理应简单明了。然而,构建稳健、可扩展且赏心悦目的导航体验却并非易事。多年来,Jetpack Navigation 库一直是开发者的重要工具,但随着 Android 界面格局的演变,尤其是 Jetpack Compose 的兴起,我们意识到是时候探索一种全新的解决方案了。

我们将在本文为您介绍新推出的 Jetpack Navigation 3,这是一个专为 Compose 打造的全新导航库。为简洁起见,我们将其简称为 Nav3。这个库采用了声明式编程模型和 Compose 状态作为其基本构建模块。


🔗 声明式编程模型

https://developer.android.com/develop/ui/compose/mental-model

🔗 Compose 状态

https://developer.android.com/develop/ui/compose/state

为什么要推出新的导航库?


之前的 Jetpack Navigation 库 (有时也称为 Nav2,因为它是第二个主版本) 最初是在 2018 年发布的,彼时还没有 AndroidX 和 Compose 这两个框架。虽然 Nav2 已经很好地实现了最初目标,但我们了解到,在与现代 Compose 开发模式结合使用时,Nav2 存在一些限制。

其中一个关键的限制是仅支持间接观察返回堆栈状态。这意味着可能存在两个事实来源,从而导致应用状态出现不一致的情况。此外,Nav2 的 NavHost 被设计为仅显示一个目标位置 (即返回堆栈中的最顶层目标位置) 以填充可用空间。这使得实现同时显示多个内容窗格的自适应布局 (例如大屏幕上的列表-详情布局) 变得困难。

△ 从单窗格布局切换到多窗格布局可能会带来导航方面的挑战

创立原则


Nav3 基于以下原则构建而成,旨在提供更大的灵活性并提高开发者掌控力:

△ Nav3 Display 组件观测开发者拥有的返回堆栈的变化


🔗 深入到更低的层级

https://developer.android.com/develop/ui/compose/layering

🔗 操作指南

http://github.com/android/nav3-recipes

关键功能


△ 可以轻松实现自定义动画和预测性返回,并且易于针对各个目标位置进行单独的覆写


🔗 预测性返回

https://developer.android.com/develop/ui/compose/system/predictive-back

🔗 支持自定义动画行为的灵活 API

https://developer.android.com/guide/navigation/navigation-3/animate-destinations

🔗 灵活布局 API

https://developer.android.com/guide/navigation/navigation-3/custom-layouts

🔗 专用 Jetpack lifecycle 库

https://developer.android.com/guide/navigation/navigation-3/save-state#scoping-viewmodels

基本代码示例


为了帮助您了解 Nav3 的工作原理,我们准备了简短的代码示例。

// Define the routes in your app and any arguments.
data object Home
data class Product(val id: String)
// Create a back stack, specifying the route the app should start with.
val backStack = remember { mutableStateListOf<Any>(Home) }
// A NavDisplay displays your back stack. Whenever the back stack changes, the display updates.
NavDisplay(
    backStack = backStack,
    // Specify what should happen when the user goes back
    onBack = { backStack.removeLastOrNull() },
    // An entry provider converts a route into a NavEntry which contains the content for that route.
    entryProvider = { route ->
        when (route) {
            is Home -> NavEntry(route) {
                Column {
                    Text("Welcome to Nav3")
                    Button(onClick = {
                        // To navigate to a new route, just add that route to the back stack
                        backStack.add(Product("123"))
                    }) {
                        Text("Click to navigate")
                    }
                }
            }
            is Product -> NavEntry(route) {
                Text("Product ${route.id} ")
            }
            else -> NavEntry(Unit) { Text("Unknown route: $route") }
        }
    }
)

开始使用并分享反馈


首先,您可以查看开发者文档以及操作指南,其中提供了以下示例:


🔗 开发者文档

https://goo.gle/nav3

🔗 操作指南

https://github.com/android/nav3-recipes

我们计划在未来为更复杂的用例提供代码示例、技术文档和文章。

Nav3 目前处于 Alpha 阶段,这意味着我们可能会根据反馈修改 API。如果您有任何问题或反馈,欢迎分享给我们

https://issuetracker.google.com/issues/new?component=1750212&template=2102223

Nav3 为在 Compose 应用中构建现代导航提供了灵活而强大的基础。我们非常期待看到您借此打造的精彩作品。

您可以在 io.google 上查看所有 Google I/O 2025 的精彩更新。也欢迎您持续关注 "Android 开发者" 微信公众号,及时了解更多开发技术和产品更新等资讯动态!


🔗 io.google

https://io.google/2025/?utm_source=blogpost&utm_medium=pr&utm_campaign=event&utm_content




阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Jetpack Navigation 3 Jetpack Compose Android 开发 导航库 声明式 UI Nav3
相关文章