导航
androidx.navigation
androidx.navigation.compose
androidx.navigation.dynamicfeatures
androidx.navigation.dynamicfeatures.fragment
androidx.navigation.dynamicfeatures.fragment.ui
androidx.navigation.fragment
androidx.navigation.fragment.compose
androidx.navigation.testing
androidx.navigation.ui
| 最近更新时间 | 稳定版 | 候选版 | Beta 版 | Alpha 版 |
|---|---|---|---|---|
| 2025 年 9 月 24 日 | 2.9.5 | - | - | - |
声明依赖项
如需添加 Navigation 的依赖项,您必须将 Google Maven 制品库添加到项目中。如需了解详情,请参阅 Google 的 Maven 制品库。
在应用或模块的 build.gradle 文件中添加所需制品的依赖项:
Groovy
plugins { // Kotlin serialization plugin for type safe routes and navigation arguments id 'org.jetbrains.kotlin.plugin.serialization' version '2.0.21' } dependencies { def nav_version = "2.9.5" // Jetpack Compose Integration implementation "androidx.navigation:navigation-compose:$nav_version" // Views/Fragments Integration implementation "androidx.navigation:navigation-fragment:$nav_version" implementation "androidx.navigation:navigation-ui:$nav_version" // Feature module support for Fragments implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version" // Testing Navigation androidTestImplementation "androidx.navigation:navigation-testing:$nav_version" // JSON serialization library, works with the Kotlin serialization plugin. implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3" }
Kotlin
plugins { // Kotlin serialization plugin for type safe routes and navigation arguments kotlin("plugin.serialization") version "2.0.21" } dependencies { val nav_version = "2.9.5" // Jetpack Compose integration implementation("androidx.navigation:navigation-compose:$nav_version") // Views/Fragments integration implementation("androidx.navigation:navigation-fragment:$nav_version") implementation("androidx.navigation:navigation-ui:$nav_version") // Feature module support for Fragments implementation("androidx.navigation:navigation-dynamic-features-fragment:$nav_version") // Testing Navigation androidTestImplementation("androidx.navigation:navigation-testing:$nav_version") // JSON serialization library, works with the Kotlin serialization plugin implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3") }
Safe Args
如需将 Safe Args 添加到您的项目,请在顶层 build.gradle 文件中包含以下 classpath:
Groovy
buildscript { repositories { google() } dependencies { def nav_version = "2.9.5" classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version" } }
Kotlin
buildscript { repositories { google() } dependencies { val nav_version = "2.9.5" classpath("androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version") } }
您还必须应用以下两个可用插件之一。
如需生成适用于 Java 模块或 Java 和 Kotlin 混合模块的 Java 语言代码,请将以下行添加到应用或模块的 build.gradle 文件中:
Groovy
plugins { id 'androidx.navigation.safeargs' }
Kotlin
plugins { id("androidx.navigation.safeargs") }
此外,如需生成仅适用于 Kotlin 模块的 Kotlin 语言代码,请添加以下行:
Groovy
plugins { id 'androidx.navigation.safeargs.kotlin' }
Kotlin
plugins { id("androidx.navigation.safeargs.kotlin") }
根据迁移到 AndroidX 文档,您的 gradle.properties 文件中必须具有 android.useAndroidX=true。
如需了解如何使用 Kotlin 扩展,请参阅 ktx 文档。
如需详细了解依赖项,请参阅添加 build 依赖项。
反馈
您的反馈将帮助我们改进 Jetpack。如果您发现了新问题,或对此库有任何改进建议,请告诉我们。创建新问题前,请先查看此库中的现有问题。您可以点击星标按钮,为现有问题投票。
如需了解详情,请参阅问题跟踪器文档。
版本 2.9
版本 2.9.5
2025 年 9 月 24 日
发布了 androidx.navigation:navigation-*:2.9.5。版本 2.9.5 中包含这些提交内容。
bug 修复
- Navigation Safe Args 现在可以处理 AGP 9.0 对内置 Kotlin 的支持。(I1d9d76)
依赖项更新
- Navigation Safe Args 插件现在依赖于 Android Gradle 插件版本 8.4.2。(b/431847270、I5932a)
版本 2.9.4
2025 年 9 月 10 日
发布了 androidx.navigation:navigation-*:2.9.4。版本 2.9.4 中包含这些提交内容。
bug 修复
- 防止在
NavHost过渡中停用处理程序后,在帧中间传递预测性返回事件时发生崩溃。(I5667c、b/384186542)
版本 2.9.3
2025 年 7 月 30 日
发布了 androidx.navigation:navigation-*:2.9.3。版本 2.9.3 中包含这些提交内容。
bug 修复
- 修复了
NavController中的一个错误,该错误会导致在使用OnDestinationChangedListeners时出现ConcurrentModificationException。(If7406、b/417784831) - 修复了使用
navigate(uri, navOptions,navigationExtras)时忽略 extra 的错误。(I67fb7、b/430336813)
版本 2.9.2
2025 年 7 月 16 日
发布了 androidx.navigation:navigation-*:2.9.2。版本 2.9.2 中包含这些提交内容。
bug 修复
- 修复了当入口上方的对话框被关闭时,入口未恢复的问题(Idb20e、b/418746335)
- 修复了在测试具有类型安全路由的
SavedStateHandle时使用自定义NavTypes时出现的MissingFieldException错误。(I2f843、b/421002511)
版本 2.9.1
2025 年 7 月 2 日
发布了 androidx.navigation:navigation-*:2.9.1。版本 2.9.1 中包含这些提交内容。
bug 修复
- 修复了以下问题:使用 single top 实例化的
NavEntries在其Lifecycle.State中永远不会超出 CREATED 状态。(I043ba、b/421095236)
2.9.0 版
2025 年 5 月 7 日
发布了 androidx.navigation:navigation-*:2.9.0。版本 2.9.0 中包含这些提交内容。
自 2.8.0 以来的重要变更
- 现在,导航 Safe Args 操作会使用
@CheckResult注释生成,以确保它们得到使用。
SupportingPane 接口
- 自定义 Navigator 现在可以将其目的地标记为实现
SupportingPane接口,这会向NavController指示这些目的地将与其他目的地一起显示。通过使用此接口,可以同时RESUMED多个目的地。
Compose Kotlin Multiplatform
- 导航现在提供了一个新的通用
NavController.handleDeepLink()函数,该函数接受NavDeepLinkRequest而不是Intent。这样一来,Android 以外的平台便可以正确处理深层链接。感谢 Konstantin Tskhovrebov! - 导航现在提供
NavUri,这是一个新的通用解析器函数,是适用于其他平台上 Android URI 的兼容 API。这样便可以以平台无关的方式创建 URI。感谢 Konstantin Tskhovrebov!
类型安全函数
- 之前只能通过
reified方法访问的类型安全 API,即composable<YourScreen>现在具有直接接受KClass实例的非具体化版本。 - Navigation 类型安全现在支持将值类用作路线或路线的实参类型。
版本 2.9.0-rc01
2025 年 4 月 23 日
发布了 androidx.navigation:navigation-*:2.9.0-rc01。版本 2.9.0-rc01 中包含这些提交内容。
bug 修复
- 从 Jetpack Navigation 中移除了所有非 Android 平台目标,因为这些目标实际上无法正常运行。现在提供不同平台的桩。(I2877d)
版本 2.9.0-beta01
2025 年 4 月 9 日
发布了 androidx.navigation:navigation-*:2.9.0-beta01。版本 2.9.0-beta01 中包含这些提交内容。
API 变更
parseStringAsNavUri的通用 API 已更改为采用 String 的NavUri工厂函数。(I4db6e、b/403616316)
依赖项更新
- 此库现在以 Kotlin 2.0 语言级别为目标,并且需要 KGP 2.0.0 或更高版本。(Idb6b5)
版本 2.9.0-alpha09
2025 年 3 月 26 日
发布了 androidx.navigation:navigation-*:2.9.0-alpha09。版本 2.9.0-alpha09 中包含这些提交内容。
新功能
navigation-testing模块现在除了支持 Android 之外,还支持桌面设备、Linux、macOS 和 iOS。(I2b770、b/398265336)- 除了 Android 之外,
NavType现在还支持桌面设备、Linux、macOS 和 iOS。(I297d8)
版本 2.9.0-alpha08
2025 年 3 月 12 日
发布了 androidx.navigation:navigation-*:2.9.0-alpha08。版本 2.9.0-alpha08 中包含这些提交内容。
bug 修复
- 从 Navigation
2.8.9开始:修复了 Navigation 2.8.8 中发现的回归问题,该问题要求深层链接必须与深层链接请求或 intent 的所有字段完全匹配才能被视为匹配。这导致包含部分字段匹配且不包含其他字段匹配的深层链接无法再正常运作。(Ie5e36、b/399826566)
外部贡献
- 新增了用于创建
NavUri的通用解析器函数。感谢 Konstantin Tskhovrebov!(If0a6a)
版本 2.9.0-alpha07
2025 年 2 月 26 日
发布了 androidx.navigation:navigation-*:2.9.0-alpha07。版本 2.9.0-alpha07 中包含这些提交内容。
bug 修复
- 修复了以下问题:尝试使用非包含性弹出操作进行
saveState会导致保存的状态为 null,从而在恢复时导致崩溃。(I9f3e8、b/395091644) - 从 Navigation 2.8.8 开始:修复了
NavDeepLink匹配问题,即深层链接和深层链接请求必须在 URI、操作和 MIME 上完全匹配。如果只有一两个字段匹配,则不再允许匹配。(I3b029、b/395712033) - 从 Navigation 2.8.8 开始:修复了以下 bug:具有通配符路径的路由与添加的深层链接不匹配(I7ea92、b/389970341)
外部贡献
- 将 navigation-common、navigation-runtime 和 navigation-compose API 提取到通用平台。感谢 Konstantin Tskhovrebov!(I1e626、Ica76f、Idf479)
已知问题
- 由于旨在解决 b/395712033 的工作,深层链接被错误地要求具有与深层链接请求和/或
Intent相同的所有字段。深层链接只需与它们所包含的字段匹配,而未包含的字段应被忽略。此问题已在后续版本中得到修复,具体请参阅 b/399826566。
版本 2.9.0-alpha06
2025 年 2 月 12 日
发布了 androidx.navigation:navigation-*:2.9.0-alpha06。版本 2.9.0-alpha06 中包含这些提交内容。
新功能
- 现在,导航 Safe Args 操作会使用
@CheckResult注释生成,以确保它们得到使用。(I14d4c、b/356323084)
bug 修复
- 修复了
NavController中的一个错误,该错误会导致在将 backStack 状态保存到列表时,错误地尝试将这些状态恢复到数组中。(Idfb9b) - 从 Navigation
2.8.7起:Navigation Safe Args 现在支持可组合的目标。(I35320、b/362791955)
版本 2.9.0-alpha05
2025 年 1 月 29 日
发布了 androidx.navigation:navigation-*:2.9.0-alpha05。版本 2.9.0-alpha05 中包含这些提交内容。
bug 修复
- 修复了使用 Navigation Compose 时导致出现意外缩放动画的问题。(I480f4、b/353294030)
- 从 Navigation
2.8.6:通过 XML 提供的NavDestination标签将通过NavType.get进行解析,以确保自定义NavType逻辑得到遵守。(I7ec2f、b/388100796) - 从 Navigation
2.8.6开始:现在,当导航到具有dataPattern的 activity 时,ActivityNavigator会尝试使用实参的NavType对实参值进行编码。(I16376、b/383616432) - 从 Navigation
2.8.5起:修复了以下问题:在使用 Navigation Compose 并在当前动画结束的同一帧中调用 navigate 时,会导致出现意外的缩放动画。(I26cb1、b/353294030)
版本 2.9.0-alpha04
2024 年 12 月 11 日
发布了 androidx.navigation:navigation-*:2.9.0-alpha04。版本 2.9.0-alpha04 中包含这些提交内容。
新功能
- 之前只能通过
reified方法访问的类型安全 API,即composable<YourScreen>现在具有直接接受KClass实例的非具体化版本。(Ia7eed、Id2879、Ibf244、I17d79、Id09d2、I54696、Ia47be、I93281、Ic1bf0、Iba4ee、If56a5、Icf969、I67644、I6f788、b/382094941、b/366291612、b/381938808)
下表提供了具体化 API 和 KClass API。
| reified | KClass |
|---|---|
composable<TestClass> { } |
composable(TestClass::class) { } |
navigation<NestedGraph>(startDestination = TestClass::class) |
navigation(route = NestedGraph::class, startDestination = TestClass::class) |
dialog<TestClass> {} |
dialog(TestClass::class) {} |
navDeepLink<TestClass>(baseUri) |
navDeepLink(TestClass::class, baseUri) |
NavDeepLink.Builder.setUriPattern<TestClass>(baseUri) |
NavDeepLink.Builder.setUriPattern(TestClass::class, baseUri) |
NavDestinationBuilder.deepLink<TestDeepLink>(baseUri) { } |
NavDestinationBuilder.deepLink(TestDeepLink::class, baseUri) { } |
navController.getBackStackEntry<TestClass>() |
navController.getBackStackEntry(TestClass::class) |
navController.popBackStack<TestClass>(true) |
navController.popBackStack(TestClass::class, true) |
navController.clearBackStack<TestClass>() |
navController.clearBackStack(TestClass::class) |
NavOptions.setPopUpTo<TestClass>() |
NavOptions.setPopUpTo(TestClass::class) |
navOptions { popUpTo<TestClass> {...} } |
navOptions { popUpTo(TestClass::class) {...} } |
NavGraph.setStartDestination<TestClass>() |
NavGraph.setStartDestination(TestClass::class) |
NavGraph.findNode<TestClass>() |
NavGraph.findNode(TestClass::class) |
backStackEntry.toRoute<TestClass>() |
backStackEntry.toRoute(TestClass::class) |
savedStateHandle.toRoute<TestClass>() |
savedStateHandle.toRoute(TestClass::class) |
API 变更
- 特定于 Kotlin 的
NavGraph.setStartDestination重载(用于确保类型安全)对 Java 来源隐藏。(Ic640c、b/364634035)
bug 修复
- 从 Navigation
2.8.5开始:修复了以下问题:如果返回堆栈被弹出到 1 个条目,并且在同一帧中触发了系统返回,NavHost可能会在PredictiveBackHandler内部抛出异常。(I1a429、b/375343407) - 从 Navigation
2.8.5开始:修复了更新图表的startDestination时出现的NavDestinationNullPointerException。(I99421、b/361560785)
外部贡献
- 从 Navigation
2.8.5起:导航类型安全现在支持List<Enum>作为路由的实参类型,而无需任何自定义NavType。感谢 Csaba Kozák!(GH-725、b/375559962)
版本 2.9.0-alpha03
2024 年 11 月 13 日
发布了 androidx.navigation:navigation-*:2.9.0-alpha03。版本 2.9.0-alpha03 中包含这些提交内容。
新功能
- Navigation 类型安全现在支持将值类用作路线或路线的实参类型。(I9344a、b/374347483)
bug 修复
- 修复了以下
ConcurrentModificationException:当附加到NavBackStackEntry的LifecycleObserver在宿主LifecycleOwner(例如包含的 Activity 或 Fragment)更改其生命周期状态时触发对返回堆栈的更改时,可能会发生此ConcurrentModificationException。(Ia9494)
版本 2.9.0-alpha02
2024 年 10 月 30 日
发布了 androidx.navigation:navigation-*:2.9.0-alpha02。版本 2.9.0-alpha02 中包含这些提交内容。
外部贡献
- 新增了通用的
NavController.handleDeepLink(request: NavDeepLinkRequest)方法。感谢 Konstantin Tskhovrebov!(I3e228)
版本 2.9.0-alpha01
2024 年 10 月 16 日
发布了 androidx.navigation:navigation-*:2.9.0-alpha01。版本 2.9.0-alpha01 包含这些提交内容。
新功能
- 自定义 Navigator 现在可以将其目的地标记为实现
SupportingPane接口,这会向NavController指示这些目的地将与其他目的地一起显示。通过使用此接口,可以同时RESUMED多个目的地。(Id5559) - 从 Navigation
2.8.3开始:为navigation-common、navigation-runtime和navigation-compose模块添加了新的 lint 检查,以帮助识别未正确使用@Serializable注释的任何类型安全的路线。此检查适用于所有NavGraphBuilder和NavDeepLinkBuilder扩展函数。(I4a259、I95402、Ie601a、Id8c6e、I28bda、b/362725816) - 从 Navigation
2.8.3开始:为navigation-common、navigation-runtime和navigation-compose模块添加了新的 lint 检查,以帮助识别任何未正确使用@Keep注释的具有枚举实参的类型安全路由。此检查适用于所有NavGraphBuilder和NavDeepLinkBuilder扩展函数。(I4a259、I95402、Ie601a、Id8c6e、I2b46f、b/358687142)
行为变更
- 尝试使用之前已
DESTROYED的NavController现在会导致IllegalStateException。(I520da、b/369616172)
bug 修复
- 更新了“找不到枚举类”异常,以建议在精简 build 中枚举类被擦除的情况下使用
@Keep注释。(I90e79、b/358137294)
已知问题
Navigation 2.8.*中添加的新 lint 规则存在一个问题,当尝试使用 Android Gradle 插件 8.4 及更高版本运行 lint 时,会导致出现Obsolete custom lint check错误。(b/368070326、b/371463741)
版本 2.8
版本 2.8.9
2025 年 3 月 12 日
发布了 androidx.navigation:navigation-*:2.8.9。版本 2.8.9 中包含这些提交内容。
bug 修复
- 修复了 Navigation 2.8.8 中发现的回归问题,该问题要求深层链接必须与深层链接请求或 intent 的所有字段完全匹配才能被视为匹配。这导致包含部分字段匹配且不包含其他字段匹配的深层链接无法再正常运作。(Ie5e36、b/399826566)
版本 2.8.8
2025 年 2 月 26 日
发布了 androidx.navigation:navigation-*:2.8.8。版本 2.8.8 中包含这些提交内容。
bug 修复
- 修复了以下 bug:包含通配符路径的路由与添加的深层链接不匹配。(I7ea92、b/389970341)
- 修复了
NavDeepLink匹配问题,现在深层链接和深层链接请求必须在 URI、操作和 MIME 上完全匹配。如果只有一两个字段匹配,则不再允许匹配。(I3227f、b/395712033)
已知问题
- 由于旨在解决 b/395712033 的工作,深层链接被错误地要求具有与深层链接请求和/或
Intent相同的所有字段。深层链接只需与它们所包含的字段匹配,而未包含的字段应被忽略。此问题已在后续版本中得到修复,具体请参阅 b/399826566。
版本 2.8.7
2025 年 2 月 12 日
发布了 androidx.navigation:navigation-*:2.8.7。版本 2.8.7 中包含这些提交内容。
bug 修复
- Navigation Safe Args 现在支持可组合目的地。(I35320、b/362791955)
版本 2.8.6
2025 年 1 月 29 日
发布了 androidx.navigation:navigation-*:2.8.6。版本 2.8.6 中包含这些提交内容。
bug 修复
- 通过 XML 提供的
NavDestination标签将通过NavType.get进行解析,以确保自定义NavType逻辑得到遵守。(Id366d、b/388100796) - 当使用
dataPattern导航到 activity 时,ActivityNavigator现在会尝试使用实参的NavType对实参值进行编码。(I1a71d、b/383616432)
版本 2.8.5
2024 年 12 月 11 日
发布了 androidx.navigation:navigation-*:2.8.5。版本 2.8.5 包含这些提交内容。
bug 修复
- 修复了以下问题:如果返回堆栈被弹出到 1 个条目,并且在同一帧中触发了系统返回,
NavHost可能会在PredictiveBackHandler内部抛出异常。(I1a429、b/375343407) - 修复了更新图表的
startDestination时出现的NavDestinationNullPointerException。(I99421、b/361560785) - 修复了以下问题:在使用 Navigation Compose 并在当前动画结束的同一帧中调用 navigate 时,会导致出现意外的缩放动画。(I26cb1、b/353294030)
- 修复了以下
ConcurrentModificationException:当附加到NavBackStackEntry的LifecycleObserver在宿主LifecycleOwner(例如包含的 Activity 或 Fragment)更改其生命周期状态时触发对返回堆栈的更改时,可能会发生此ConcurrentModificationException。(Ia9494)
外部贡献
- 导航类型安全机制现在支持将
List<Enum>用作路由的实参类型,而无需任何自定义NavType。感谢 Csaba Kozák!(GH-725、b/375559962)
版本 2.8.4
2024 年 11 月 13 日
发布了 androidx.navigation:navigation-*:2.8.4。版本 2.8.4 包含这些提交内容。
新功能
- 自 Navigation
2.9.0-alpha03起:导航类型安全现在支持将值类作为路线或作为路线的实参类型(I9344a、b/374347483)
bug 修复
- 从 Navigation
2.9.0-alpha01:尝试使用之前已DESTROYED的NavController现在会导致IllegalStateException。(I520da、b/369616172)
版本 2.8.3
2024 年 10 月 16 日
发布了 androidx.navigation:navigation-*:2.8.3。版本 2.8.3 中包含这些提交内容。
新功能
- 为
navigation-common、navigation-runtime和navigation-compose模块添加了新的 lint 检查,以帮助识别未正确使用@Serializable注释的任何类型安全路由。此检查适用于所有NavGraphBuilder和NavDeepLinkBuilder扩展函数。(I4a259、I95402、Ie601a、Id8c6e、I28bda、b/362725816) - 为
navigation-common、navigation-runtime和navigation-compose模块添加了新的 lint 检查,以帮助识别任何未正确使用@Keep注释的具有枚举实参的类型安全路线。此检查适用于所有NavGraphBuilder和NavDeepLinkBuilder扩展函数。(I4a259、I95402、Ie601a、Id8c6e、I2b46f、b/358687142)
bug 修复
- 修复了以下问题:在
Navigation 2.8.*中添加的新 lint 规则在尝试使用 Android Gradle 插件 8.4 及更高版本运行 lint 时会导致出现Obsolete custom lint check错误。(I1be3d、b/368070326、b/371463741)
已知问题
- 当尝试使用 Lint 16 (AGP 8.7) 或更高版本运行 lint 时,导航 lint 会抛出过时的自定义 lint 检查错误。(b/371926651)
版本 2.8.2
2024 年 10 月 2 日
发布了 androidx.navigation:navigation-*:2.8.2。版本 2.8.2 中包含这些提交内容。
新功能
- 导航类型安全功能现在支持包含
Double、Double?、DoubleArray、DoubleArray?、List<Double>和List<Double>?的 Serializable 类,而无需任何自定义NavType。(I570eb、Ibc4c0、I37461、I5bed4、b/359245753)
bug 修复
- 改进了导航无法将路线实参映射到
NavType时的错误消息,新错误消息将包含实参名称、实参完全限定名称和路线完全限定名称。(Id8416、b/346264232)
版本 2.8.1
2024 年 9 月 18 日
发布了 androidx.navigation:navigation-*:2.8.1。版本 2.8.1 中包含这些提交内容。
新功能
- 添加了一项新的 lint 规则,以确保在尝试使用类型安全的 API 进行
popBackStack时,使用采用具体化类类型的popBackStack函数。(Ief161、b/358095343)
bug 修复
- 导航现在要求传递给
NavGraph的startDestination包含所有必需实参的值,包括不可为 null 且没有默认值的实参。(I18e74、b/362594265) - 导航安全参数已添加对不可为 null 的字符串的支持,以便将“null”值按原样解析并存储到 bundle 中。这与现有行为不同,现有行为是将“null”值解析为 null 对象。此更改仅适用于不可为 null 的 String 类型。可为 null 的字符串保持不变。(I08b4a、b/348936238)
- 现在,除了通过明确添加到目的地的深层链接之外,无法再通过深层链接进入
NavDestination。这也意味着,您只能使用接受字符串路线的 navigate 函数重载来导航到目的地的路线。此版本修复了一个漏洞,该漏洞使深层链接能够指向可能受保护的目标。(Ie30e6)
依赖项更新
- Navigation Safe Args 现在依赖于 Kotlin 1.9.24,而不是 Kotlin 2.X,确保开发者不会被迫更新。(a4129a)
- Navigation Compose 现在依赖于 Compose
1.7.2。
版本 2.8.0
2024 年 9 月 4 日
发布了 androidx.navigation:navigation-*:2.8.0。版本 2.8.0 中包含这些提交内容。
自 2.7.0 以来的重要变更
Navigation Kotlin DSL 类型安全
- Navigation 现在使用 Kotlin 序列化为 Kotlin DSL(由 Navigation Compose 使用)提供类型安全,以便您通过类型安全的对象和数据类在导航图中定义目的地:
// Define a home destination that doesn't take any arguments
@Serializable
object Home
// Define a profile destination that takes an ID
@Serializable
data class Profile(val id: String)
// Now define your NavHost using type safe objects
NavHost(navController, startDestination = Home) {
composable<Home> {
HomeScreen(onNavigateToProfile = { id ->
navController.navigate(Profile(id))
})
}
composable<Profile> { backStackEntry ->
val profile: Profile = backStackEntry.toRoute()
ProfileScreen(profile)
}
}
如需了解详情,请参阅“Navigation Compose 遇上类型安全”博文。
Navigation Compose 预测性返回
- Navigation Compose 现在通过 compose-animation 中的新
SeekableTransitionStateAPI 支持应用内预测性返回。这样,您就可以使用返回手势查看具有自定义过渡效果的上一个目的地,然后再决定是通过完成手势来提交事务,还是取消事务。
导航 fragment 可组合项
- 添加了新的
navigation-fragment-compose制品,其中包含ComposableNavHostFragment(NavHostFragment的替代方案),可让您向 Navigation XML 文件添加可组合的目的地。每个composable目的地都必须表示为顶级无实参@Composable方法,其完全限定名称用作每个目的地的android:name属性。当导航到其中一个目的地时,系统会创建一个包含 fragment 来显示可组合项内容。
// In HomeScreen.kt
@Composable
fun HomeScreen() {
// Your Composable content here
}
// In your navigation.xml
<composable
android:id="@+id/home_screen"
android:name="com.example.HomeScreenKt\$HomeScreen" />
其他更改
- Navigation Compose 现在依赖于 Compose 1.7.0。
- Navigation 现在提供了一个新的
CollectionNavType<T>类,它是NavType<T>的子类,用于基于集合的实参,例如列表、数组、映射。所有默认NavType数组(IntArrayType、LongArrayType、FloatArrayType、BoolArrayType和StringArrayType)现在都继承自这个新类。 NavType现在内置了对整数、字符串、布尔值、浮点数和长整数列表的支持。
版本 2.8.0-rc01
2024 年 8 月 21 日
发布了 androidx.navigation:navigation-*:2.8.0-rc01。版本 2.8.0-rc01 中包含这些提交内容。
bug 修复
- 修复了在将顶级枚举类作为类型安全实参传入时发生的导航崩溃问题。(I0ba76、b/358137294)
- Navigation 2.8 现在可与 SDK 34 正确搭配使用,并且在 2.9 版本发布之前不会切换到 SDK 35,AndroidX 库的其余部分也是如此。(b/358798728)
版本 2.8.0-beta07
2024 年 8 月 7 日
发布了 androidx.navigation:navigation-*:2.8.0-beta07。版本 2.8.0-beta07 中包含这些提交内容。
已知问题
- 由于存在 b/358137294,因此仅支持嵌套在其他类中的枚举。下一版本将支持顶级枚举。
bug 修复
- 当导航到重复或共享的目的地时,导航会优先前往图表中当前位置最近的匹配目的地。(Ic89a4、b/352006850)
- safe args 中的导航现在添加了新的
NavType.EnumType。这意味着Enum类型不再需要自定义NavType。请注意,Enum的SerialName必须是默认的完全限定名称。(I66d22、b/346475493) - Safe Args 中的导航功能已添加对可为 null 的实参类型的内置支持,包括
Int?、Long?、Float?、Boolean?和Enum<*>?。(I32d13、I1c580、Ifba66、I978b0、Ide076、b/351994237) - 现在,如果传递给
NavGraph的startDestination路由与startDestination.route完全相同,NavGraph的startDestination将使用默认实参值。(I13762、b/354046047)
版本 2.8.0-beta06
2024 年 7 月 24 日
发布了 androidx.navigation:navigation-*:2.8.0-beta06。版本 2.8.0-beta06 中包含这些提交内容。
bug 修复
- 修复了
WrongStartDestinationTypelint 检查不会检查传入的类类型是否存在伴生对象,导致 lint 无法检测到错误的问题。(I92b09)
版本 2.8.0-beta05
2024 年 7 月 10 日
发布了 androidx.navigation:navigation-*:2.8.0-beta05。版本 2.8.0-beta05 中包含这些提交内容。
bug 修复
- 修复了嵌套
NavGraphs共享同一startDestination路线时发生的singleTop导航崩溃问题。(I17b94、b/294408596)
版本 2.8.0-beta04
2024 年 6 月 26 日
发布了 androidx.navigation:navigation-*:2.8.0-beta04。版本 2.8.0-beta04 中包含这些提交内容。
bug 修复
- Navigation 现在支持在路径实参中使用空字符串进行导航。(Ic5dbd、b/339481310)
- 改进了通过
@Serializable(with =...)直接在类字段上声明的自定义序列化程序的错误消息,以明确指出此功能目前不受支持。(I052b0、b/341319151) SavedStateHandleFactory测试 API 现在可用于非 Android 测试,但需要 Robolectric 支持使用 Bundle 进行实参解析。(I76cdc、b/340966212)- 修复了以下问题:在 Compose 中使用类型安全导航时,在进程终止后恢复应用时,恢复状态会导致崩溃。(Ia8f38、b/341801005)
- 修复了 Navigation Compose 中的一个问题,即在取消预测性返回手势后,用户返回的
NavBackStackEntry永远不会返回到RESUMED生命周期状态。这还可以确保返回目的地在快速滑动后正确地动画返回,而不是直接到位。(I97a0c、b/346608857) - 将预测性返回与 Navigation Compose 搭配使用时,正在弹出的目的地现在将具有正确的 z 顺序,从而在传入的目的地上方正确地进行动画处理。(I2077b、b/345993681)
版本 2.8.0-beta03
2024 年 6 月 12 日
发布了 androidx.navigation:navigation-*:2.8.0-beta03。版本 2.8.0-beta03 中包含这些提交内容。
API 变更
CollectionNavType新增了抽象方法emptyCollection()。替换此方法以处理作为实参传入的空集合。(Ie4d84、b/341723133)
bug 修复
- 添加了有关
NavType.serializeAsValue和serializeAsValues的文档,以强调最终输出应采用 URI 编码。(Ida6bd、b/344943214) - 修复了使用 null
CollectionNavType实参调用toRoute<T>时发生崩溃的问题。当使用 nullCollectionNavType进行导航时,输出实参将是您的 Serializable 类上声明的默认值,如果没有默认值,则为emptyCollection()的返回值。(I84158、Id630f、b/342672856)
版本 2.8.0-beta02
2024 年 5 月 29 日
发布了 androidx.navigation:navigation-*:2.8.0-beta02。版本 2.8.0-beta02 中包含这些提交内容。
bug 修复
- 修复了将
NavBackStackEntry.toRoute与可为 null 的自定义NavType搭配使用时出现的ClassCastException崩溃问题。(I1c29b、b/342239473) - 修复了以下问题:当尝试恢复无法通过 ID 从当前目的地到达的返回堆栈条目时,导航返回堆栈状态恢复出现问题。由于路由由 ID 提供支持,因此使用路由构建的目标位置也会受到影响。此版本还修复了因调用
clearBackStack()而导致的崩溃问题,该问题具有相同的根本原因。(I423c3、b/339908057)
版本 2.8.0-beta01
2024 年 5 月 14 日
发布了 androidx.navigation:navigation-*:2.8.0-beta01。版本 2.8.0-beta01 中包含这些提交内容。
API 变更
SavedStateHandle.toRoute()现在接受typeMap参数,用于自定义实参类型。(Ie39fb、b/339026523)- 向
navigation-testing添加了一个测试 API,用于从 Kotlin Serializable 对象创建SavedStateHandle。(Id4867、b/339080702)
bug 修复
- 为 Navigation Kotlin DSL 函数添加了缺失的参数文档。(I26a36)
版本 2.8.0-alpha08
2024 年 5 月 1 日
发布了 androidx.navigation:navigation-*:2.8.0-alpha08。版本 2.8.0-alpha08 中包含这些提交内容。
Navigation Compose 中的 Safe Args
- 我们已完成基于 Kotlin 序列化为 Navigation Compose 和 Navigation Kotlin DSL 用户提供编译时类型安全支持的工作,之前处于实验阶段的 API 现在已稳定。(Iea94d、I0eb0d、I873b7、I3a64b、I6c3a2、I11f0b、Ic3032、I8d394、I95710、Ice060、Id0e55、I45f8b、Idcdaf、If5380、I08b23、Ia5c59、b/188693139)
此功能使用 Kotlin 序列化,让您可以通过类型安全的对象和数据类在导航图中定义目的地:
// Define a home destination that doesn't take any arguments
@Serializable
object Home
// Define a profile destination that takes an ID
@Serializable
data class Profile(val id: String)
// Now define your NavHost using type safe objects
NavHost(navController, startDestination = Home) {
composable<Home> {
HomeScreen(onNavigateToProfile = { id ->
navController.navigate(Profile(id))
})
}
composable<Profile> { backStackEntry ->
val profile: Profile = backStackEntry.toRoute()
ProfileScreen(profile)
}
}
如需了解详情,请参阅“Navigation Compose 遇上类型安全”博文。
新功能
navigation-fragment-compose制品现在为ComposableFragment内的可组合方法提供LocalFragmentCompositionLocal。(If35e5)NavType现在内置了对整数、字符串、布尔值、浮点数和长整数列表的支持。(I4b6dd、Ia914c、b/188693139)
版本 2.8.0-alpha07
2024 年 4 月 17 日
发布了 androidx.navigation:navigation-*:2.8.0-alpha07。版本 2.8.0-alpha07 中包含这些提交内容。
新功能
添加了一个新的
navigation-fragment-compose制品,其中包含NavHostFragment的ComposableNavHostFragment替代方案,可让您向 Navigation XML 文件添加composable目的地。每个composable目的地都必须表示为顶级无实参@Composable方法,其完全限定名称用作每个目的地的android:name属性。当导航到其中一个目的地时,系统会创建一个包含 fragment 来显示可组合项内容。(I0ef2e、b/265480755)// In HomeScreen.kt @Composable fun HomeScreen() { // Your Composable content here }// In your navigation.xml <composable android:id="@+id/home_screen" android:name="com.example.HomeScreenKt\$HomeScreen" />
API 变更
- 继续支持在 Navigation Compose 中使用 Safe Args,方法是基于 Kotlin 序列化。这些 API 尚未完成,并标记有
ExperimentalSafeArgsApi注解。在未来的版本中,当整个 API 表面完成时,此注释将被移除。(Iefd95、I409c8、 I5b5ac、I7e753、I960f8、I3eabd、I8ed5a、Ied2c9、I9b73c、I554db、Ib3aba、Ia668d、b/188693139)
版本 2.8.0-alpha06
2024 年 4 月 3 日
发布了 androidx.navigation:navigation-*:2.8.0-alpha06。版本 2.8.0-alpha06 中包含这些提交内容。
API 变更
- 我们已开始支持在 Navigation Compose 中使用 Safe Args,方法是基于 Kotlin 序列化。这些 API 尚未完成,并标记有
ExperimentalSafeArgsApi注解。在未来的版本中,当整个 API 表面完成时,此注释将被移除。(I644e7、I98896、I2a1c5、I43a51、I836a1、Ic5eec、I39407、I24e41、If9e14、Ibb13e、If44d3、Icb70f、I8972f、I1d432、Icf32b、I20a14、I262aa、I7de99、I35990、I1033d、b/188693139)
bug 修复
NavHost现在使用Alignment.TopStart作为默认的 contentAlignment 实参。这使其与AnimatedContent的默认值保持一致,并修复了从中心过渡时出现意外缩放的一些情况。(I09e72、b/330111602)- 在使用 Navigation Compose 时,如果快速滑动以执行预测性返回手势,
NavHost现在会正确完成自定义过渡,而不是立即结束。(I99017、b/327292110)
版本 2.8.0-alpha05
2024 年 3 月 20 日
发布了 androidx.navigation:navigation-*:2.8.0-alpha05。版本 2.8.0-alpha05 中包含这些提交内容。
新功能
- 现在,您可以在
startDestination路由中直接将实参传递给NavGraph的startDestination,而无需依赖defaultValue。这也适用于嵌套的NavGraphstartDestinations。(I0e0b5、b/109505019、b/188693139)
API 变更
- 添加了新的抽象
CollectionNavType<T>类,它是NavType<T>的子类,用于基于集合的实参,例如列表、数组、映射。(Ic6d63、b/188693139) - 所有默认
NavType数组(IntArrayType、LongArrayType、FloatArrayType、BoolArrayType和StringArrayType)现在都属于CollectionNavType类型(Idcf79、b/188693139) NavType现在提供了一个新的开放valueEqualsAPI,用于确定同一类型的两个值是否相等。(I6cb97、b/327229511)
bug 修复
- 深层链接中的查询参数现在允许使用大括号括起来的实参名称(即
{argName})形式的值作为基于字符串的NavTypes的有效值。此问题修复了以下问题:对于所有类型,此类值都会被视为无效值(或缺少值)。(I18302、b/327274038) - 支持路由(例如
navigate或popBackStack)的NavController函数现在可以正确匹配填充了 ArrayNavTypes实参的路由。(Iea805、b/327229511)
版本 2.8.0-alpha04
2024 年 3 月 6 日
发布了 androidx.navigation:navigation-*:2.8.0-alpha04。版本 2.8.0-alpha04 中包含这些提交内容。
新功能
- 您现在可以在 Navigation Compose 中为过渡指定
SizeTranform,方法是将其定义为composable和/或navigation函数初始化的组成部分。(I91062、b/296912651)
bug 修复
- 修复了以下问题:在不使用手势的情况下使用系统返回时,Compose Navigation 中的
NavHost无法正确显示过渡效果。(Iceeae、b/325998468)
版本 2.8.0-alpha03
2024 年 2 月 21 日
发布了 androidx.navigation:navigation-*:2.8.0-alpha03。版本 2.8.0-alpha03 中包含这些提交内容。
API 变更
NavBackStackEntry.savedStateHandle现在标记为@MainThread,因为它使用的代码无论如何都必须在主线程上运行。(Ibb988、b/299523245)
bug 修复
- 修复了 Navigation 中的一个问题,该问题导致
NavGraphViewModel 过早地被DESTROYED,因为关联条目的ViewModel不属于已保存的状态。(Ib6bb7、b/317581849)
依赖项更新
- Navigation Compose 现在依赖于 Compose 1.7.0-alpha03。
版本 2.8.0-alpha02
2024 年 2 月 7 日
发布了 androidx.navigation:navigation-*:2.8.0-alpha02。版本 2.8.0-alpha02 中包含这些提交内容。
新功能
- Navigation Compose 现在通过 compose-animation 中的新
SeekableTransitionStateAPI 支持应用内预测性返回。这样,您就可以使用返回手势查看具有自定义过渡效果的上一个目的地,然后再决定是通过完成手势来提交事务,还是取消事务。(I8b8e9)
版本 2.8.0-alpha01
2024 年 1 月 24 日
发布了 androidx.navigation:navigation-*:2.8.0-alpha01。版本 2.8.0-alpha01 中包含这些提交内容。
bug 修复
- 修复了
BackStackState泄漏问题,即对目标位置进行多次saveState调用会导致保存多个状态,但只能恢复第一个状态。(I598b0、b/309559751) - 修复了以下问题:使用
NavigationUI辅助函数填充应用栏的标题时,非字符串实参无法正确显示。(#636、b/316676794)
依赖项更新
- Navigation Compose 现在依赖于 Compose
1.7.0-alpha01,修复了可能导致出现意外缩放动画的问题。(b/297258205)
外部贡献
- 感谢 SimonMarquis 修复了以下显示问题:使用
NavigationUI辅助函数填充应用栏的标题时,非字符串实参的显示问题。
版本 2.7.7
版本 2.7.7
2024 年 2 月 7 日
发布了 androidx.navigation:navigation-*:2.7.7。版本 2.7.7 中包含这些提交内容。
bug 修复
- 从 Navigation
2.8.0-alpha01反向移植:修复了BackStackState泄漏问题,即在单个NavBackStackEntry上多次调用saveState()会导致保存多个状态,但只能恢复第一个已保存的状态。(I598b0、b/309559751) - 从 Navigation
2.8.0-alpha01向后移植:修复了以下问题:使用NavigationUI辅助函数填充应用栏的标题时,非字符串实参无法正确显示。(#636、b/316676794)
外部贡献
- 感谢 SimonMarquis 修复了以下显示问题:使用
NavigationUI辅助函数填充应用栏的标题时,非字符串实参的显示问题。
版本 2.7.6
版本 2.7.6
2023 年 12 月 13 日
发布了 androidx.navigation:navigation-*:2.7.6。版本 2.7.6 中包含这些提交内容。
bug 修复
NavGraphequals()函数现在可以正确考虑其他图的节点,而不仅仅是调用图的节点。这样可确保具有不同 ID 的节点图不再被视为相等(I401cb、b/311414915)
版本 2.7.5
版本 2.7.5
2023 年 11 月 1 日
发布了 androidx.navigation:navigation-*:2.7.5。版本 2.7.5 中包含这些提交内容。
性能改进
- 大幅提升了比较两个图表的性能(包括时间和分配数量)。这意味着,内部将新图与现有图进行比较的
setGraph等调用会快得多,并且会导致跳过的帧数更少。感谢 Michał Z 的深入分析,促成了此次改进。(I6ad62) NavHost现在会在第一次组合传递时渲染起始目的地,而无需等待第二次传递来读取更新后的状态。(I439a7、b/304852206)
bug 修复
- 修复了以下问题:如果您多次调用
setGraph,且每次调用的图完全相同,则只有当图中的某个目的地包含链接两个目的地的操作时,您的返回堆栈才会弹出。(Ieaed7) - 快速连续导航到并关闭的对话框将不再泄漏到
NavController.visibleEntries列表中。(I67586、b/287969970) - 当弹出条目后发生配置更改时,如果
saveState为 false,系统现在会正确清除条目的ViewModel。(Idf242、b/298164648) - 修复了以下问题:如果回栈在配置更改或调用
setGraph之前完全为空,则NavController可能会多次处理同一深层链接,但仅当传入的 intent 设置了FLAG_ACTIVITY_NEW_TASK标志时才会出现此问题。(I73c7f)
依赖项更新
- 现在,使用 Fragment 的 Navigation 依赖于 Fragment 1.6.2,从而修复了在调用
clearBackStack时嵌套 fragment 的ViewModel实例不会被清除的问题。
版本 2.7.4
版本 2.7.4
2023 年 10 月 4 日
发布了 androidx.navigation:navigation-*:2.7.4。版本 2.7.4 中包含这些提交内容。
新功能
- 添加了对
popUpTo的支持,以使用带实参的路由,从而允许弹回到使用这些确切实参的特定条目,与popBackStack中的支持相匹配。(I731f4、b/299255572)
bug 修复
- 修复了以下问题:使用
popUpTo中断导航会导致FragmentNavigator崩溃。(I3c848、b/301887045) - 修复了以下问题:系统返回按钮按下操作导致
currentDestination未正确更新以匹配显示的 Fragment。(Id0d6c、b/289877514) - 现在,当上方的对话框被关闭时,
DialogFragment生命周期会正确移至RESUMED状态。(I88f0d、b/301811387)
版本 2.7.3
版本 2.7.3
2023 年 9 月 20 日
发布了 androidx.navigation:navigation-*:2.7.3。版本 2.7.3 中包含这些提交内容。
bug 修复
- 修复了 Navigation 中与 fragment 相关的问题,该问题会导致
visibleEntries列表包含错误的条目。(I5caa9、b/288520638) - 修复了导致浮动窗口目的地(即
Dialogs、Bottomsheets等)永远不会获得RESUMED生命周期回调的问题。(I3b866、b/287505132)
版本 2.7.2
版本 2.7.2
2023 年 9 月 6 日
发布了 androidx.navigation:navigation-*:2.7.2。版本 2.7.2 中包含这些提交内容。
bug 修复
- Navigation 现在依赖于 Lifecycle
2.6.2,修复了rememberSaveable与 Navigation Compose 的NavHost之间的互动,该互动会导致在进程终止和重新创建后,无法正确恢复目的地和任何ViewModel所属SavedStateHandle实例的rememberSaveable状态。(b/298059596、b/289436035) - 修复了以下问题:在 Navigation Compose 中同时显示多个对话框时,部分遮挡的对话框(例如,不是最顶层的对话框)会处于
CREATED生命周期状态,而不是STARTED状态。(aosp/2728520、b/289257213) - 修复了以下问题:在 Navigation Compose 中同时显示多个对话框时,关闭最上面的对话框会导致新的最上面的对话框卡在
STARTED生命周期状态,而不是正确移动到RESUMED。(aosp/2629401、b/286371387) - 如果 Navigation Safe Args 实际上未执行,则不再急切地实例化其任务。(I0e385、b/260322841)
依赖项更新
- Navigation Compose 现在依赖于 Compose 1.5.1。
版本 2.7.1
版本 2.7.1
2023 年 8 月 23 日
发布了 androidx.navigation:navigation-*:2.7.1。版本 2.7.1 中包含这些提交内容。
bug 修复
- 修复了 Navigation 与 Compose 搭配使用时存在的问题,即使用
Scaffold时,可能会因尝试访问Lifecycle.State.DESTROYEDViewModel而出现错误。(I1dc11、b/268422136)
版本 2.7.0
版本 2.7.0
2023 年 8 月 9 日
发布了 androidx.navigation:navigation-*:2.7.0。版本 2.7.0 中包含这些提交内容。
自 2.6.0 以来的重要变更
来自 Accompanist 的动画
现在 AnimatedContent 已稳定,我们可以将代码从 Accompanist Navigation Animation 移回 Navigation Compose 本身。
这意味着,AnimatedNavHost 中支持的所有自定义过渡效果设置在 NavHost 中都直接受支持。
我们将不再对 Accompanist Navigation Animation 进行任何其他更改,并很快会正式将其弃用,同时提供有关如何迁移回 Navigation Compose 本身的指南,但如果您已在使用最新的 Accompanist Alpha 版 (0.31.2-alpha),则只需按照迁移指南的反向操作即可,无需进行其他 API 更改。(b/197140101)
bug 修复
- Navigation Compose 中的 NavHost 现在可以正确拦截系统返回调用,即使在 Activity 已停止并恢复后也是如此。(Icb6de、b/279118447)
依赖项更新
- Navigation 现在依赖于 Compose
1.5.0(从1.1.0开始)。
版本 2.7.0-rc01
2023 年 7 月 26 日
发布了 androidx.navigation:navigation-*:2.7.0-rc01。版本 2.7.0-rc01 中包含这些提交内容。
bug 修复
- 修复了以下问题:作为
NavHost的一部分创建的EnterTransition和ExitTransitionlambda 可能会在NavHost从组合中移除后仍保留在内存中。(I893d0)
已知问题
- Navigation 2.6.x 存在一个问题,即在使用 popUpTo 进行导航时,可能会导致
IllegalArgumentException。您或许可以按照此处提供的建议重构图,从而避免此异常。(b/287133013)
版本 2.7.0-beta02
2023 年 6 月 28 日
发布了 androidx.navigation:navigation-*:2.7.0-beta02。版本 2.7.0-beta02 中包含这些提交内容。
bug 修复
- Navigation Compose 现在为使用
popUpTo选项通过 navigate 进行导航的自定义过渡设置了正确的 z 顺序。(/Ib1c3a、b/285153947)
版本 2.7.0-beta01
2023 年 6 月 7 日
发布了 androidx.navigation:navigation-*:2.7.0-beta01。版本 2.7.0-beta01 中包含这些提交内容。
bug 修复
- Navigation Compose 中的
NavHost现在可以正确拦截系统返回调用,即使在Activity已STOPPED和RESUMED之后也是如此。(Icb6de、b/279118447)
版本 2.7.0-alpha01
2023 年 5 月 24 日
发布了 androidx.navigation:navigation-*:2.7.0-alpha01。版本 2.7.0-alpha01 中包含这些提交内容。
来自 Accompanist 的动画
现在 AnimatedContent 已稳定,我们可以将代码从 Accompanist Navigation Animation 移回 Navigation Compose 本身。
这意味着,AnimatedNavHost 中支持的所有自定义过渡效果设置在 NavHost 中都直接受支持。
我们将不再对 Accompanist Navigation Animation 进行任何其他更改,并很快会正式将其弃用,同时提供有关如何迁移回 Navigation Compose 本身的指南,但如果您已在使用最新的 Accompanist Alpha 版 (0.31.2-alpha),则只需按照迁移指南的反向操作即可,无需进行其他 API 更改。(b/197140101)
bug 修复
- 从 Navigation
2.6.0-rc02开始:修复了 Fragment 中的 Navigation 存在的问题,即使用popUpTo进行导航并将 fragment 从返回堆栈中弹出而不重新创建其视图会导致系统返回停止工作。(Ieb8d4、b/281726455)
依赖项更新
- Navigation 现在依赖于 Compose
1.5.0-beta01。
版本 2.6.0
版本 2.6.0
2023 年 6 月 7 日
发布了 androidx.navigation:navigation-*:2.6.0。版本 2.6.0 中包含这些提交内容。
自 2.5.0 以来的导航功能重要变更
NavBackStackEntry的arguments和传递给OnDestinationChangedListener的arguments现在只是您在导航到目的地时创建的不可变实参的副本。这意味着,对这些 Bundle 所做的任何更改都不会反映在对arguments或其他OnDestinationChangedListener实例的后续访问中。- 现在,
NavDeepLink支持数组默认值,从而支持有重复的查询参数映射到参数数组类型。现在,NavType还包含一个默认方法,您可以替换该方法以合并两个解析值。 NavType的自定义子类现在可以替换serializeAsValue,以将值序列化为字符串,从而允许(通过parseValue)将序列化和反序列化对象完全封装在NavType类中。StringType现在替换了此方法,对给定的String调用Uri.encode。
自 2.5.0 以来的 Navigation Compose 重要变更
- 预览带有
NavHost的可组合项时,系统现在会默认显示 NavGraph 的startDestination。 NavController.popBackStack(route)、NavController.getBackStackEntry(route)、NavController.clearBackStack(route)现在都支持包含部分或全部填充的参数的路线。请注意,参数必须与条目的参数完全匹配。- 现在,尝试使用
navDeepLinkKotlin DSL 创建空NavDeepLink会导致 lint 警告,指出深层链接需要 uri、action 和/或 mimetype 才能有效。
自 2.5.0 以来,Navigation 与 Fragment 方面的重要变更
NavHostFragment不再拦截系统返回按钮本身。这样,底层FragmentManager就可以处理系统返回。这使得 Fragment1.7.0-alpha01及更高版本能够在 Android U 设备上提供应用内预测性返回动画。- 将 Navigation 与 Fragment 搭配使用时,尝试手动执行将 fragment 添加到
FragmentManager的返回堆栈的FragmentTransaction现在会抛出IllegalArgumentException。您应始终通过navigate()API 添加片段。 - 在导航 XML 文件的 activity 元素中使用确切字符串
${applicationId}作为app:data和app:dataPattern属性中的占位符时,系统会在膨胀时自动使用上下文的packageName填充占位符。 - 在导航和弹出
NavBackStackEntries时,FragmentNavigator现在使用转换 API。这意味着,NavBackStackEntryLifecycle现在会等待进入和退出 fragment 特效完成,然后再移动其最终的Lifecycle.State。 - 在导航和弹出
NavBackStackEntries时,DialogFragmentNavigator现在使用转换 API。这意味着,NavBackStackEntryLifecycle现在会等待DialogFragmentLifecycle移至DESTROYED,然后再移至DESTROYED本身。 NavHostFragment现在允许您在NavHostFragment附加到FragmentManager后立即检索NavController,而不是仅在onCreate()之后检索。- Navigation 对动态功能模块的支持现在依赖于精细的 Play Feature Delivery 库。
- Navigation Safe Args 现在依赖于 Android Gradle 插件版本 7.3.0。这意味着它现在仅与版本 7.3.0 及更高版本兼容。
自 2.5.0 以来对 NavigationUI 的重要变更
- 将导航图的 ID 传递给
AppBarConfiguration(例如通过Menu)时,NavigationUI现在只会将该导航图的起始目的地视为顶级目的地,而不会错误地将导航图内的每个目的地标记为顶级目的地。传递单个目的地的 ID 这种行为保持不变。您也可以通过AppBarConfiguration中的新isTopLevelDestination函数对自己的代码使用这一功能。 - 现在,
NavigationUI中用于处理顶部应用栏的setupWithNavController集成会将android:label中的ReferenceType实参的R.string值解析为字符串值,而不是输出自动生成的资源整数值。 - 现在,如果
NavigationUI无法通过所选MenuItem进行导航,它会提供日志。
版本 2.6.0-rc02
2023 年 5 月 24 日
发布了 androidx.navigation:navigation-*:2.6.0-rc02。版本 2.6.0-rc02 中包含这些提交内容。
bug 修复
- 修复了以下问题:在 fragment 中使用
popUpTo进行导航,并在不重新创建 fragment 视图的情况下从返回堆栈中弹出 fragment,会导致系统返回停止工作。(Ieb8d4、b/281726455)
版本 2.6.0-rc01
2023 年 5 月 10 日
发布了 androidx.navigation:navigation-*:2.6.0-rc01。版本 2.6.0-rc01 中包含这些提交内容。
bug 修复
- 修复了 Navigation 中与 fragment 相关的问题:通过在
onResume()生命周期回调中使用popUpTo的 navigate 来移除 fragment 会导致IllegalStateException。(I21884、b/279644470)
版本 2.6.0-beta01
2023 年 4 月 19 日
发布了 androidx.navigation:navigation-*:2.6.0-beta01。版本 2.6.0-beta01 中包含这些提交内容。
新功能
NavBackStackEntry现在提供自定义toString实现。(Iff00b)
bug 修复
- 将 Navigation 与 Fragment 搭配使用时,尝试手动执行将 fragment 添加到
FragmentManager的返回堆栈的FragmentTransaction现在会抛出IllegalArgumentException。您应始终通过navigate()API 添加片段。(I6d38e) - 如果同一帧中存在添加条目的
navigate和移除条目的popBackStack,则返回堆栈上生成的顶部条目现在将始终返回到RESUMEDLifecycle.State。(Id8067、b/276495952)
版本 2.6.0-alpha09
2023 年 4 月 5 日
发布了 androidx.navigation:navigation-*:2.6.0-alpha09。版本 2.6.0-alpha09 中包含这些提交内容。
bug 修复
- 修复了对无效路线的检查,以便在
NavDestination包含不可为 null 的NavArgument时,相应目的地的路线必须包含与不可为 null 的NavArgument同名的实参占位符。(Ic62bf、b/274697949) - 如果导航操作缺少
Action/MimeType所匹配的NavDestination所需的不可为 null 的NavArgument,则基于Action/MimeType的深层链接导航现在会失败。(Ibfa17、b/271777424) - 当
NavController设置的图与之前的图具有相同的路线和目的地时,它现在会正确地将其当前图节点和返回堆栈目的地替换为新实例。此变更修复了在 Navigation Compose 中使用onLaunchSingleTop但未保存状态时发生的崩溃。此版本还修复了以下错误:导航到与根图相关联的目标会构建不正确的返回堆栈。(I5bc58、b/275258161、b/275407804)
版本 2.6.0-alpha08
2023 年 3 月 22 日
发布了 androidx.navigation:navigation-*:2.6.0-alpha08。版本 2.6.0-alpha08 中包含这些提交内容。
新功能
NavHostFragment现在允许您在NavHostFragment附加到FragmentManager后立即检索NavController,而不是仅在onCreate()之后检索。(Ic6382、b/220186282)
bug 修复
- 修复了在弹出包含不可为 null 的实参的嵌套图时出现的
NullPointerException。(6b3581、b/249988437) - 在使用
popUpTo进行导航后使用系统返回时,NavController的状态将弹出到正确的条目。(I3a8ec、b/270447657) - 现在,当通过系统返回或
popBackStack()弹出返回堆栈时,FragmentNavigator将正确弹出条目,无论事务是否对 fragment 使用了效果。(I81bdf) - 在不使用导航的情况下向
FragmentNavigator的FragmentManager添加 fragment 不再会导致崩溃。(b17204、b/274167493)
依赖项更新
- Navigation 现在依赖于 Lifecycle
2.6.1。(586fe7) - Navigation 现在依赖于 SavedState
1.2.1。(078e4e) - Navigation 现在依赖于 ProfileInstaller
1.3.0。(512f0c)
版本 2.6.0-alpha07
2023 年 3 月 8 日
发布了 androidx.navigation:navigation-*:2.6.0-alpha07。版本 2.6.0-alpha07 中包含这些提交内容。
bug 修复
- 现在,采用路线的
getBackStackEntry、popBackStack、clearBackStackAPI 变体采用具有可为 null 的实参和可为 null 的查询参数的路线模式(I22294、b/269302500) - 修复了以下问题:从
NavController调用clearBackStack()不会清除与已清除的返回堆栈相关联的 fragment 管理器中的已保存状态。(Ic1cce、b/271190202) - 修复了 2.6.0-alpha06 中的回归问题,该问题会导致在使用系统返回机制在标签页之间切换时,
BottomNavigationView中突出显示错误的MenuItem。(I634f6、b/270447657) - 修复了 2.6.0-alpha06 中的回归问题,该问题会导致在使用
Animation时,NavBackStackEntry不会移至 RESUMED 状态。(Ib3589、b/269646882)
版本 2.6.0-alpha06
2023 年 2 月 22 日
发布了 androidx.navigation:navigation-*:2.6.0-alpha06。版本 2.6.0-alpha06 中包含这些提交内容。
新功能
- 预览带有
NavHost的可组合项时,系统现在会默认显示 NavGraph 的startDestination。(I2b89f)
API 变更
- 所有
NavControllernavigate重载现在都使用@MainThread进行注解,以确保它们在主线程上调用。(I2c0b0、b/263427111)
bug 修复
- 修复了在使用动态 Fragment 导航时尝试导航时发生的崩溃问题。(I3ee29、b/268360479)
- 修复了以下 bug:通过系统返回按钮导航到另一个 fragment 时,底部栏不会更新为正确的所选内容 (If559f, b/269044426)
已知问题
- 将 Navigation 与 Fragment 搭配使用时,如果使用
AnimationAPI,NavBackStackEntry的生命周期无法达到RESUMED。(b/269646882) - 将 Navigation 与 Fragment 搭配使用并使用
BottomNavigation进行导航时,如果您尝试恢复包含多个条目的返回堆栈,则BottomMenuItem不会正确更新。(b/270447657) - 将 Navigation 与 Fragment 搭配使用时,在恢复状态后,当
NavBackStackEntryLifecycle的 fragment 为DESTROYED时,该NavBackStackEntryLifecycle不会变为DESTROYED。(b/270610768)
版本 2.6.0-alpha05
2023 年 2 月 8 日
发布了 androidx.navigation:navigation-*:2.6.0-alpha05。版本 2.6.0-alpha05 中包含这些提交内容。
新功能
NavController.popBackStack(route)、NavController.getBackStackEntry(route)、NavController.clearBackStack(route)现在都支持包含部分或全部填充的参数的路线。请注意,参数必须与条目的参数完全匹配。(Iebd28、Ic678c、I3b37b、b/257514373)- 在导航和弹出
NavBackStackEntries时,FragmentNavigator现在使用转换 API。这意味着,NavBackStackEntryLifecycle现在会等待进入和退出 fragment 特效完成,然后再移动其最终的Lifecycle.State。(I3cb19、b/238686802) - 在导航和弹出
NavBackStackEntries时,DialogFragmentNavigator现在使用转换 API。这意味着,NavBackStackEntryLifecycle现在会等待DialogFragmentLifecycle移至DESTROYED,然后再移至DESTROYED本身。(I53ee5、b/261213893)
API 变更
NavigatorState现在提供prepareForTransitionAPI,以允许Navigator将NavBackStackEntries移至中间Lifecycle.State。(I42c21、b/238686802)- 您现在可以通过
backstack属性访问与NavGraphNavigator或ComposeNavigator关联的返回堆栈。ComposeNavigator现在还公开onTransitionComplete()回调,将执行导航或popBackStack操作的NavBackStackEntry标记为完成。(I02062、I718db、b/257519195)
bug 修复
- 现在,在使用
push/popWithTransitionAPI 并且条目已在处理时,导航器状态将为空操作。(Iadbfa、b/261213893) - 将
launchSingleTop与嵌套的NavGraph搭配使用时,从原始目的地到其startDestination的所有目的地都将仅正确添加到返回堆栈的顶部。(Id4bea、b/253256629) - 现在,导航到同一目的地并将
launchSingleTop标志设置为 true 时,Navigation 会正确替换DialogFragment实例。(I45b5a、b/149572817) - 使用长度正好为 19 个字符的参数时,Navigation SafeArgs 不会再导致编译错误。(Id60bc、b/257110095)
版本 2.6.0-alpha04
2022 年 11 月 9 日
发布了 androidx.navigation:navigation-*:2.6.0-alpha04。版本 2.6.0-alpha04 中包含这些提交内容。
新功能
NavType的自定义子类现在可以替换serializeAsValue,以将值序列化为字符串,从而允许(通过parseValue)将序列化和反序列化对象完全封装在NavType类中。StringType现在替换了此方法,对给定的String调用Uri.encode。(Ie5213、b/247637434)- 现在,如果
NavigationUI无法通过所选MenuItem进行导航,它会提供日志。(I2af5a、b/247730357)
bug 修复
- 导航深层链接现在会被延迟解析,而不会在图表初始化时解析,这可以提升应用在启动时的性能。(Iab0ab)
- 修复了以下问题:在深层链接到具有默认 null 参数的目的地后,向上层导航会导致崩溃。(I51c24、b/243183636)
依赖项更新
- Navigation 对动态功能模块的支持现在依赖于精细的 Play Feature Delivery 库。(Ib4ddc)
- Navigation Safe Args 现在依赖于 Android Gradle 插件版本 7.3.0。这意味着它现在仅与版本 7.3.0 及更高版本兼容。(I47e49)
版本 2.6.0-alpha03
2022 年 10 月 24 日
发布了 androidx.navigation:navigation-*:2.6.0-alpha03。版本 2.6.0-alpha03 中包含这些提交内容。
bug 修复
- 从 Navigation
2.5.3起:当Crossfade没有可用于组合的目的地时,NavHost将不会再导致NoSuchElementException。现在它只会跳过组合操作。(Ieb46e、b/253299416) - 从 Navigation
2.5.3起:修复了当目的地从返回堆栈中弹出时,系统仍记得已保存的 Compose 状态(例如,rememberSaveable使用情况)而不移除此状态的问题。(I64949)
依赖项更新
- Navigation 现在依赖于 Fragment
1.5.4。(Icd424)
版本 2.6.0-alpha02
2022 年 10 月 5 日
发布了 androidx.navigation:navigation-*:2.6.0-alpha02。版本 2.6.0-alpha02 中包含这些提交内容。
行为变更
- 将导航图的 ID 传递给
AppBarConfiguration(例如通过Menu)时,NavigationUI现在只会将该导航图的起始目的地视为顶级目的地,而不会错误地将导航图内的每个目的地标记为顶级目的地。传递单个目的地的 ID 这种行为保持不变。您也可以通过AppBarConfiguration中的新isTopLevelDestination函数对自己的代码使用这一功能。(Ie936e、b/238496771)
bug 修复
navigation:navigation-fragment组件现在依赖于 Fragment 版本1.5.2。(I00ba4)- 导航到
FloatingWindow目的地(例如对话框)时,所选菜单项将不再更新。(I4cde8、b/240308330)
版本 2.6.0-alpha01
2022 年 9 月 7 日
发布了 androidx.navigation:navigation-*:2.6.0-alpha01。版本 2.6.0-alpha01 中包含这些提交内容。
新功能
- 现在,
NavigationUI中用于处理顶部应用栏的setupWithNavController集成会将android:label中的ReferenceType参数的R.string值解析为字符串值,而不是输出自动生成的资源整数值。(I5f803、b/167959935) - 现在,
NavDeepLink支持数组默认值,从而支持有重复的查询参数映射到参数数组类型。现在,NavType还包含一个默认方法,您可以替换该方法以合并两个解析值。(Id68c3、b/209977108) - 在导航 XML 文件的 activity 元素中使用确切字符串
${applicationId}作为app:data和app:dataPattern属性中的占位符时,系统会在膨胀时自动使用上下文的packageName填充占位符。(Iaabde、b/234223561) - 现在,尝试使用
navDeepLinkKotlin DSL 创建空NavDeepLink会导致 lint 警告,指出深层链接需要 uri、action 和/或 mimetype 才能有效。(I08d2f、b/154038883)
API 变更
- 添加了新的
NavDestination扩展函数,用于将包含android:label="{arg}"形式的参数的动态标签解析为字符串。通过将R.string值解析为字符串值来支持ReferenceType参数。(I07d89、b/236269380)
行为变更
- 现在,NavBackStackEntry 的
arguments和传递给OnDestinationChangedListener的arguments只是您在导航到目的地时创建的不可变参数的副本。这意味着,对这些 Bundle 所做的任何更改都不会反映在对arguments或其他OnDestinationChangedListener实例的后续访问中。(I676f5)
bug 修复
- 从 Navigation
2.5.2开始:现在,动态导航栏在导航到其他模块中的 Activity 目的地之前,会先正确地尝试安装这些目的地。(Ia2c16、b/240292838) - 从 Navigation
2.5.2开始:现在,导航到同一目的地并将launchSingleTop标志设置为 true 时,Navigation 会正确替换 fragment 实例。(I5a2f1、b/237374580) - 从 Navigation
2.5.2开始:修复了因导航到双重嵌套图(其与新弹出的起始目的地共用一个父级)而引起的IllegalStateException。(I9f7cb、b/243778589)
版本 2.5
版本 2.5.3
2022 年 10 月 24 日
发布了 androidx.navigation:navigation-*:2.5.3。版本 2.5.3 中包含以下提交内容。
bug 修复
- 当
Crossfade没有可用于组合的目的地时,NavHost将不会再导致NoSuchElementException。现在它只会跳过组合操作。(Ieb46e、b/253299416) - 修复了当目的地从返回堆栈中弹出时,系统仍记得已保存的 Compose 状态(例如,
rememberSaveable使用情况)而不移除此状态的问题。(I64949)
Version 2.5.2
2022 年 9 月 7 日
发布了 androidx.navigation:navigation-*:2.5.2。版本 2.5.2 中包含这些提交内容。
bug 修复
- 现在,动态导航栏在导航到其他模块中的 Activity 目的地之前,会先正确地尝试安装这些目的地。(Ia2c16、b/240292838)
- 现在,导航到同一目的地并将
launchSingleTop标志设置为 true 时,Navigation 会正确替换 fragment 实例。(I5a2f1、b/237374580) - 修复了因导航到双重嵌套图(其与新弹出的起始目的地共用一个父级)而引起的
IllegalStateException。(I9f7cb、b/243778589)
依赖项更新
- Navigation
2.5.2Navigation 现在依赖于 Fragment1.5.2。(aosp/2178734)
版本 2.5.1
2022 年 7 月 27 日
发布了 androidx.navigation:navigation-*:2.5.1。版本 2.5.1 中包含这些提交内容。
bug 修复
- 使用保存在
Bundle中的自定义参数类型时,Navigation Safe Args将不会再在生成的类中导致废弃警告。(Id86ed、b/237725966)
依赖项更新
- Navigation 库现在依赖于 Lifecycle
2.5.1。(Ib4451) - Navigation 库现在依赖于 Activity
1.5.1。(I3efe8) - Navigation 库现在依赖于 Fragment
1.5.1。(I56177)
版本 2.5.0
2022 年 6 月 29 日
发布了 androidx.navigation:navigation-*:2.5.0。版本 2.5.0 中包含这些提交内容。
自 2.4.0 以来的重要变更
- CreationExtras 集成 -
Navigation现在可以通过 Lifecycle2.5.0的CreationExtras提供无状态ViewModelProvider.Factory。
Navigation SafeArgs
Navigation Safe Args已将Android Gradle Plugin依赖项升级为依赖于7.0.4,从而不需要与7.0之前的 AGP 版本兼容。- 添加了对要使用的命名空间 build.gradle 属性(而非 applicationId)的支持。
其他更改
visibleEntriesAPI 不再处于实验阶段,它提供了一个函数来检索根据NavController其目的地当前可见的所有条目。
版本 2.5.0-rc02
2022 年 6 月 15 日
发布了 androidx.navigation:navigation-*:2.5.0-rc02。版本 2.5.0-rc02 中包含这些提交内容。
bug 修复
- 修复了使用 Navigation Compose
NavHost在底部目的地之间快速切换导致的崩溃问题。(I3979a、b/234054916) - 使用
applicationIdSuffix和命名空间但不存在applicationId时或当applicationId和命名空间不同时,Navigation SafeArgs不再崩溃。(I754b1、b/233119646) NavArgument现在有一个自定义toString()函数,用于显示实参的内部值。(I900a8)
版本 2.5.0-rc01
2022 年 5 月 11 日
发布了 androidx.navigation:navigation-*:2.5.0-rc01。版本 2.5.0-rc01 中包含这些提交内容。
新功能
- 添加了新的 Lint 规则,以便针对在
navigation.xml文件内将<deeplink>元素置于<activity>元素内的情况发出警告。(Ic15a5、b/178403185)
bug 修复
- 现在,系统会按照预期顺序处置
NavHost和DialogHost中的可组合项范围,即先处理内部可组合项,然后再处理外部可组合项。(I157e6) - Navigation SafeArgs 现在使用
ArgumentsGenerationTask中的PathSensitivity.RELATIVE来支持缓存可再定位性。这意味着现在可以在本地 build 中重复使用 CI build 中的缓存条目。(I5f67c、b/173420454) - 更新了
UnrememberedGetBackStackEntryDetectorlint 规则,以确保围绕getBackStackEntry()调用的remember调用还会将NavBackStackEntry对象作为键进行传入。(Ib7081、b/227382831)
版本 2.5.0-beta01
2022 年 4 月 20 日
发布了 androidx.navigation:navigation-*:2.5.0-beta01。版本 2.5.0-beta01 中包含这些提交内容。
bug 修复
DialogNavigator现在会使用popWithTransition来执行dismiss()调用。这修复了在dialog目标中使用ViewModel时导致竞态条件的问题,该问题会导致使用系统返回机制或点按对话框以外的任意位置关闭对话框时出现IllegalStateException。(Id7376、b/226552301)
依赖项更新
- Navigation 现在依赖于 Lifecycle
2.5.0-beta01,修复了在使用多个返回堆栈时,将非主要底部导航标签页中的一个NavHost嵌套在另一个NavHost内会导致IllegalStateException的问题。
版本 2.5.0-alpha04
2022 年 4 月 6 日
发布了 androidx.navigation:navigation-*:2.5.0-alpha04。版本 2.5.0-alpha04 中包含这些提交内容。
API 变更
visibleEntries不再是实验性 API。(I4829f、b/225394514)
bug 修复
- NavHost 现在依赖于
NavController中的visibleEntries来确定要组合的条目。这意味着,在使用嵌套 NavHost 时,内部NavHost现在应正确地呈现动画效果。(I4ba2b、b/225394514) NavController提供的visibleEntriesStateFlow现在基于条目最大生命周期状态,而不是当前生命周期状态。这意味着,即使navController的主机生命周期降至 STARTED 以下,可见条目列表也将保持不变。(I9e2a8、b/225394514)SavedStateViewFactory现在支持使用CreationExtras,即使其通过SavedStateRegistryOwner进行初始化也不受影响。如果提供 extra,则会忽略初始化的参数。(I6c43b、b/224844583)NavDeepLink现在可以使用不含任何值的单个查询参数解析 URI。(I0efe8、b/148905489)- 现在,空字符串在深层链接中被视为有效参数。(I70a0d、b/217399862)
- 使用命名空间并且不存在
AndroidManifest.xml时,Navigation Safe Args将不会再崩溃。(I17ccf、b/227229815)
版本 2.5.0-alpha03
2022 年 2 月 23 日
发布了 androidx.navigation:navigation-*:2.5.0-alpha03。版本 2.5.0-alpha03 中包含这些提交内容
API 变更
- 您现在可以将
CreationExtras传入by navGraphViewModels以创建ViewModel。(I29217、b/217618359)
bug 修复
NavDeepLinks现在可以正确支持路由/深层链接 URI 中所嵌入的编码的换行符。(I513d1、b/217815060)- 现在与
NavBackStackEntries搭配使用来创建 ViewModel 时,CreationExtras能够正常工作。(I69161、b/217617710) - Navigation Safe Args 现在支持使用
build.gradle中定义的命名空间代替 AndroidManifest 中的软件包。(I659ef、b/217414933)
版本 2.5.0-alpha02
2022 年 2 月 9 日
发布了 androidx.navigation:navigation-*:2.5.0-alpha02。版本 2.5.0-alpha02 中包含这些提交内容。
bug 修复
- 从 Navigation
2.4.1起:在搭配使用 ViewBinding 和嵌套图时,NavHostFragment现在可以正确设置OnBackPressedDispatcher。(Ifbb51、b/214577959) - 从 Navigation
2.4.1起:当通过多个嵌套的NavGraph实现深层链接时,返回堆栈现在可以正确包含中间起始目的地。(I504c0、b/214383060)
版本 2.5.0-alpha01
2022 年 1 月 26 日
发布了 androidx.navigation:navigation-*:2.5.0-alpha01。版本 2.5.0-alpha01 中包含这些提交内容。
新功能
NavBackStackEntry现在与 ViewModel CreationExtras 集成,后者是作为 Lifecycle2.5.0-alpha01的一部分推出的。(Ib9fe2、b/207012490)
bug 修复
- 修复了访问从 Fragment 的
onCreate()通过by navGraphViewModels()创建的ViewModel会失败并显示IllegalStateException的问题。(I8a14d) NavDeepLink无需再对参数进行两次不必要的解码,这意味着现在适当的参数会被传递到最终目的地。(I31b0a、b/210711399)
Safe Args
- Safe Args 现在依赖于 Android Gradle 插件版本 7.0.4。这意味着 Navigation Safe Args 将不再与 7.0 之前的 Android Studio 版本兼容,但现在与 Android Gradle 插件 7.1.0 及更高版本兼容。(I41c88、b/213086135、b/207670704)
版本 2.4.2
版本 2.4.2
2022 年 4 月 6 日
发布了 androidx.navigation:navigation-*:2.4.2。版本 2.4.2 中包含这些提交内容。
bug 修复
- 从 Navigation
2.5.0-alpha03向后移植:NavDeepLinks现在可以正确支持路由/深层链接 URI 中所嵌入的编码的换行符。(I513d1、b/217815060) - 从 Navigation
2.5.0-alpha03向后移植:Navigation SafeArgs 现在支持使用build.gradle中定义的命名空间代替 AndroidManifest 中的软件包。(I659ef、b/217414933) - 从 Navigation
2.5.0-alpha04向后移植:使用命名空间并且不存在AndroidManifest.xml时,Navigation Safe Args将不会再崩溃。(I17ccf、b/227229815) - 从 Navigation
2.5.0-alpha04向后移植:现在,空字符串在深层链接中被视为有效参数。(I70a0d、b/217399862)
版本 2.4.1
版本 2.4.1
2022 年 2 月 9 日
发布了 androidx.navigation:navigation-*:2.4.1。版本 2.4.1 中包含这些提交内容。
bug 修复
- 在搭配使用 ViewBinding 和嵌套图时,
NavHostFragment现在可以正确设置OnBackPressedDispatcher。(Ifbb51、b/214577959) - 当通过多个嵌套的
NavGraph实现深层链接时,返回堆栈现在可以正确包含中间起始目的地。(I504c0、b/214383060) - 从 Navigation
2.5.0-alpha01向后移植:修复了访问从 fragment 的onCreate()通过by navGraphViewModels()创建的 ViewModel 会失败并显示IllegalStateException的问题。(I8a14d) - 从 Navigation
2.5.0-alpha01向后移植:NavDeepLink无需再对参数进行两次不必要的解码,这意味着现在适当的参数会被传递到最终目的地。(I31b0a、b/210711399) - 从 Navigation
2.5.0-alpha01向后移植:Safe Args 现在依赖于 Android Gradle 插件版本 7.0.4。这意味着 Navigation Safe Args 将不再与 7.0 之前的 Android Studio 版本兼容,但现在与 Android Gradle 插件 7.1.0 及更高版本兼容。(I41c88、b/213086135、b/207670704)
版本 2.4.0
版本 2.4.0
2022 年 1 月 26 日
发布了 androidx.navigation:navigation-*:2.4.0。版本 2.4.0 中包含这些提交内容。
自 2.3.0 以来的重要变更
- 所有 Navigation 制品都已使用 Kotlin 重写。这提升了使用泛型(例如
NavType子类)的类的可为 null 性。所有曾包含在-ktx制品中的 Kotlin 扩展函数都已移到其各自的主要制品中。-ktx制品将继续发布,但它完全是空的。 navigation-fragment制品现在通过新的AbstractListDetailFragment包含一个双窗格布局的预构建实现。此 fragment 使用SlidingPaneLayout管理列表窗格(由您的子类提供)和详细信息窗格,后者采用NavHostFragment作为其实现方法,如示例实现中所示。NavController上的currentBackStackEntryAsFlow()方法提供了一个Flow(会在每次当前NavBackStackEntry变化时发出)。此流程可以用作手动管理OnDestinationChangedListener的替代方案。- NavController 现在可以通过实验性
visibleEntries属性以StateFlow形式检索所有可见NavBackStackEntry实例的列表。 - 现在可以扩展
NavType类以创建自定义 NavType。只有在程序化地(例如通过 Navigation Graph Kotlin DSL)构建导航图时,才支持自定义类型。 Navigation 现在提供
findStartDestination()和getHierarchy()API,可用于帮助实现自定义 NavigationUI。findStartDestination()是针对NavGraph的扩展函数,它会定位您导航到该图表时显示的实际起始目的地,即使startDestination本身是嵌套的NavGraph也是如此。getHierarchy()是NavDestination上的一个函数,可用于验证给定目的地是否在另一个目的地的层次结构中。val matchingRoute: Boolean = destination.hierarchy.any { it.route == routeToFind }更新了
NavigationUI方法,从接受BottomNavigationView改为接受在 Material1.4.0、NavigationBarView中引入的它的父类。这样一来,这些方法就可以与NavigationRailView搭配使用。通过 XML 膨胀
<action>元素时,动画属性可以使用通过app:enterAnim="?attr/transitionEnter"语法从主题中提取的属性。Safe Args 现在会为每个
NavArgs类生成一个fromSavedStateHandle()方法。(#122、b/136967621)class HomeViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { // Create a HomeDestinationArgs class with type safe accessors for each argument // defined on your destination private val args = HomeDestinationArgs.fromSavedStateHandle(savedStateHandle) }
导航路线和 Kotlin DSL
以前版本的 Navigation 依赖于每个目的地具有一个常量整数 ID,该 ID 能从其同级目的地中唯一地标识它,并且允许您直接或通过操作 navigate() 到该目的地。虽然这种做法仍然有效且很实用,尤其是当您在 XML 中定义导航图且可以使用自动生成的 R.id 常量或 Safe Args(在构建时使用这些常量生成代码)时,但这种独特整数系统不能通过 Navigation Kotlin DSL 捕获在运行时以程序化方式构建的完整动态图所需的语义和表现形式。
此版本引入了一个新选项,有助于按目的地的路线在导航图中唯一地标识目的地。路线是定义目的地唯一路径的 String。所有接受目的地 ID 的 Kotlin DSL 方法现已废弃,取而代之的是接受路线的等效 API。
每个路线都应被视为定义该目的地的 Uri 的“路径”部分,例如:home、profile/{userId}、profile/{userId}/friends 等。当某个目的地的身份与一段具体内容相关联时,这些动态参数就应是路线的一部分,并遵循与隐式深层链接相同的规则。
所有过去仅接受 ID 的 NavController API 现在都具有接受路线 String 的过载。这包括 navigate()、popBackStack()、popUpTo() 和 getBackStackEntry()。
这产生了一些 API 影响:
- Kotlin DSL 中的
popUpToKotlin 属性已被废弃,取而代之的是popUpToId。 getStartDestination()API 已废弃,取而代之的是getStartDestinationId()。
与按 ID 导航不同,按路线导航与隐式深层链接遵循的规则相同,因为您可以直接导航到任何嵌套图表中的任何目的地,确保这些路线在多模块项目中可以使用,而无需向每个目的地明确添加外部可见的深层链接。
Navigation Compose
navigation-compose 制品集成了 Navigation Component 和 Jetpack Compose,且在应用中将 @Composable 函数作为目的地。
此版本提供了:
NavHost可组合项,允许您使用composable和dialog目的地通过 Kotlin DSL 构建导航图,并且支持可选导航器,如 Accompanist Navigation Material 中的导航器。- 强制支持在目的地之间淡入淡出。Accompanist Navigation Animation 可用于使用实验性 Compose API 控制进入和退出过渡效果。
- 将
Lifecycle的范围限定为每个可组合目的地。每个目的地只会在任何进入过渡效果完成时达到RESUMED状态,并且在任何退出过渡效果开始时变为STARTED状态,从而仅在Lifecycle为RESUMED状态时触发navigate,避免所有IllegalStateException和多触摸问题。 - 在目的地级别限定
ViewModel的作用域(通过 Lifecycle ViewModel Compose2.4.0的viewModel()API 或 Hilt Navigation Compose1.0.0的hiltViewModel()),提供一个在配置更改后继续存在并且位于返回堆栈上(当可组合的内容以其他方式被处理时)的作用域,并在 ViewModel 的onCleared()中提供一个信号,指示系统永久处理和清理与该NavBackStackEntry相关的状态。 - 在目的地级别限定
rememberSaveable状态的范围,确保自动保存所有可组合状态,并在您返回到目的地时恢复状态。 - 完全支持保存
NavController的状态及其目的地的状态,并在进程被销毁和重新创建后,恢复这些状态。 - 自动与系统的返回按钮集成。
可传递参数、将深层链接附加到目的地以及将结果返回到前一个目的地。
rememberNavController()和currentBackStackEntryAsState()中特定于 Compose 的帮助程序可提升状态并将NavController连接到NavHost以外的可组合项(例如底部的导航栏)。
val navController = rememberNavController()
Scaffold { innerPadding ->
NavHost(navController, "home", Modifier.padding(innerPadding)) {
composable("home") {
// This content fills the area provided to the NavHost
HomeScreen()
}
dialog("detail_dialog") {
// This content will be automatically added to a Dialog() composable
// and appear above the HomeScreen or other composable destinations
DetailDialogContent()
}
}
}
如需了解详情,请参阅 Compose Navigation 指南。
多个返回堆栈
NavController 负责:管理目的地的返回堆栈,在您 navigate() 到相应目的地时将目的地添加到返回堆栈,以及在您调用 popBackStack() 或触发系统的返回按钮时移除目的地。我们扩展了导航图 XML 中现有的 NavOptions 类及到 <action> 元素的集成,以便支持保存和恢复返回堆栈。
作为此变更的一部分,onNavDestinationSelected()、BottomNavigationView.setupWithNavController() 和 NavigationView.setupWithNavController() 的 NavigationUI 方法现在会自动保存并恢复弹出的目的地的状态,从而在不更改任何代码的情况下支持多个返回堆栈。将 Navigation 与 Fragment 搭配使用时,建议采用这种方式与多个返回堆栈集成。
用于保存和恢复状态的底层 API 会通过许多途径公开:
在 Navigation XML 中,
<action>元素现在可以使用app:popUpToSaveState和app:restoreState的布尔属性来保存通过app:popUpTo弹出的任何目的地的状态,并恢复作为app:destination传递的目的地的关联状态:<action android:id=”@+id/swap_stack” app:destination=”@id/second_stack” app:restoreState=”true” app:popUpTo=”@id/first_stack_start_destination” app:popUpToSaveState=”true” />在
navOptionsKotlin DSL 中,您可以在popUpTo构建器上添加restoreState和saveState布尔属性:// Use the navigate() method that takes a navOptions DSL Builder navController.navigate(selectedBottomNavRoute) { launchSingleTop = true restoreState = true popUpTo(navController.graph.findStartDestination().id) { saveState = true } }在通过
NavOptions.Builder手动构建NavOptions对象时,您可以将setRestoreState()和新的过载用于采用了额外saveState参数的setPopUpTo()。NavOptions navOptions = new NavOptions.Builder() .setLaunchSingleTop(true) .setRestoreState(true) .setPopUpTo(NavGraph.findStartDestination(navController.getGraph()).getId(), false, // inclusive true) // saveState .build(); navController.navigate(selectedBottomNavId, null, navOptions);对
popBackStack()的程序化调用现在可以包含额外的saveState参数。您可以使用
clearBackStack()方法清除使用popBackStack()或popUpToSaveState保存的状态。
在所有情况下,NavController 都将保存并恢复每个 NavBackStackEntry(包括任何已限定导航目的地范围的 ViewModel 实例)的状态。我们更新了 Navigator API,使每个 Navigator 都支持保存和恢复自己的状态。
行为变更
NavDeepLinkBuilder现在将PendingIntent.FLAG_IMMUTABLE添加到了createPendingIntent()返回的PendingIntent中,从而确保此 API 在以 Android 12 为目标平台时按预期工作。- Navigation 现在依赖于 Lifecycle
2.3.1,并且现在会将更新NavBackStackEntryLifecycle的setGraph()、popBackStack()、navigateUp()和navigate()方法标记为@MainThread,从而使 Navigation 与 Lifecycle2.3.0中引入的主线程强制执行保持一致。 - 深层链接现在会验证
Uri中是否存在所有必需的参数(不存在默认值的参数)。 - 现在,
NavDeepLink在解析参数时,会将井号与英文问号一样视为路径片段分隔符,可防止参数跨越井号进行显示。 - 生成操作时,从 Safe Args 生成的 Kotlin 代码现在会将不具有默认值的参数放在具有默认值的参数之前。
- 生成参数时,Safe Args 现在会将不具有默认值的参数放在具有默认值的参数之前。
- Safe-Args 现在依赖于 Android Gradle 插件 4.2.0。也就是说,您应该不会再收到使用
applicationIdTextResource的警告。
已知问题
- 修复了 Navigation
2.5.0-alpha01中的以下问题:访问从 Fragment 的onCreate()通过by navGraphViewModels()创建的ViewModel将失败并显示IllegalStateException。(b/213504272) - 修复了 Navigation
2.5.0-alpha01中的以下问题:Safe Args 2.4.0 与 Android Gradle 插件 7.1.0 及更高版本不兼容。(b/213086135) - 如果深层链接包含多个嵌套导航图,则无法正确创建完整的返回堆栈。(b/214383060)
版本 2.4.0-rc01
2021 年 12 月 15 日
发布了 androidx.navigation:navigation-*:2.4.0-rc01。版本 2.4.0-rc01 中包含这些提交内容。
行为变更
- 现在,
NavDeepLink在解析参数时,会将井号与英文问号一样视为参数分隔符。(I21309、b/180042703)
bug 修复
- 深层链接将不再忽略值与占位符名称相同的参数。(If8017、b/207389470)
NavController恢复后,使用转换弹出嵌套目的地时,NavController将不再崩溃。(I0f7c9、b/205021623)- 现在,使用无效
startDestination时的错误消息将默认为起始目的地的路线(如果有)。(I86b9d、b/208041894)
Navigation Compose bug 修复
- 修复了由于使用底部导航菜单项在起始目的地和其他目的地之间快速切换而导致的潜在崩溃。(Ic8976、b/208887901)
- 现在,在配置发生变化或进程终止后,对话框目的地可在屏幕顶部正确恢复。(I4c0dc、b/207386169)
- 修复了以下问题:对话框关闭后,尝试从对话框的
NavBackStackEntry获取ViewModel会失败。(I6b96d、b/206465487) - 修复了以下问题:将
activity目的地与 Navigation Compose 的NavHost一起使用时,会导致无限重组。(I8f64c) - 修复了 Navigation Compose 中的一个漏洞,即在配置发生变化或进程终止后,它会保留对旧 activity 的引用。(I4efcb、b/204905432)
Safe Args bug 修复
SafeArgs在进程终止后尝试恢复自定义 parcelable 数组时,不会再崩溃。(I618e8、b/207315994)- 修复了 Safe Args 中的一个 bug,该 bug 会导致布尔数组不能使用
null值。(I8c396、b/174787525)
版本 2.4.0-beta02
2021 年 11 月 3 日
发布了 androidx.navigation:navigation-*:2.4.0-beta02。版本 2.4.0-beta02 中包含这些提交内容。
API 变更
- 现在,当导航到另一个导航图时,系统处理显式和隐式深层链接时会自动添加
saveState标记,以确保NavigationUI.setupWithNavController之类的代码以及使用多个返回堆栈的代码能够按预期运行。(Ic8807)
行为变更
- 现在,深层链接模式是在 NavDeepLink 中进行延迟编译,而不是在膨胀期间进行编译。这可以缩短包含深层链接的导航图的膨胀时间。 (b8d257、b/184149935)
bug 修复
- 修复了在将
NavHost直接添加到 activity 的setContent()时,NavBackStackEntries 移至Lifecycle.State.STARTED后被下推到Lifecycle.State.CREATED的问题。(Ia5ac1、b/203536683) - 修复了一个竞态条件,即在实际显示对话框之前从返回堆栈中抛出
DialogFragment目的地实际上并不会关闭对话框,导致出现崩溃,错误对话框只能由用户手动关闭。(I687e5) - 修复了即使您实际上并未
navigate()到导航图,NavigationUI上的onNavDestinationSelectedAPI 也会返回true的问题。现在,该 API 使用setupWithNavController在内部使用的相同逻辑,通过目的地hierarchy仅选择与当前目的地相关联的MenuItem。(I2b053)
版本 2.4.0-beta01
2021 年 10 月 27 日
发布了 androidx.navigation:navigation-*:2.4.0-beta01。版本 2.4.0-beta01 中包含这些提交内容。
新功能
- 现在,您可以将
by navGraphViewModel与路线一起使用,作为使用 ID 的替代方法,以便更好地支持将 Navigation Kotlin DSL 与 Fragment 配合使用。(I901e3、b/201446416)
API 变更
visibleEntriesAPI 目前处于实验阶段。(I93f6f)
bug 修复
- 过渡因在相同屏幕之间来回切换而中断时,系统将不再销毁 ViewModel(Id52d8、b/200817333)
- 向
NavDestination添加深层链接时,可为 null 的NavDeepLink参数不再需要默认值。(I5aad4、b/201320030) - 现在,系统不再将生命周期不同的 NavBackStackEntry 视为等同。也就是说,使用 singleTop 进行导航以及重新选择底部菜单项时,NavHost 会正确地重组所有目的地。(I1b351、b/196997433)
- 修复了
AbstractListDetailFragment存在的以下问题:导致系统错误地处理或忽略onCreateListPaneView()返回的列表窗格中的layout_width和layout_weight属性。(f5fbf3) - 现在,对话框目的地的视觉状态会正确地与
DialogFragmentNavigator的状态保持同步。这意味着,现在,如果针对DialogFragment手动调用异步dismiss()API,系统会正确地清除现已关闭的对话框之上的所有对话框目的地。这不会对您使用popUpTo或popBackStack()关闭对话框的情况产生任何影响。(I77ba2) - 现在,
AbstractAppBarOnDestinationChangedListener可以针对onDestinationChanged()提供更明确的错误消息。(Ie742d)
版本 2.4.0-alpha10
2021 年 9 月 29 日
发布了 androidx.navigation:navigation-*:2.4.0-alpha10。版本 2.4.0-alpha10 中包含这些提交内容。
新功能
- NavController 现在支持通过
visibleEntriesStateFlow 检索所有可见NavBackStackEntry实例的列表 (Ia964e) rememberNavController()现在接受一组可选的Navigator实例,这组实例将添加到返回的NavController中,以便更好地支持可选导航器(例如来自 Accompanist Navigation Material 的导航器)。(I4619e)
bug 修复
- 重新创建 activity 时,Dynamic Navigation 将不会再崩溃。(Ifa6a3、b/197942869)
- 修复了仅在出栈回包含
NavHost的可组合项目的地后才会发生的系统返回按钮问题。(3ed148、b/195668143) - SafeArgs 现在会以适当的参数顺序为
fromBundle()和fromSavedStateHandle()生成参数。(I824a8、b/200059831)
版本 2.4.0-alpha09
2021 年 9 月 15 日
发布了 androidx.navigation:navigation-*:2.4.0-alpha09。版本 2.4.0-alpha09 中包含这些提交内容。
新功能
- 您现在可以使用
clearBackStack()方法来清除使用popBackStack()或popUpToSaveState保存的状态。(I80a0f) - 现在,您可以向嵌套导航图的构建器传入参数和/或深层链接的列表,它们将自动添加到生成的图表中。(I8a470、b/182545357)
API 变更
navArgumentKotlin DSL 函数现在是navigation-common(而非navigation-compose)的一部分。这将需要更新 import 语句,才能继续使用此函数。(I1d095)
行为变更
- 生成参数时,Safe Args 现在会将不含默认值的参数放在具有默认值的参数之前。(I89709、b/198493585)
bug 修复
- 在使用 Navigation Compose 时,NavGraph 只有在其所有子级都处于
DESTROYED状态后,才会处于DESTROYED状态。(I86552、b/198741720) - 可为 null 的
NavDeepLink参数不再需要默认值。(Ia14ef、b/198689811) - 现在,使用新图调用
setGraph()时,不仅会清除返回堆栈之前的出栈行为,而且还会清除所有已保存的返回堆栈。(I97f96) - 修复了在使用
launchSingleTop时不通知OnDestinationChangedListener实例和currentBackStackEntryFlow的问题。(Iaaebc)
依赖项更新
- Navigation Compose 现在依赖于 Activity Compose 1.3.1。(I05829)
- Navigation Compose 现在依赖于 Lifecycle ViewModel Compose
2.4.0-beta01。(Ib86a3)
版本 2.4.0-alpha08
2021 年 9 月 1 日
发布了 androidx.navigation:navigation-*:2.4.0-alpha08。版本 2.4.0-alpha08 中包含这些提交内容。
新功能
- 现在可以扩展
NavType类以创建自定义 NavType。只有在程序化地(例如通过 Navigation Graph Kotlin DSL)构建导航图时,才支持自定义类型。(I78440、b/196871885)
行为变更
- 生成操作时,从 Safe Args 生成的 Kotlin 代码现在会将不具有默认值的参数放在具有默认值的参数之前。(Idb697、b/188855904)
- 深层链接现在会验证
Uri中是否存在所有必需的参数(不存在默认值的参数)。(#204、b/185527157)
bug 修复
- 将 composable() 内的
getBackStackEntry和previousBackStackEntry与remember()结合使用不会再导致因返回堆栈上没有目的地而出现异常。(I75138、b/194313238) - 在更改返回堆栈参数和使用
launchSingleTop=true时,Navigation Compose 现在会正确进行重组。(Iebd69、b/186392337) - 使用具有 13 个或 29 个目的地的图调用
setGraph时,不再会出现ArrayIndexOutOfBoundsException。(I1a9f1、b/195171984) - SafeArgs Java 生成器在生成 Args 类时应该不会再导致 lint 警告。(I1a666、b/185843837)
外部贡献
- 感谢 ospixd 确保深层链接会验证
Uri中是否存在所有必需的参数(不含默认值的参数)。(#204、b/185527157)
版本 2.4.0-alpha07
2021 年 8 月 18 日
发布了 androidx.navigation:navigation-*:2.4.0-alpha07。版本 2.4.0-alpha07 中包含这些提交内容。
bug 修复
- 现在,Navigation Compose 可在配置更改后以及使用多个返回堆栈功能期间更改图时正确保存状态。(If5a3d、b/195141957)
- 将 Navigation Compose 与多个返回堆栈搭配使用时,重新选择同一标签页不会再生成空白屏幕。(I860dc、b/194925622)
NavHost现在会观察NavBackStackEntry的Lifecycle.State中的更改,这意味着当生命周期更改时,在 fragment 中使用NavHost现在会正确重组,而不是生成空白界面。(I4eb85、b/195864489)- 修复了以下问题:重新创建 activity 后(即配置更改后),关闭
DialogFragment无法正确更新NavController状态。(Icd72b) - 修复了以下问题:弹出对话框目的地不会更新 NavController 的系统返回按钮处理情况,这可能会导致 NavController 拦截返回按钮,即使该按钮没有任何要弹出的返回堆栈。(If3b34)
- Safe-args 现在会自动为参数生成
toSavedStateHandle方法,该方法可用于测试ViewModel代码。(If1e2d、b/193353880)
版本 2.4.0-alpha06
2021 年 8 月 4 日
发布了 androidx.navigation:navigation-*:2.4.0-alpha06。版本 2.4.0-alpha06 中包含这些提交内容。
API 变更
AbstractListDetailFragment中的requireSlidingPaneLayout()和requireDetailPaneNavHostFragment()方法已分别重命名为getSlidingPaneLayout()和getDetailPaneNavHostFragment()。(I34a08)
行为变更
- 现在,当用户通过动画(如
Crossfade)导航时,新目的地的Lifecycle将仅在动画播放完毕时达到RESUMED状态。(If0543、b/172112072、b/194301889) - Navigation Compose 的
NavHost现在会将图设置为第一个组合的一部分。(Ieb7be)
bug 修复
- 在弹出某个导航图的最后一个目的地时,系统不会再抛出
ClassCastException。(If0543、b/172112072、b/194301889) - 修复了以下问题:在没有
Uri的情况下添加深层链接时,以及在通过路由或深层链接进行导航时,会发生NullPointerException。(938a0c、b/193805425) - 修复了 Navigation Compose 中添加了深层链接的
NavBackStackEntry无法达到RESUMED状态的问题。(I192c5) - 修复了以下问题:弹出对话框目的地不会更新 NavController 的系统返回按钮处理情况,这可能会导致 NavController 拦截返回按钮,即使该按钮没有任何要弹出的返回堆栈。(aosp/1782668)
版本 2.4.0-alpha05
2021 年 7 月 21 日
发布了 androidx.navigation:navigation-*:2.4.0-alpha05。版本 2.4.0-alpha05 中包含这些提交内容。
行为变更
- 在目的地之间导航时,Navigation Compose 的
NavHost现在始终使用淡入淡出。(I07049、b/172112072) - 您现在可以更改 NavHost 的图表。具有相同 startDestination 的图表和图表中的目的地将被视为相等,并且不会清除
NavController返回堆栈。(I0b8db、b/175392262)
bug 修复
- 修复了从附加到
NavBackStackEntry的LifecycleObserver中调用popBackStack()时因 NavController 状态的可重入更新而出现的NoSuchElementException。(I64621) AbstractListDetailFragment现在允许在未使用AbstractListDetailFragment时从 APK 中完全删除SlidingPaneLayout。(I611ad)NavGraph和NavDestination现在替换了 equals 方法,因此两个具有相同值的对象将被视为相等。(I166eb、b/175392262)
版本 2.4.0-alpha04
2021 年 7 月 1 日
发布了 androidx.navigation:navigation-*:2.4.0-alpha04。版本 2.4.0-alpha04 中包含这些提交内容。
新功能
navigation-fragment制品现在通过新的AbstractListDetailFragment包含一个双窗格布局的预构建实现。此 fragment 使用SlidingPaneLayout管理列表窗格(由您的子类提供)和详细信息窗格,后者采用NavHostFragment作为其实现方法,如示例实现中所示。(Iac4be、b/191276636)navigation-compose制品的NavHost现在除了支持composable目的地之外,还支持dialog目的地。这些对话框目的地会显示在各自对应的可组合项Dialog内,并悬浮在当前的composable目的地上方。(I011d0)
val navController = rememberNavController()
Scaffold { innerPadding ->
NavHost(navController, "home", Modifier.padding(innerPadding)) {
composable("home") {
// This content fills the area provided to the NavHost
HomeScreen()
}
dialog("detail_dialog") {
// This content will be automatically added to a Dialog() composable
// and appear above the HomeScreen or other composable destinations
DetailDialogContent()
}
}
}
API 变更
NavigatorState中的add函数已重命名为push。当前对add()的所有调用都需要更改为 push()。(Ie89fc、b/172112072)- 自定义
Navigator实例现在可以使用NavigatorState中的pushWithTransaction和popWithTransitionAPI 对目的地异步执行入栈或出栈操作。请注意,此 API 尚未用于任何已包含的导航器。(Ic4d7c、b/172112072)
行为变更
NavDeepLinkBuilder现在将PendingIntent.FLAG_IMMUTABLE添加到了createPendingIntent()返回的PendingIntent中,从而确保此 API 在以 Android 12 为目标平台时按预期工作。(If8c52)
bug 修复
- 修复了
<include-dynamic>存在的以下问题:传递给图表的参数无法正确传递给动态包含的图表。(I3e115) - 修复了使用默认值为
@null的string[]参数导航到目的地时抛出NullPointerException的问题。(I1fbe8) - 为
@Navigator.Name添加了 ProGuard 规则,修复了使用 R8 3.1 完整模式时出现的问题。(I2add9、b/191654433) - 使用
1.5.0之前的Kotlin版本构建应用时,SafeArgs 不会再失败。(Icd1ff、b/190739257)
版本 2.4.0-alpha03
2021 年 6 月 16 日
发布了 androidx.navigation:navigation-*:2.4.0-alpha03。版本 2.4.0-alpha03 中包含这些提交内容。
bug 修复
- 修复了需要调用两次
navigate()才能转到包含的动态图的问题。(I7785c、b/188859835) - 修复了 Navigation
2.4.0-alpha01中引入的如下回归问题:当您位于顶层目的地时,setupActionBarWithNavController()无法正确移除向上图标。(I5d443、b/189868637) - 修复了在先弹出 NavController 的根图后调用
popBackStack()时出现的IllegalStateException。(I2a330、b/190265699) - 现在,在使用
navigation-common或任何依赖于它的制品时,可以正确对by navArgs()应用 ProGuard 规则。(I68800、b/190082521) - 在第一次收到回调时调用
navigate()的OnDestinationChangedListener现在可以正确获取包含要转到的目的地的第二次回调。(Ie5f9e、b/190228815) - 在将 Safe Args 与动态功能模块和 AGP 7.0 及更高版本结合使用时,Safe Args 不再崩溃。(I69518、b/189966576)
已知问题
- 由于依赖于旧版 Kotlin,因此在使用 Gradle
6.7.0时,Safe Args 将运行失败,并显示Unable to find method ‘’java.lang.String kotlin.text.CarsKt.titleCase(char, java.util.Locale)’’错误。如需解决此问题,请更新为使用 Gradle 7.0。(b/190739257)
版本 2.4.0-alpha02
2021 年 6 月 2 日
发布了 androidx.navigation:navigation-*:2.4.0-alpha02。版本 2.4.0-alpha02 中包含这些提交内容。
新功能
- activity、fragment 和 dialog 目的地以及整个 DynamicNavigation Kotlin DSL 现在支持路线。(Ib5544、Ia617b、I22f96、b/188914648、b/188901565)
NavigationUI暂时添加了实验性 API,以允许选择不保存状态。虽然始终保存状态才是正确的行为,但仍会在保存状态时使用一些不受支持的废弃库(即保留的 fragment),这就让应用有机会慢慢减少对不受支持 API 的使用。(Idf93c)Navigation 现在提供
findDestination()和getHierarchy()API,可用于帮助实现自定义 NavigationUI。findDestination()是针对NavGraph的扩展函数,用于在图中查找目的地。getHierarchy()是针对NavDestination的函数,可用于验证给定目的地是否位于另一个目的地的层次结构中。(I2932f、b/188183365)val matchingRoute: Boolean = destination.hierarchy.any { it.route == routeToFind }更新了 NavigationUI 方法,从接受
BottomNavigationView改为接受在 Material1.4.0、NavigationBarView中引入的它的父类。这样一来,这些方法就可以与NavigationRailView搭配使用。(Ib0b36、b/182938895)通过 XML 膨胀
<action>元素时,动画属性可以使用通过app:enterAnim="?attr/transitionEnter"语法从主题中提取的属性。(I07bc1、b/178291654)
API 变更
- 废弃了使用 ID 的 Kotlin DSL 构建器,请改用使用路线的构建器(I85b42、b/188816479)(I9f58f、b/188816479)
bug 修复
- 现在,如果对话框是通过按系统返回按钮或点击对话框外的任意位置来关闭的,
DialogFragmentNavigator会使用NavigatorState.pop()API 来通知NavController,从而确保NavController状态与导航器的状态始终保持同步。(I2ead9) 在使用
onDestinationChanged回调操控OnDestinationChangedListeners的列表时,Navigation 不再提供ConcurrentModificationException。(Ib1707、b/188860458)在 Kotlin 中尝试生成方向属性时,Safe Args 不再崩溃。(Id2416、b/188564435)
针对 NavDestination 的 setId 方法现在已使用
@IdRes正确进行注解,因此只接受资源 ID。(I69b80)findNode的 int 参数现为resId,而不是resid。(I7711d)
依赖项更新
- Safe-Args 现在依赖于 Android Gradle 插件 4.2.0。也就是说,您应该不会再收到使用
applicationIdTextResource的警告。(I6d67b、b/172824579)
版本 2.4.0-alpha01
2021 年 5 月 18 日
发布了 androidx.navigation:navigation-*:2.4.0-alpha01。版本 2.4.0-alpha01 中包含这些提交内容。
新功能
NavController上的currentBackStackEntryAsFlow()方法提供了一个Flow(会在每次当前NavBackStackEntry变化时发出)。此流程可以用作手动管理OnDestinationChangedListener的替代方案。(I19c4a、#89、b/163947280)
多个返回堆栈
NavController 负责:管理目的地的返回堆栈,在您 navigate() 到相应目的地时将目的地添加到返回堆栈,以及在您调用 popBackStack() 或触发系统的返回按钮时移除目的地。我们扩展了导航图 XML 中现有的 NavOptions 类及 <action> 条目中的集成,以便支持保存和恢复返回堆栈。(b/80029773)
作为此变更的一部分,onNavDestinationSelected()、BottomNavigationView.setupWithNavController() 和 NavigationView.setupWithNavController() 的 NavigationUI 方法现在会自动保存并恢复弹出的目的地的状态,从而在不更改任何代码的情况下支持多个返回堆栈。将 Navigation 与 Fragment 搭配使用时,建议采用这种方式与多个返回堆栈集成。(Ie07ca)
用于保存和恢复状态的底层 API 会通过许多途径公开:
在 Navigation XML 中,
<action>元素现在可以使用app:popUpToSaveState和app:restoreState的布尔属性来保存通过app:popUpTo弹出的任何目的地的状态,并恢复作为app:destination传递的目的地的关联状态:<action android:id=”@+id/swap_stack” app:destination=”@id/second_stack” app:restoreState=”true” app:popUpTo=”@id/first_stack_start_destination” app:popUpToSaveState=”true” />在
navOptionsKotlin DSL 中,您可以在popUpTo构建器上添加restoreState和saveState布尔属性:// Use the navigate() method that takes a navOptions DSL Builder navController.navigate(selectedBottomNavRoute) { launchSingleTop = true restoreState = true popUpTo(navController.graph.startDestinationId) { saveState = true } }在通过
NavOptions.Builder手动构建NavOptions对象时,您可以将setRestoreState()和新的过载用于采用了额外saveState参数的setPopUpTo()。NavOptions navOptions = new NavOptions.Builder() .setLaunchSingleTop(true) .setRestoreState(true) .setPopUpTo(navController.getGraph().getStartDestinationId(), false, // inclusive true) // saveState .build(); navController.navigate(selectedBottomNavId, null, navOptions);对
popBackStack()的程序化调用现在可以包含额外的saveState参数。
在所有情况下,NavController 都将保存并恢复每个 NavBackStackEntry(包括任何已限定导航目的地范围的 ViewModel 实例)的状态。我们更新了 Navigator API,使每个 Navigator 都支持保存和恢复自己的状态。
我们还更新了 Navigation Compose 中 composable 目的地所用的 ComposeNavigator 以及包含 Fragment 的 Navigation 中的 <fragment> 目的地所用的 FragmentNavigator 和 DynamicFragmentNavigator,以便使用新的导航器 API 并支持保存和恢复状态。
导航路线
路线是用于标识目的地的 String,其具有唯一性。此概念之前仅用于 Navigation Compose 中,但现在已逐渐成为核心 Navigation API 的一部分。在通过 Navigation Kotlin DSL 构建图表时,这可以作为使用整数 ID 的替代方案。(b/172823546)
所有过去仅采用 ID 的 API 现在都具有采用路线 String 的过载。这包括 navigate()、popBackStack()、popUpTo() 和 getBackStackEntry()。
这产生了一些 API 影响:
- Kotlin DSL 中的
popUpToKotlin 属性已被废弃,取而代之的是popUpToId。(I59c73、b/172823546) getStartDestination()API 已被废弃,取而代之的是getStartDestinationId()。(I0887f、b/172823546)
对于从旧版 Navigation Compose 升级到 Navigation Compose 2.4.0-alpha01 的开发者来说,这意味着不再需要以下对扩展方法的导入,应该将其移除:
import androidx.navigation.compose.navigation
import androidx.navigation.compose.createGraph
import androidx.navigation.compose.getBackStackEntry
import androidx.navigation.compose.navigate
import androidx.navigation.compose.popUpTo
KEY_ROUTE 参数已被 NavDestination 中的 route 属性取代,这使您可以直接调用 navBackStackEntry.destination.route。
API 变更
- 所有 Navigation 制品都已使用 Kotlin 重写。这提升了使用泛型(例如
NavType子类)的类的可为 null 性。所有曾包含在-ktx制品中的 Kotlin 扩展函数都已移到其各自的主要制品中。-ktx制品将继续发布,但它完全是空的。(b/184292145) NavDeepLinkBuilder现在支持向生成的返回堆栈中添加多个不同的目的地。(I3ee0d、b/147913689)- 为
DynamicNavHostFragment添加了工厂函数(Icd515、b/175222619) NavBackStackEntry的唯一 ID 现已作为其公共 API 的一部分公开。(Ie033a)NamedNavArgument的“name”字段、“argument”字段和解构函数现已公开。(#174、b/181320559)- 引入了新的
NavBackStackEntry#provideToCompositionLocals扩展,它会向相关的 CompositionLocal 提供NavBackStackEntry。(#175、b/187229439)
Safe Args
Safe Args 现在会为每个
NavArgs类生成一个fromSavedStateHandle()方法。(#122、b/136967621)class HomeViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { // Create a HomeDestinationArgs class with type safe accessors for each argument // defined on your destination private val args = HomeDestinationArgs.fromSavedStateHandle(savedStateHandle) }更新了 Safe Args,使其依赖于 KotlinPoet
1.8.0。(#172、b/183990444)
行为变更
- Navigation 现在依赖于 Lifecycle
2.3.1,并且现在会将更新NavBackStackEntryLifecycle的setGraph()、popBackStack()、navigateUp()和navigate()方法标记为@MainThread,从而使 Navigation 与 Lifecycle2.3.0中引入的主线程强制执行保持一致。(b/171125856) - 现在,解析来自深层链接的枚举参数时不区分大小写,举个例子:即使枚举值为
RED,深层链接http://www.example.com/red也会匹配深层链接www.example.com/{color}。(#152、b/135857840)
Compose 兼容性
androidx.navigation:navigation-compose:2.4.0-alpha01仅与 Compose 版本1.0.0-beta07及更高版本兼容。
bug 修复
- 修复了以下问题:末尾的参数占位符会优先于后缀完全匹配的深层链接。(#153、b/184072811)
NavHostFragment现在支持与默认DialogFragmentNavigator使用同一@Navigator.Name("dialog")的自定义导航器。(Ib1c2c、b/175979140)- 改进了
NavigatorProvider#addNavigator的行为,以确保使用同一实例反复调用它不会产生问题。(#176、b/187443146)
外部贡献
- 感谢 simonschiller 实现对 Safe Args 的支持,从而为每个
NavArgs类生成一个fromSavedStateHandle()方法。(#122、b/136967621) - 感谢 Bradleycorn 实现解析来自深层链接的枚举参数时不区分大小写。(#152、b/135857840)
- 感谢 osipxd 修复了以下问题:末尾的参数占位符会优先于后缀完全匹配的深层链接。(#153、b/184072811)
- 感谢 tatocaster 将 Safe Args 更新为依赖于 KotlinPoet
1.8.0。(#172、b/183990444) - 感谢 jossiwolf 使
NamedNavArgument的“name”字段、“argument”字段和解构函数公开。(#174、b/181320559) - 感谢 jossiwol 引入了新的
NavBackStackEntry#provideToCompositionLocals扩展,从而向相关的 CompositionLocal 提供NavBackStackEntry。(#175、b/187229439) - 感谢 jossiwolf 改进了
NavigatorProvider#addNavigator的行为,以确保使用同一实例反复调用它不会产生问题。(#176、b/187443146)
Navigation Compose 版本 1.0.0
版本 1.0.0-alpha10
2021 年 4 月 7 日
发布了 androidx.navigation:navigation-compose:1.0.0-alpha10。版本 1.0.0-alpha10 中包含这些提交内容。
API 变更
NavHost现接受Modifier,后者会向下传递到封装目的地可组合项的可组合容器。(I85aca、b/175125483)
bug 修复
- 现在,即使未找到
OnBackPressedDispatcherOwner(例如在预览NavHost时),NavHost也可正常运行。(I7d8b4) - Navigation Compose 现在依赖于 Navigation
2.3.5,修复了在NavHost目的地内使用BackHandler时出现的问题。(I7e63b、b/182284739)
版本 1.0.0-alpha09
2021 年 3 月 10 日
发布了 androidx.navigation:navigation-compose:1.0.0-alpha09。版本 1.0.0-alpha09 中包含这些提交内容。
API 变更
LocalViewModelStoreOwner.current现在会返回可为 null 的ViewModelStoreOwner,以更好地确定ViewModelStoreOwner在当前组合中是否可用。如果未设置ViewModelStoreOwner,则需要ViewModelStoreOwner的 API(例如viewModel()和NavHost)仍会抛出异常。(Idf39a)
bug 修复
- Navigation Compose 现在依赖于 Navigation 2.3.4,其中修复了在设置图表后尝试设置同一 ViewModelStore 对象的问题。(I65c24、b/177825470)
版本 1.0.0-alpha08
2021 年 2 月 24 日
发布了 androidx.navigation:navigation-compose:1.0.0-alpha08。版本 1.0.0-alpha08 中包含这些提交内容。
新功能
NavHost现在使用目的地的NavBackStackEntry填充LocalSavedStateRegistryOwnerCompositionLocal,以确保直接保存到SavedStateRegistry中的所有状态都将随目的地一起保存并恢复。(I435d7、b/179469431)
版本 1.0.0-alpha07
2021 年 2 月 10 日
发布了 androidx.navigation:navigation-compose:1.0.0-alpha07。版本 1.0.0-alpha07 中包含这些提交内容。
依赖项更新
- Navigation Compose 现在依赖于 Lifecycle ViewModel Compose 1.0.0-alpha01,以便为
composable目标提供viewModel()支持。(I7a374) NavHost现在使用 Activity-Compose 1.3.0-alpha01 中的新LocalOnBackPressedDispatcherOwner获取在NavController上设置的OnBackPressedDispatcher。(I65b12)
版本 1.0.0-alpha06
2021 年 1 月 28 日
发布了 androidx.navigation:navigation-compose:1.0.0-alpha06。版本 1.0.0-alpha06 中包含这些提交内容。
API 变更
- 在
NavController中添加了getBackStackEntry(route: String)扩展方法,该方法会返回关联的NavBackStackEntry。(If8931)
版本 1.0.0-alpha05
2021 年 1 月 13 日
发布了 androidx.navigation:navigation-compose:1.0.0-alpha05。版本 1.0.0-alpha05 中包含这些提交内容。
进行了更新,以依赖 Compose 1.0.0-alpha10。
版本 1.0.0-alpha04
2020 年 12 月 16 日
发布了 androidx.navigation:navigation-compose:1.0.0-alpha04。版本 1.0.0-alpha04 中包含这些提交内容。
- 进行了更新,以便与 Compose
1.0.0-alpha09兼容。
版本 1.0.0-alpha03
2020 年 12 月 2 日
发布了 androidx.navigation:navigation-compose:1.0.0-alpha03。版本 1.0.0-alpha03 中包含这些提交内容。
bug 修复
- 修复了以下问题:配置更改或进程终止和重新创建后,
popBackStack()和navigateUp()无法工作。(Icea47、b/173281473) - 现在,导航至 NavHost 中的嵌套图表可以正常工作。(I0948d、b/173647694)
版本 1.0.0-alpha02
2020 年 11 月 11 日
发布了 androidx.navigation:navigation-compose:1.0.0-alpha02。版本 1.0.0-alpha02 中包含这些提交内容。
API 变更
- Navigation Compose 现已支持使用 popUpTo 和 launchSingleTop 操作所需的 NavOptions(If96c3、b/171468994)
- 添加了使用路由而非 ID 的导航函数,您可在 Navigation Compose DSL 中构建嵌套图表。(I1661d)
- startDestination 现已在 NavHost 参数列表中位于路由之前 (Ie620e)
- 您现已可以将路由作为 NavHost 可组合项以外的初始目的地来创建图表。(Iceb75)
版本 1.0.0-alpha01
2020 年 10 月 28 日
发布了 android.navigation:navigation-compose:1.0.0-alpha01。版本 1.0.0-alpha01 中包含这些提交内容。
新功能
navigation-compose 制品集成了 Navigation Component 和 Jetpack Compose,且在应用中将 @Composable 函数作为目的地。
此初始版本包含以下各项:
NavHost可组合项允许您通过 Kotlin DSL 构建导航图表。- 可在目标位置级别对生命周期、
ViewModel和记忆状态进行限定。 - 自动与系统的返回按钮集成。
- 可传递参数、将深层链接附加到目的地以及将结果返回到前一个目的地。
rememberNavController()和currentBackStackEntryAsState()中特定于 Compose 的帮助程序可提升状态并将NavController连接到NavHost以外的可组合项(例如底部的导航栏)。
如需了解详情,请参阅 Compose Navigation 指南。
版本 2.3.5
版本 2.3.5
2021 年 4 月 7 日
发布了 androidx.navigation:navigation-*:2.3.5。版本 2.3.5 中包含这些提交内容。
新功能
- 使用
NavDeepLinkRequest或Uri进行导航时,您现在可以访问生成的目的地中的Uri、操作和 MIME 类型,方法是通过KEY_DEEP_LINK_INTENT,获取来自参数的 intent,对应于已提供的外部深层链接功能。(I975c3、b/181521877)
bug 修复
OnBackPressedCallbacks已添加至带有NavBackStackEntry的调度程序,现在,如果 Activity Lifecycle 先为STOPPED,然后重新变为STARTED,则 LifecycleOwner 会正确拦截返回操作。(Iff94f, b/182284739)- 深层链接域名解析现在不区分大小写,因此确保
www.example.com与www.example.com和www.Example.com都能匹配。请注意,查询参数名称仍区分大小写。(#144、b/153829033) - 修复了当某个目的地具有多个不可为 null 的默认参数,且导航到该目的地时只覆盖这些参数的子集时,可能出现的
NullPointerException。(aosp/1644827)
依赖项更新
- Navigation Safe Args Gradle 插件现在依赖于 Kotlin Gradle 插件 1.4.31。(aosp/1661058、b/181156413)
外部贡献
- 感谢
bentrengrove提出的拉取请求,使得深层链接域名解析不区分大小写。(#144、b/153829033)
版本 2.3.4
版本 2.3.4
2021 年 3 月 10 日
发布了 androidx.navigation:navigation-*:2.3.4。版本 2.3.4 中包含这些提交内容。
新功能
- 现在,
ReferenceType参数作为深层链接 URI 的一部分发送时可以得到正确解析。这既支持原始整数值,也支持以0x为前缀的十六进制值。(#127、b/179166693) - 具有
app:argType="float"的参数的android:defaultValue现在支持整数默认值,让您可以使用android:defaultValue="0",而无需使用0.0。(#117、b/173766247)
bug 修复
- 修复了在利用 Navigation 对动态功能的支持时安装进度卡住的问题。(Ib27a7、b/169636207)
- 现在,使用已设置的同一对象调用
setViewModelStore或setLifecycleOwner将成为一项空操作(Idf491、b/177825470) - 现在,使用 java 时,Safe-Args 会在正确的方法上添加抑制注解。(I8fbc5、b/179463137)
外部贡献
- 感谢
JvmName提供的拉取请求,这可确保ReferenceType参数现在作为深层链接 URI 的一部分发送时可以得到正确解析。(#127、b/179166693) - 感谢
tatocaster提供的拉取请求,这可以让具有app:argType=”float”的参数的defaultValue现在支持整数默认值。(#117、b/173766247)
版本 2.3.3
版本 2.3.3
2021 年 1 月 27 日
发布了 androidx.navigation:navigation-*:2.3.3。版本 2.3.3 中包含这些提交内容。
bug 修复
- 现在,在 NavBackStackEntry 的
Lifecycle变为CREATED之前弹出NavBackStackEntry时,不会再发生崩溃。(Ie3ba3) - 修复了由 b/171364502 引起的回归问题,具体为导航至动画资源值为
0的 activity 会导致ResourceNotFoundException错误。(I7aedb、b/176819931)
版本 2.3.2
版本 2.3.2
2020 年 12 月 2 日
发布了 androidx.navigation:navigation-*:2.3.2。版本 2.3.2 中包含这些提交内容。
bug 修复
- 修复了
NavigationUI中的一个回归问题,即使用带有onNavDestinationSelected的<activity>目标位置无法导航到 Activity。(I22e34、b/171364502) - 修复了
navigation-dynamic-features-fragment会导致多次导航到新安装的目标位置的问题。(aosp/1486056、b/169636207) - 修复了以下问题:使用
launchSingleTop时,默认参数无法发送到OnDestinationChangedListener实例。(I2c5cb) - 修复了以下问题:导航到嵌套导航图时,系统不会在返回堆栈上创建新的图表实例。(Ifc831)
- 修复了以下问题:将
navigate()与已移除导航图中的最后一个目的地的popUpTo一起使用时,不会立即销毁并从返回堆栈中移除导航图本身。(I910a3) - Navigation SafeArgs 现在使用 KotlinPoet 版本 1.7.2,后者添加了对 Kotlin 的显式 API 模式的支持。(I918b5)
- 除了对 Fragment 层次结构和 Fragment 的视图层次结构的现有检查以外,
NavHostFragment.findNavController(Fragment)现在还会检查 DialogFragment 的 root decor 视图。这样,您便可以通过FragmentScenario和Navigation.setViewNavController()测试使用 Navigation 的对话框 fragment。(I69e0d)
版本 2.3.1
版本 2.3.1
2020 年 10 月 14 日
发布了 androidx.navigation:navigation-*:2.3.1。版本 2.3.1 中包含这些提交内容。
新功能
- 默认 Animator 资源已添加到 Navigation UI,建议使用该资源,而不是默认动画资源。(b/167430145)
- NavOptions 现在替换了哈希代码和 equals 方法 (b/161586466)
- 现在 Navigation 会在“无带 ID 的目标”IllegalArgumentException 中包含当前目标,这应该会改进开发者的调试体验。(b/168311416)
bug 修复
- Safe Args 将不再封装返回行,即使生成的参数类名称的长度超过 100 个字符也是如此。(b/168584987)
依赖项变更
navigation-ui现在依赖于 DrawerLayout 1.1.1,从而确保即使是在使用LOCK_MODE_LOCKED_CLOSED或LOCK_MODE_LOCKED_OPEN时NavigationUI也能够打开抽屉式导航栏。(b/162253907)- Safe Args 现在依赖于 KotlinPoet 1.6.0 (aosp/1435911)
- Safe Args 现在依赖于 AGP 4.0.1 (aosp/1442337)
版本 2.3.0
版本 2.3.0
2020 年 6 月 24 日
发布了 androidx.navigation:navigation-*:2.3.0。版本 2.3.0 中包含这些提交内容。
自 2.2.0 以来的重要变更
- 功能模块集成:借助
navigation-dynamic-features-runtime和navigation-dynamic-features-fragment制品,您可以导航到功能模块中定义的目标,从而根据需要自动处理功能模块的安装。如需了解详情,请参阅使用功能模块进行导航。 - 导航测试:
navigation-testing制品提供了一个TestNavHostController,可用于设置当前目标并在导航操作后验证返回堆栈。如需了解详情,请参阅测试导航。 - 返回结果:现在,通过与 Navigation 返回堆栈中的每个目标相关联的
NavBackStackEntry,您可以使用SavedStateHandle,它适用于存储少量应与特定返回堆栈条目相关联的已保存状态。如需了解详情,请参阅向上一个目的地返回结果。 - 对
Openable的NavigationUI支持:使用NavigationUI中DrawerLayout的所有情况都已替换为使用更通用的Openable接口,该接口已添加到 CustomView1.1.0中,并由DrawerLayout在 DrawerLayout1.1.0中实现。 - 深层链接中的操作和 MIME 类型支持:深层链接现已经过扩展,除了之前可用的
app:uri之外,还支持app:action和app:mimeType。NavController现在支持通过新的NavDeepLinkRequest类按这些字段的任意组合进行导航。如需了解详情,请参阅使用 NavDeepLinkRequest 导航。
已知问题
- 清单合并尚不提供对深层链接操作和 MIME 类型的支持。在提供支持之前,从清单的
<nav-graph>元素生成的任何<intent-filter>元素都不会在其<data>元素或您的自定义<action>中包含您的 MIME 类型。您必须手动在清单中添加相应的<intent-filter>。
版本 2.3.0-rc01
2020 年 6 月 10 日
发布了 androidx.navigation:navigation-*:2.3.0-rc01。版本 2.3.0-rc01 中包含这些提交内容。
bug 修复
- 修复了在使用
singleTop将不含参数的目标的实例替换为包含参数的其他实例时发生的NullPointerException。(b/158006669) NavController抛出的所有destination is unknown异常现在包含额外的调试信息,可帮助确定NavController的状态。(b/157764916)
版本 2.3.0-beta01
2020 年 5 月 20 日
发布了 androidx.navigation:navigation-*:2.3.0-beta01。版本 2.3.0-beta01 中包含这些提交内容。
bug 修复
- 修复了进程终止后
NavBackStackEntry的Lifecycle无法正确更新的问题。(b/155218371) - 现在进程终止后,可向在调用
setGraph()之前注册的OnDestinationChangedListener实例正确发送恢复的目标。(b/155218371) - 现在使用
singleTop时,NavBackStackEntry会正确更新其参数,且更新后的参数会发送给所有OnDestinationChangeListener实例。(b/156545508)
依赖项更新
NavigationUI制品现在依赖于 CustomView1.1.0-rc01和 DrawerLayout1.1.0-rc01。(aosp/1309696)
版本 2.3.0-alpha06
2020 年 4 月 29 日
发布了 androidx.navigation:navigation-*:2.3.0-alpha06。(版本 2.3.0-alpha06 中包含这些提交内容。)
新功能
- 深层链接已经过扩展,除了之前可用的
app:uri之外,还支持app:action和app:mimeType。NavController 现在支持通过新的NavDeepLinkRequest类按这些字段的任意组合进行导航。(b/136573074、b/135334841)
API 变更
- 极大地扩展了对 Dynamic Navigation 目标的 Kotlin DSL 支持。(b/148969800)
bug 修复
- 修复了使用嵌套起始目标时深层链接 intent 会被忽略的问题。(b/154532067)
版本 2.3.0-alpha05
2020 年 4 月 15 日
发布了 androidx.navigation:navigation-*:2.3.0-alpha05。版本 2.3.0-alpha05 中包含这些提交内容。
新功能
- 对于使用
<include-dynamic>的所包含动态图,您不需要再指定app:graphPackage,只需在点后为applicationId添加moduleName后缀,系统即会使用默认的软件包。如果您需要自定义graphPackage,现在可以使用${applicationId}占位符。(b/152696768) - Navigation Graph Kotlin DSL 现在可公开操作的
defaultArgumentsMap,从而镜像在 Navigation XML 文件中为<action>元素设置默认值的功能。(b/150345605)
bug 修复
- 从 Navigation 2.2.2 开始:修复了如果 Activity 中有多个
NavHostFragment实例,深层链接到图的起始目的地时的IllegalStateException。(b/147378752)
依赖项更新
- Navigation 现在依赖于 Fragment
1.2.4。(aosp/1277325) - Dynamic Navigation 现在依赖于 Play Core
1.7.2。(aosp/1282257)
版本 2.3.0-alpha04
2020 年 3 月 18 日
发布了 androidx.navigation:navigation-*:2.3.0-alpha04。版本 2.3.0-alpha04 中包含这些提交内容。
新功能
- 添加了对采用 Navigation Kotlin DSL 的功能模块 Activity 和 Fragment 目标的支持。(b/148969800)
API 变更
DynamicExtras类不再使用构建器模式,现在可以直接构建。(aosp/1253671)- 现在,
DynamicActivityNavigator可以在其构造函数(而非Activity)中获取Context。(aosp/1250252)
bug 修复
NavigationUI不再忽略空标签(即包含android:label=””的目的地),现在可以正确将标题设置为空字符串。(b/148679860)
依赖项更新
- Navigation Dynamic Features 制品现在依赖于 Play Core
1.6.5。(b/149556401)
版本 2.3.0-alpha03
2020 年 3 月 4 日
发布了 androidx.navigation:navigation-*:2.3.0-alpha03。版本 2.3.0-alpha03 中包含这些提交内容。
API 变更
- 现在,
AppBarConfiguration不再依赖于具体的DrawerLayout类,而是使用 CustomView1.1.0-alpha02中引入的Openable接口(从 DrawerLayout1.1.0-alpha04开始,DrawerLayout会实现该接口),从而允许您将Openable的自定义实现与NavigationUI一起使用。(b/129030452)
bug 修复
- 现在,
navigation-common-ktxProGuard 规则只会正确保留使用的NavArgs类,而非所有NavArgs实例。(b/150213558)
依赖项变更
- Navigation 已还原其在 Core
1.2.0方面的依赖项,现在依赖于 Core1.1.0,以避免在 Navigation 不依赖于 Core1.2.0中的新 API 时,强迫开发者移至更高版本的依赖项。
版本 2.3.0-alpha02
2020 年 2 月 19 日
发布了 androidx.navigation:navigation-*:2.3.0-alpha02。版本 2.3.0-alpha02 中包含这些提交内容。
新功能
NavBackStackEntry现在允许您访问SavedStateHandle,它适合存储少量应与特定返回堆栈条目相关联的已保存状态。有关示例用例,请参阅返回结果。(b/79672220)
API 变更
- 添加了
getCurrentBackStackEntry()和getPreviousBackStackEntry()的简便方法,以便更轻松地检索NavBackStackEntry获取当前和之前的目的地。(b/79672220)
bug 修复
- 现在,在您自己的任务堆栈上启动应用时,
navigateUp()会将当前目的地的参数和KEY_DEEP_LINK_INTENT传递到之前的目的地。(b/147456890)
依赖项变更
- Navigation 现在依赖于 Core
1.2.0。
版本 2.3.0-alpha01
2020 年 2 月 5 日
发布了 androidx.navigation:navigation-*:2.3.0-alpha01。版本 2.3.0-alpha01 中包含这些提交内容。
新功能
- 新的
navigation-testing制品提供了TestNavHostController类。该类提供了测试 Navigation 时使用模拟NavController的替代方法,该方法可让您设置当前目的地,并在导航操作后验证返回堆栈。(b/140884273) - 新的
navigation-dynamic-features-fragment(及其传递依赖项navigation-dynamic-features-runtime)可让您通过<include-dynamic>添加功能模块中的目标或整个导航图,从而在导航到相应目标时,实现按需功能模块无缝安装。如需了解详情,请参阅使用功能模块进行导航。(b/132170186)
bug 修复
- 从 Navigation
2.2.1起:没有查询参数的深层链接现在可以正确忽略任何查询参数,而不是将它们附加到尾随{argument}元素或不匹配深层链接。(b/147447512) - 从 Navigation
2.2.1开始:更新了DrawerArrowDrawable的navigation-uiProGuard 规则,以确保不需要android.enableJetifier=true。(b/147610424) - 从 Navigation
2.2.1开始:navigation-common-ktx模块现在具有唯一的清单软件包名称,而不是与navigation-runtime-ktx共用相同的清单软件包名称。(aosp/1141947)
依赖项更新
- 从 Navigation
2.2.1开始:Navigation2.2.1现在依赖于 Lifecycle ViewModel SavedState2.2.0和 Fragment1.2.1。
版本 2.2.2
版本 2.2.2
2020 年 4 月 15 日
发布了 androidx.navigation:navigation-*:2.2.2。版本 2.2.2 中包含这些提交内容。
bug 修复
- 修复了如果 Activity 中有多个
NavHostFragment实例,深层链接到图的起始目的地时的IllegalStateException。(b/147378752) NavigationUI不再忽略空标签(即包含android:label=””的目的地),现在可以正确将标题设置为空字符串。此修复已在之前的 Navigation 2.3.0-alpha04 中发布。(b/148679860)- 现在,
navigation-common-ktxProGuard 规则只会正确保留使用的NavArgs类,而非所有NavArgs实例。此修复已在之前的 Navigation 2.3.0-alpha03 中发布。(b/150213558
依赖项更新
- Navigation 现在依赖于 Fragment
1.2.4。(aosp/1277325)
版本 2.2.1
版本 2.2.1
2020 年 2 月 5 日
发布了 androidx.navigation:navigation-*:2.2.1。版本 2.2.1 中包含这些提交内容。
bug 修复
- 没有查询参数的深层链接现在可以正确忽略任何查询参数,而不是将它们附加到尾随
{argument}元素或不匹配深层链接。(b/147447512) - 更新了
DrawerArrowDrawable的navigation-uiProGuard 规则,以确保不需要android.enableJetifier=true。(b/147610424) navigation-common-ktx模块现在具有唯一的清单软件包名称,而不是与navigation-runtime-ktx共用相同的清单软件包名称。(aosp/1141947)
依赖项更新
- Navigation
2.2.1现在依赖于 Lifecycle ViewModel SavedState2.2.0和 Fragment1.2.1。
版本 2.2.0
版本 2.2.0
2020 年 1 月 22 日
发布了 androidx.navigation:navigation-*:2.2.0。版本 2.2.0 中包含这些提交内容。
自 2.1.0 以来的重要变更
- NavBackStackEntry:您现在可以调用
NavController.getBackStackEntry(),并传入返回堆栈中的目标或导航图表的 ID。返回的NavBackStackEntry除了提供用于启动该目标的参数,还提供 Navigation 驱动的LifecycleOwner、ViewModelStoreOwner(与NavController.getViewModelStoreOwner()返回的相同)和SavedStateRegistryOwner。 - Lifecycle ViewModel SavedState 集成:现在将
by navGraphViewModels()或ViewModelProvider构造函数与NavController.getBackStackEntry()或NavController.getViewModelStoreOwner()返回的ViewModelStoreOwner一起使用时,会使用SavedStateViewModelFactory作为默认出厂设置。 - 深层链接的查询参数支持:具有查询参数的深层链接现在支持重新排序的查询参数;现在在匹配深层链接时,具有默认值或可为 null 的参数为可选参数。
- 改进了动画支持:
NavHostFragment现在使用 Fragment 1.2.0 中的FragmentContainerView,这解决了动画 z 排序问题以及分派给 Fragment 的窗口边衬区的问题。
版本 2.2.0-rc04
2019 年 12 月 18 日
发布了 androidx.navigation:navigation-*:2.2.0-rc04。版本 2.2.0-rc04 中包含这些提交内容。
bug 修复
- 调整了
navigation-ui使用的默认淡出动画,以便与 Fragment1.2.0-rc04中经过调整的淡出动画相符。(b/145769814)
版本 2.2.0-rc03
2019 年 12 月 4 日
发布了 androidx.navigation:navigation-*:2.2.0-rc03。版本 2.2.0-rc03 中包含这些提交内容。
bug 修复
- 修复了以查询参数和一个实参作为路径最后一部分时存在的深层链接解析问题,此问题会导致最终路径实参中的多个字符无法解析。(b/144554689)
- 修复了可选参数会收到
"@null"(而非null)的深层链接解析问题。(b/141613546) - 现在,如果将
NavHostFragment与FragmentContainerView配合使用,前者可在配置发生更改后正确恢复图表。(b/143752103)
依赖项变更
- Navigation 现在会视情况依赖于 Lifecycle
2.2.0-rc03、Lifecycle ViewModel SavedState1.0.0-rc03、Activity1.1.0-rc03和 Fragment1.2.0-rc03。
版本 2.2.0-rc02
2019 年 11 月 7 日
发布了 androidx.navigation:navigation-*:2.2.0-rc02。版本 2.2.0-rc02 中包含这些提交内容。
依赖项变更
- Navigation 现在依赖于 androidx.lifecycle
2.2.0-rc02。
版本 2.2.0-rc01
2019 年 10 月 23 日
发布了 androidx.navigation:navigation-*:2.2.0-rc01,该版本与 2.2.0-beta01 相比没有变化。版本 2.2.0-rc01 中包含这些提交内容。
版本 2.2.0-beta01
2019 年 10 月 9 日
发布了 androidx.navigation:navigation-*:2.2.0-beta01。版本 2.2.0-beta01 中包含这些提交内容。
新功能
NavDestination及其子类现在替换toString(),以在调试时提供更实用的信息。(b/141264986)
行为变更
- 现在,匹配深层链接时会忽略其他查询参数,而不是导致匹配失败。(b/141482822)
bug 修复
- 修复了以下问题:如果还指定了查询参数,深层链接路径中的实参将被忽略。(b/141505755)
- 如果没有额外服务,
Activity上的navArgs()Kotlin 扩展程序现在具有更明确的错误消息。(b/141408999) - Safe Args 生成的
DirectionsJava 类现在包含默认值。(b/141099045) - Safe Args 生成的
ArgsJava 类现在包含默认值。(b/140123727) - 如果使用
Toolbar,在两个顶级目标之间移动时,NavigationUI不再以动画形式显示文本更改。(b/140848160)
版本 2.2.0-alpha03
2019 年 9 月 18 日
发布了 androidx.navigation:navigation-*:2.2.0-alpha03。版本 2.2.0-alpha03 中包含这些提交内容。
行为变更
- 在调用
setGraph之后调用setViewModelStore()现在会导致出现IllegalStateException。在初始设置中,此项应始终由NavHost进行设置,以确保所有NavBackStackEntry实例均具有用于ViewModel实例的一致存储。(aosp/1111821)
bug 修复
- 修复了在使用
ViewModelStore实例(附加到多个不同导航图表限定范围的ViewModel实例)时出现的ConcurrentModificationException。(aosp/1112257)
版本 2.2.0-alpha02
2019 年 9 月 5 日
发布了 androidx.navigation:navigation-*:2.2.0-alpha02。点击此处可查看此版本中包含的提交内容。
新功能
- 具有查询参数的深层链接现在支持重新排序的查询参数;匹配深层链接时,具有默认值或可为 null 的实参现在是可选的。(b/133273839)
- 您现在可以调用
NavController.getBackStackEntry(),在返回堆栈中传入目标或导航图表的 ID。除了提供用于启动该目标的参数,返回的NavBackStackEntry还提供导航驱动的LifecycleOwner、ViewModelStoreOwner(与NavController.getViewModelStoreOwner()返回的内容相同)和SavedStateRegistryOwner。(aosp/1101691、aosp/1101710)
bug 修复
- 修复了将
NavHostFragment添加到ViewPager2失败并出现IllegalArgumentException的问题。(b/133640271) NavInflater现在可以避免不必要地调用getResourceName(),从而将扩充时间最多缩短 40%。(b/139213740)
版本 2.2.0-alpha01
2019 年 8 月 7 日
发布了 androidx.navigation:navigation-*:2.2.0-alpha01。点击此处可查看此版本中包含的提交内容。
新功能
SavedStateViewModelFactory现在是将by navGraphViewModels()或ViewModelProvider构造函数与NavController.getViewModelStoreOwner()返回的ViewModelStoreOwner一起使用时所用的默认出厂设置。(b/135716331)
API 变更
- 从 Navigation
2.1.0-rc01开始:移除了2.1.0-alpha02中引入的NavController上已废弃的getViewModelStore()API。(aosp/1091021)
bug 修复
NavHostFragment现在使用FragmentContainerView,修复了动画 z 排序问题以及分派给 Fragment 的窗口边衬区的问题。(b/137310379)
版本 2.1.0
版本 2.1.0
2019 年 9 月 5 日
发布了 androidx.navigation:navigation-*:2.1.0。点击此处可查看此版本中包含的提交内容。
自 2.0.0 以来的重要变更
- 将 ViewModel 范围限定为导航图表:您现在可以通过针对使用
-ktx库的 Kotlin 用户的by navGraphViewModels()属性委派或使用添加到NavController的getViewModelStoreOwner()API,创建在导航图表级别限定范围的 ViewModel。如需了解详情,请参阅在目标之间共享与界面相关的数据。 - dialog 目标:您现在可以创建
<dialog>目标,当您navigate到这些目标时,系统会显示DialogFragment。NavHostFragment默认支持 dialog 目标。如需了解详情,请参阅从 DialogFragment 创建目标。 - 通过 Uri 导航:您现在可以使用
Uri进行navigate,它使用您已添加到目标的<deepLink>进行导航。如需了解详情,请参阅使用 Uri 导航。 - NavHostController:专门用于构建自定义
NavHost的 API 已移至NavHostController,从而允许实现将其NavController连接到托管LifecycleOwner、OnBackPressedDispatcher和ViewModelStore。
版本 2.1.0-rc01
2019 年 8 月 7 日
发布了 androidx.navigation:navigation-*:2.1.0-rc01。点击此处可查看此版本中包含的提交内容。
API 变更
- 移除了
2.1.0-alpha02中引入的NavController上已废弃的getViewModelStore()API。(aosp/1091021)
版本 2.1.0-beta02
2019 年 7 月 19 日
发布了 androidx.navigation:*:2.1.0-beta02。点击此处可查看此版本中包含的提交内容。
bug 修复
- 移除了在
2.1.0-beta01中引入的意外 jacoco 依赖项。(b/137782950)
版本 2.1.0-beta01
2019 年 7 月 17 日
发布了 androidx.navigation:*:2.1.0-beta01。点击此处可查看此版本中包含的提交内容。
新功能
- 将
setupWithNavController()与Toolbar或CollapsingToolbarLayout结合使用时,NavigationUI现在会以动画形式显示向上按钮的移除。(b/131403621)
bug 修复
- 修复了通过
findNavController()使用具有相同容器的多个 NavHostFragment 时出现的时间问题。(b/136021571)
版本 2.1.0-alpha06
2019 年 7 月 2 日
发布了 androidx.navigation:*:2.1.0-alpha06。点击此处可查看此版本中包含的提交内容。
新功能
- NavHostFragment 使用的
app:navGraph属性现在已移至navigation-runtime制品。可通过 XML 添加的自定义导航器应使用此属性与导航编辑器的“托管方”面板相集成。(b/133880955)
API 变更
- 废弃了
NavController上的getViewModelStore()API,换用新的getViewModelStoreOwner()方法,该方法可返回ViewModelStoreOwner。(aosp/987010) - 浮动窗口目标(例如
<dialog>目标)的实现已泛化为标记接口FloatingWindow,现在所有<dialog>目标都可以实现该接口。用于与顶部应用栏交互的 NavigationUI 方法现在会忽略FloatingWindow目标。(b/133600763)
行为变更
- Navigation 现在可以正确地使其状态与使用
<dialog>目标时屏幕上显示的状态保持同步。因此,当您导航到非 dialog 和非 activity 目标(例如<fragment>目标)时,Navigation 现在会自动弹出<dialog>目标。(b/134089818)
bug 修复
- Navigation 现在可以禁止在处理深层链接时重新创建 activity 时出现的动画,从而修复了视觉闪烁问题。(b/130362979)
- 修复了由于添加了初始 fragment 而弹出 Fragment 时,Navigation 返回堆栈会不同步的 bug。(b/133832218)
版本 2.1.0-alpha05
2019 年 6 月 5 日
发布了 androidx.navigation:*:2.1.0-alpha05。点击此处可查看此版本中包含的提交内容。
API 变更
NavController上与托管方相关的 API 已重命名并移至NavController的新子类NavHostController。(aosp/966091)NavControllersetHostOnBackPressedDispatcherOwner()方法替换为NavHostController的setOnBackPressedDispatcher()方法,现在要求您在调用该方法之前先调用setLifecycleOwner()。(aosp/965409)NavHostController现在包含enableOnBackPressed(boolean)方法,该方法替换了先前由setHostOnBackPressedDispatcherOwner()返回的NavHostOnBackPressedManager类。(aosp/966091)
bug 修复
- 修复了通过 URI 导航后返回堆栈不正确的问题。(b/132509387)
- NavController 自动处理的深层链接现在仅触发一次。(b/132754763)
版本 2.1.0-alpha04
2019 年 5 月 16 日
发布了 androidx.navigation:*:2.1.0-alpha04。点击此处可查看此版本中包含的提交内容。
bug 修复
- 在拦截系统返回按钮事件时,
NavHostFragment正确遵守app:defaultNavHost,从而修复了 Navigation2.1.0-alpha03中出现的回归问题。b/132077777 DialogFragmentNavigator现在可以正确处理popBackStack()和navigateUp()操作。b/132576764- 修复了在嵌套图表之间反复导航时出现的
IllegalStateException: unknown destination during restore问题。b/131733658
版本 2.1.0-alpha03
2019 年 5 月 7 日
发布了 androidx.navigation:*:2.1.0-alpha03。点击此处可查看此版本中包含的提交内容。
已知问题
- 尽管使用了
app:defaultNavHost="false",NavHostFragment 仍会拦截系统返回按钮 b/132077777
新功能
- 您现在可以创建
<dialog>目标,当您navigate到这些目标时,系统会显示DialogFragment目标。NavHostFragment默认支持 dialog 目标。b/80267254 - 除了使用资源 ID 或
NavDirections实例调用navigate之外,您现在还可以通过Uri进行导航,它使用您已添加到目标的<deepLink>导航到相应的目标。b/110412864
行为变更
- NavigationUI 提供的默认动画已从 400 毫秒缩短到 220 毫秒,以匹配 Activity 和 Fragment 的默认动画速度。b/130055522
API 变更
- 废弃了
NavHostFragment的createFragmentNavigator()方法,并且其功能已移至新的onCreateNavController()方法,以便您更清楚地了解,这是创建子类NavHostFragment时添加自定义导航器的正确入口点。b/122802849 - 将
hasDeepLink()方法添加到了NavDestination,以便检查给定的Uri是否可由给定的目标处理,或者在有NavGraph的情况下,否可由导航图表中的任何目标处理。b/117437718
bug 修复
- 默认参数现在将正确传递到
OnDestinationChangedListener实例。b/130630686 NavHostFragment现在使用OnBackPressedDispatcher拦截系统返回事件,从而修复了返回到 Fragment 时在 Fragment 生命周期方法中进行条件导航时出现的问题。b/111598096- 对于 Safe Args,现在可以将未指定
app:argType的android:defaultValue=”@null”正确推断为string参数。b/129629192
版本 2.1.0-alpha02
2019 年 4 月 3 日
发布了 androidx.navigation:*:2.1.0-alpha02。点击此处可查看此版本中包含的提交内容。
新功能
- 您现在可以通过针对 Kotlin 用户的
by navGraphViewModels()属性委托或者通过使用添加到NavController的getViewModelStore()API,创建在导航图表级别限定范围的 ViewModel。b/111614463
API 变更
- 您现在可以将
app:targetPackage添加到<activity>,以限制匹配的软件包名称。它支持app:targetPackage="${applicationId}",可将软件包限制为您自己的应用 ID。b/110975456
bug 修复
<activity>目标的android:name在膨胀时不再解析为类,从而避免在使用动态功能时出现 ClassNotFoundException。b/124538597
版本 2.1.0-alpha01
2019 年 3 月 19 日
这是 Navigation 2.1.0 的第一个 Alpha 版本。
依赖项变更
- Navigation 现在依赖于
androidx.core:core:1.0.1和androidx.fragment:fragment:1.1.0-alpha05。此版本还移除了androidx.legacy:legacy-support-core-utils:1.0.0的依赖项。b/128632612
API 变更
- 新增了
Navigation.createNavigateOnClickListener(NavDirections)方法,以替代使用资源 ID 和套装创建点击监听器的方法。b/127631752 - 已废弃
FragmentNavigator.instantiateFragment,默认实现现在使用FragmentFactory来实例化 Fragment。b/119054429
bug 修复
- 有附加到目标的参数时,Navigation 不再发送 null
Bundle,从而修复了在使用android:defaultValue="@null"时出现的问题。b/128531879 - Safe Args 现在依赖于 KotlinPoet 1.1.0,从而修复了软件包名称过长的问题。b/123654948
版本 2.0.0
版本 2.0.0
2019 年 3 月 14 日
发布了 Navigation 2.0.0,该版本与 2.0.0-rc02 相比没有变化。
版本 2.0.0-rc02
2019 年 3 月 6 日
Navigation 2.0.0-rc02 提供了具有 androidx.navigation 组 ID 的新制品,并将其依赖项更改为 AndroidX 等效项。
2.0.0-rc02 的行为与 Navigation 1.0.0-rc02 的行为相同,除了更新依赖项以与新依赖项保持一致之外,从 1.0.0-rc02 更新不需要对代码做出任何更改。
项目必须已迁移到 AndroidX 才能使用 Navigation 的 2.X 版本。Navigation 1.0 稳定版将是最后一个使用支持库依赖项的版本;1.0 以后的所有未来开发都将基于 AndroidX,并以 2.0 稳定版为基础进行构建。
AndroidX 之前的依赖项
对于 AndroidX 之前的 Navigation 版本,请添加以下依赖项:
dependencies {
def nav_version = "1.0.0"
implementation "android.arch.navigation:navigation-fragment:$nav_version" // For Kotlin use navigation-fragment-ktx
implementation "android.arch.navigation:navigation-ui:$nav_version" // For Kotlin use navigation-ui-ktx
}
对于 Safe Args,在顶层 build.gradle 文件中添加以下类路径
buildscript {
repositories {
google()
}
dependencies {
classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0"
}
}
版本 1.0.0
版本 1.0.0
2019 年 3 月 14 日
发布了 Navigation 1.0.0,该版本与 1.0.0-rc02 相比没有变化。
版本 1.0.0-rc02
2019 年 2 月 26 日
这是 Navigation 1.0.0 稳定版的第二个候选版本。此版本修复了很多问题。
bug 修复
- 修复了在根图没有 ID 的情况下
popBackStack()会被忽略的问题 b/126251695 - 在处理没有
FLAG_ACTIVITY_NEW_TASK的深层链接后调用navigateUp()时,它现在可以正确处理导航回应用的任务这一行为 b/126082008 - 修复了
ActivityNavigator.applyPopAnimationsToPendingTransition无法应用正确的弹出退出动画的问题 b/126237567 - 由 Safe Args 生成的 Kotlin 代码现在可以正确转义 Kotlin 关键字,例如与
R类相关联的软件包名称中的in和fun。b/126020455
版本 1.0.0-rc01
2019 年 2 月 21 日
这是 Navigation 1.0.0 稳定版的候选版本。此版本修复了一个问题。
bug 修复
- 修复了使用 Fragment 和
singleTop导航操作时出现的问题 b/124294805
版本 1.0.0-beta02
2019 年 2 月 12 日
此版本进行了一些微小的改进并修复了一些重要 bug。
新功能
- 您现在可以将
0用作reference参数的android:defaultValue。b/124248602
行为变更
- 深层链接完全匹配现在优先于使用
.*或具有匹配参数的深层链接匹配。b/123969518
bug 修复
- 当返回堆栈上弹出最后一个目标时,
popBackStack()和navigateUp现在可以正确地返回false,从而修复了1.0.0-beta01中出现的回归问题。b/123933201 - Navigation 现在可以在恢复保存的实例状态期间正确设置
ClassLoader,从而避免在Navigator保存的状态或发送给NavDestination的参数中使用自定义类时出现问题。b/123893858 - 从保存的实例状态恢复
Parcelable[]参数时,Safe Args 生成的 NavArgs 类不再崩溃。b/123963545 - Safe Args 现在可以正确清理不必要生成的 Kotlin 类。b/124120883
版本 1.0.0-beta01
2019 年 2 月 4 日
这是 Navigation 的第一个测试版;今后,Navigation API 会在推出下一个版本之前一直保持稳定(除非出现严重问题)。此版本修复了一些问题并更改了一些行为。
行为变更
- Navigation 现在可以确保参数默认值在运行时以及通过 Safe Args 得到相同的处理。因此,仅
app:argType="reference"的参数可具有指向其他资源的默认值(例如@color/colorPrimary)。解析 Navigation XML 时,尝试使用app:argType不同的引用默认值会导致出现异常。b/123551990 - Safe Args 现在依赖于 Android Gradle 插件3.3.0 aosp/888413
- Safe Args 现在依赖于 Kotlin 1.3.20 aosp/888414
bug 修复
- 现在,可以在所有版本的 Android Gradle 插件的库和功能模块中使用 Safe Args。b/121304903
- 修复了导致单个
popBackStack()操作在返回堆栈顶部弹出目标的所有副本,而不是一次仅弹出一个目标的回归问题。b/123552990 - 修复了
FragmentNavigator状态与NavController状态不同步,从而在尝试恢复返回堆栈时导致出现IllegalStateException的问题。b/123803044 - 修复了将 ProGuard 与 obfuscation 一起使用时,
NavigationUI处理的返回箭头不会显示的问题。b/123449431 - 由 Safe Args 生成的代码现在可以正确处理使用指向静态内部类的
app:argType这一行为,静态内部类的格式为.OuterClass$InnerClass。b/123736741 - 由 Safe Args 生成的 Java 代码现在可以正确处理全局操作和深层嵌套的目标。b/123347762
版本 1.0.0-alpha11
2019 年 1 月 23 日
这是 1.0.0-alpha10 的修补程序版本,修复了 Safe Args 的问题。
bug 修复
- 修复了 Safe Args 无法导入与全局操作相关联的 Directions 类的问题。b/123307342
版本 1.0.0-alpha10
2019 年 1 月 23 日
已知问题
- Safe Args 无法导入与全局操作相关联的 Directions 类。b/123307342
此版本包含重大 API 变更;请参阅下面的“重大变更”部分。
新功能
- Kotlin 用户现在可以使用
by navArgs()属性委托来延迟获取对Activity或Fragment中由 Safe Args 生成的NavArgs类的引用。b/122603367 - Safe Args 现在允许您通过应用
androidx.navigation.safeargs.kotlin插件来生成 Kotlin 代码。Kotlin 代码专为 Kotlin 独有的模块而构建,使用的是默认参数和不可变类,而不是仍可通过之前的androidx.navigation.safeargs插件使用的构建器模式。b/110263087
行为变更
- 匹配深层链接现在偏向具有最匹配参数的深层链接。b/118393029
- 在
NavController上调用setGraph()现在会重置返回堆栈。b/111450672 - 未知的深层链接不再抛出
IllegalStateException,而是会被忽略,从而修复了嵌套或多个NavHostFragment的问题。b/121340440
重大变更
- 用于将弹出动画应用于 Activity 的
NavOptions.applyPopAnimationsToPendingTransition()方法已移至ActivityNavigator。b/122413117 - Safe Args 现在可以避免为没有参数的操作复制相同的类。生成的 NavDirections 类中无参数方法的返回类型现在为
NavDirections。b/123233147 - Safe Args 生成的 Directions 类不再具有公共构造函数 - 您只应与生成的静态方法进行互动。b/123031660
- Safe Args 生成的
NavDirections类不再具有公共构造函数 - 它们只能通过生成的 Directions 类中的静态方法生成。b/122963206 - 从
NavDirections的getArguments()返回的Bundle现在标记为@NonNull,而不是@Nullable。b/123243957
bug 修复
NavDeepLinkBuilder现在可以使用您传入的参数来确定唯一性,从而正确地将多个同时PendingIntent处理到同一目标。b/120042732- 将嵌套的
NavHostFragment或其他子 Fragment 与返回堆栈一起使用时,NavController现在可以正确处理popBackStack()操作。b/122770335 NavigationUI现在可以正确设置向上按钮的内容描述。b/120395362- Safe Args 生成的 Directions 类现在可以正确处理与目标上的操作具有相同 ID 的全局操作。b/122962504
- 当
equals()返回 true 时,Safe Args 生成的NavDirections类现在可以相应地具有相等的hashCode()值。b/123043662 - 如果尝试对
NavHostFragment的FragmentManager自定义FragmentTransactions,那么FragmentNavigator现在会发出一条更明确的错误消息。应该始终使用getChildFragmentManager()。b/112927148
版本 1.0.0-alpha09
2018 年 12 月 18 日
此版本包含重大 API 变更;请参阅下面的“重大变更”部分。
我们已选择不继续开发 android.arch.navigation:navigation-testing 制品。虽然经证实该制品对 NavController 的内部测试有帮助,但我们仍强烈建议使用其他测试策略,例如模拟 NavController 实例以验证是否已完成正确的 navigate() 调用。2018 年 Android 开发者峰会的 Single Activity 讲座对此方法做出了详细讨论,我们也将专门针对使用 Navigation 进行测试撰写其他文档。
新功能
- 与
NavigationUI方法一起使用时,menuCategory="secondary"的MenuItem将不再弹出返回堆栈。b/120104424 AppBarConfiguration现在允许您设置后备OnNavigateUpListener实例,当navController.navigateUp()返回false时,系统会调用此实例。b/79993862 b/120690961
重大变更
- 将
<argument>与argType="reference"一起使用时,Navigation 将不再解析引用,而是提供原始资源 ID。b/111736515 onNavDestinationSelected()现在默认弹回到导航图表的起始目标,使其与setup方法保持一致。您可以将menuCategory="secondary"添加到MenuItem来避免弹出返回堆栈。aosp/852869- 生成的
Args类的fromBundle()方法现在接受非 nullBundle,而不是可为 null 的Bundleaosp/845616
bug 修复
- 参数现在可以从深层链接中正确解析为正确的
argType,而非始终解析为字符串 b/110273284 - Navigation 现在可以正确导出其公开资源 b/121059552
- Safe Args 现在可与 Android Gradle 插件 3.4 Canary 4 版及更高版本兼容 b/119662045
版本 1.0.0-alpha08
2018 年 12 月 6 日
此版本包含重大 API 变更;请参阅下面的“重大变更”部分。
新功能
- 当目标标签与
NavigationUI方法一起使用时,系统现在会自动将android:label中的{argName}实例替换为正确的参数 b/80267266 - Navigation 现在依赖于支持库 28.0.0 b/120293333
重大变更
OnNavigatedListener已重命名为OnDestinationChangedListenerb/118670572OnDestinationChangedListener现在也传递参数的Bundleaosp/837142- 移除了
app:clearTask和app:launchDocument属性及其关联的方法。使用app:popUpTo与图表的根目录从返回堆栈中移除所有目标。b/119628354 ActivityNavigator.Extras现在使用Builder模式,并添加了设置任何Intent.FLAG_ACTIVITY_标记的功能 aosp/828140NavController.onHandleDeepLink已重命名为handleDeepLinkaosp/836063- 许多不适合子类化的类和方法(如
NavOptions、NavInflater、NavDeepLinkBuilder和AppBarConfiguration)已设为finalaosp/835681 - 移除了废弃的
NavHostFragment.setGraph()方法 aosp/835684 - 移除了废弃的
NavigationUI.navigateUp(DrawerLayout, NavController)方法。aosp/835684 - 将 Fragment 创建工作移到了
FragmentNavigator,从而可以更轻松地将 Fragment 创建工作委托给FragmentFactory。b/119054429 NavGraphNavigator的构造函数不再接受Contextaosp/835340- NavigatorProvider 现在是一个类,而不是一个接口。由
getNavigatorProvider()返回的NavigatorProvider没有改变其功能。aosp/830660 - 移除了
NavDestination.navigate()。改为在Navigator上调用navigate()。aosp/830663 - 对
Navigator进行了重大重构,不再需要OnNavigatorNavigatedListener,而是让navigate返回已导航到的NavDestination。 Navigator实例无法再向NavController发送弹出事件。考虑使用OnBackPressedCallback来拦截按下返回按钮的操作并调用navController.popBackStack()。aosp/833716
bug 修复
- 当目标是
<navigation>元素时,popUpTo现在可以一致地工作 b/116831650 - 修复了在使用嵌套图表时导致出现
IllegalArgumentException的一些错误 b/118713731 b/113611083 b/113346925 b/113305559 <activity>目标的dataPattern属性现在将通过调用toString()来填充非字符串参数中的参数 b/120161365
Safe Args
- Safe Args 支持可序列化对象,包括枚举值。枚举类型可以使用不带类名的枚举文字来设置默认值(例如
app:defaultValue="READ")b/111316353 - Safe Args 支持所有受支持类型的数组 b/111487504
- Safe Args 现在会忽略资源目录的子文件夹 b/117893516
- Safe Args 会视情况添加
@Override注释 b/117145301
版本 1.0.0-alpha07
2018 年 10 月 29 日
新功能
- 通过新的 AppBarConfiguration 类,您可以自定义将哪些目标视为顶级目标。如需了解详情,请参阅更新的文档。b/117333663
- 您现在可以将参数传递给图表的起始目标 b/110300470
- 深层链接现在支持带有句点、连字符和加号的自定义架构。b/112806402
重大变更
- 将
navigation-testing-ktx模块放入了navigation-testing artifact,该模块将不再发布。 navigation-testing制品现在依赖于 Kotlin 标准库。API 已被更改以与 Kotlin 惯例更加一致,但您可以继续将其用于采用 Java 语言编写的测试。- 不再支持元数据清单注册的导航图表。b/118355937
- 操作不能再附加到 <activity> 目标。aosp/785539
bug 修复
- 深层链接现在可以正确解析查询参数。b/110057514
- Activity 目标现在可以正确应用所有进场动画和退出动画。b/117145284
- 修复了使用自定义导航器时在配置更改后发生崩溃的问题。b/110763345
Safe Args
- Safe args 现在固定依赖于 Android Gradle 插件 3.2.1。b/113167627
- 现在可以为内部类生成方向。b/117407555
- 修复了与生成 <include> 图表的方向有关的问题。b/116542123
版本 1.0.0-alpha06
2018 年 9 月 20 日
新功能
- 现在支持 Fragment 和 Activity 目标的共享元素转换 b/79665225。如需了解详情,请参阅使用导航架构组件实现导航。
- 如果在
NavigationView中选择某项内容,现在将关闭任何包含的底部工作表 b/112158843
API 变更
- 重大变更:导航器
navigate()方法现在接受Navigator.Extras参数。 - NavController 的
getGraph()方法现在为NonNullb/112243286
bug 修复
- 与来自各个目标的视图一起使用时,
NavigationUI.setupWithNavController()不再泄露视图 b/111961977 - 现在仅调用一次导航器
onSaveState()b/112627079
Safe Args
- 导航目标 Directions 类现在会扩展其父级的 Directions 类(如果存在)b/79871405
- Directions 和 Args 类现在具有实用的
toString()实现 b/111843389
版本 1.0.0-alpha05
2018 年 8 月 10 日
bug 修复
- 修复了导致返回堆栈行为不正确的 bug。b/111907708
- 修复了生成的 Args 类的
equals()中的 bug。b/111450897 - 修复了 Safe Args 中的构建错误。b/109409713
- 修复了从资源标识符到 java 名称的转换问题。b/111602491
- 修复了 Safe Args 插件中有关为空性的错误消息。
- 添加了缺少的可为 null 性注解。
版本 1.0.0-alpha04
2018 年 7 月 19 日
Navigation 1.0.0-alpha04 和关联的 Safe Args Gradle 插件包含多项 API 变更、行为变更和 bug 修复。
API/行为变更
- NavHostFragment 会始终将当前的 Fragment 设置为主要导航 Fragment,从而确保在弹出外部 NavController 之前弹出子 Fragment 管理器 b/111345778
Safe Args
- 重大变更:将
app:type更改为app:argType,以避免与其他库(如 ConstraintLayout 2.0.0-alpha1)发生冲突 b/111110548 - 来自 Safe Args 的错误消息现在可供点击 b/111534438
- Args 类现在确认
NonNull属性实际上不是 null b/111451769 - 向 NavDirections 和 Args 生成的类添加了额外的
NonNull注释 b/111455455 b/111455456
bug 修复
- 修复了深层链接到 fragment 目标后系统返回按钮的问题 b/111515685
版本 1.0.0-alpha03
2018 年 7 月 12 日
Navigation 1.0.0-alpha03 和关联的 Safe Args Gradle 插件包含多项 API 变更、行为变更和 bug 修复。
API/行为变更
- 为工具栏添加了 NavigationUI.setupWithNavController 方法 b/109868820
- 为 CollapsingToolbarLayout 添加了 NavigationUI.setupWithNavController 方法 b/110887183
- 当返回堆栈为空或给定的目标 ID 不在返回堆栈中时,popBackStack() 现在返回 false b/110893637
- FragmentNavigator 现在会在 FragmentManager 保存状态后忽略导航操作,从而避免出现“在 onSaveInstanceState 后无法执行此操作”异常 b/110987825
Safe Args
- 重大变更:操作和参数名称中的非字母数字字符将替换为各自 NavDirections 方法名称中的驼峰式大小写格式
- 例如,
DemoController.index将变为setDemoControllerIndexb/79995048 - 例如,
action_show_settings将变为actionShowSettingsb/79642240
- 例如,
- 重大变更:默认情况下,现在将参数视为非 null。要允许字符串和 Parcelable 参数具有 null 值,请添加
app:nullable="true"b/79642307 - 您现在可以采用“123L”的形式对默认值使用
app:type="long"b/79563966 - 现在支持 Parcelable 参数,并使用
app:type的完全限定类名。支持的唯一一个默认值是"@null"b/79563966 - Args 类现在可实现
equals()和hashCode()b/79642246 - Safe Args 插件现在可以应用于库项目 b/80036553
- Safe Args 插件现在可以应用于功能项目 b/110011752
bug 修复
- 修复了在 Fragment 生命周期方法期间导航时出现的问题 b/109916080
- 修复了在多次导航嵌套图表时出现的问题 b/110178671
- 修复了在将
setPopUpTo与图表中的第一个目标一起使用时出现的问题 b/109909461 - 修复了将所有
app:defaultValue值作为字符串传递的问题 b/110710788 - 与 Android Gradle 插件 3.2 Beta 01 捆绑在一起的 aapt2 现在为 Navigation XML 文件中的每个
android:name属性添加了保留规则 b/79874119 - 修复了在更换默认 FragmentNavigator 时出现的内存泄露问题 b/110900142
版本 1.0.0-alpha02
2018 年 6 月 7 日
行为变更
FragmentNavigator现在使用setReorderingAllowed(true)。b/109826220Navigation 现在对从深层链接网址解析的参数执行 URLDecode 操作。b/79982454
bug 修复
修复了在从 Fragment 生命周期方法调用 Navigation 时出现的
IllegalStateException。b/79632233Navigation 现在依赖于支持库 27.1.1 来修复使用动画时的闪烁问题。b/80160903
修复了在使用 defaultNavHost="true" 作为子 fragment 时出现的
IllegalArgumentException。b/79656847修复了在使用 NavDeepLinkBuilder 时出现的
StackOverflowError。b/109653065修复了在导航回嵌套图表时出现的
IllegalArgumentException。b/80453447修复了在使用
launchSingleTop时 Fragment 重叠的问题。b/79407969Navigation 现在可以为嵌套图表构建正确的合成返回堆栈。b/79734195
使用嵌套图表作为
MenuItem时,NavigationUI 现在会突出显示正确的项。b/109675998
API 变更
废弃了操作的
clearTask属性以及NavOptions中的关联 API。b/80338878废弃了操作的
launchDocument属性以及NavOptions中的关联 API。b/109806636
版本 1.0.0-alpha01
2018 年 5 月 8 日
Navigation 可以提供用于构建应用内导航的框架。此初始版本为 1.0.0-alpha01。