导航
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 年 5 月 7 日 | 2.9.0 | - | - | - |
声明依赖项
要添加对 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.0" // 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.0" // 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.0" classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version" } }
Kotlin
buildscript { repositories { google() } dependencies { val nav_version = "2.9.0" 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") }
您必须在您的 gradle.properties
文件中设置 android.useAndroidX=true
,如迁移到 AndroidX 中所述。
有关使用 Kotlin 扩展的信息,请参阅 ktx 文档。
有关依赖项的更多信息,请参阅添加构建依赖项。
反馈
您的反馈有助于改进 Jetpack。如果您发现新问题或有改进此库的想法,请告诉我们。在创建新问题之前,请查看此库中的现有问题。您可以通过点击星形按钮为您已发现的问题投票。
有关更多信息,请参阅问题跟踪器文档。
版本 2.9
版本 2.9.0
2025 年 5 月 7 日
androidx.navigation:navigation-*:2.9.0
已发布。版本 2.9.0 包含这些提交。
自 2.8.0 以来的重要更改
- Navigation Safe Args 动作现在通过
@CheckResult
注解生成,以确保它们被使用。
SupportingPane 接口
- 自定义导航器现在可以将其目标标记为实现
SupportingPane
接口,这向NavController
指示这些目标将与其他目标一起显示。例如,通过使用此接口,可以同时RESUMED
多个目标。
Compose Kotlin Multiplatform
- 导航现在提供了一个新的通用
NavController.handleDeepLink()
函数,该函数接受NavDeepLinkRequest
而不是Intent
。这允许 Android 以外的平台正确处理深层链接。感谢 Konstantin Tskhovrebov! - 导航现在提供
NavUri
,这是一个新的通用解析器函数,它是 Android URI 在其他平台上的兼容 API。这使得以平台无关的方式创建 URI 成为可能。感谢 Konstantin Tskhovrebov!
类型安全函数
- 以前只能通过
reified
方法(即composable<YourScreen>
)访问的类型安全 API 现在具有直接接受KClass
实例的非 reified 版本。 - 导航类型安全现在支持值类作为路由或路由的参数类型。
版本 2.9.0-rc01
2025 年 4 月 23 日
androidx.navigation:navigation-*:2.9.0-rc01
已发布。版本 2.9.0-rc01 包含这些提交。
错误修复
- 移除了 Jetpack Navigation 中所有非 Android 平台目标,因为这些目标实际上不起作用。现在提供了不同平台的存根。( I2877d )
版本 2.9.0-beta01
2025 年 4 月 9 日
androidx.navigation:navigation-*:2.9.0-beta01
已发布。版本 2.9.0-beta01 包含这些提交。
API 变更
- 通用 API
parseStringAsNavUri
已更改为接受 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 )NavType
现在除了 Android 外,还支持桌面、Linux、macOS 和 iOS。( I297d8 )
版本 2.9.0-alpha08
2025 年 3 月 12 日
androidx.navigation:navigation-*:2.9.0-alpha08
已发布。版本 2.9.0-alpha08 包含这些提交。
错误修复
- 自导航
2.8.9
起:修复了在导航 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 包含这些提交。
错误修复
- 修复了尝试使用非包含式 pop
saveState
时导致空保存状态可能导致恢复崩溃的问题。( I9f3e8 , b/395091644 ) - 自导航 2.8.8起:
NavDeepLink
匹配已修复,其中深层链接和深层链接请求必须在 URI、操作和 MIME 上精确匹配。如果仅一个或两个字段匹配,则不再允许匹配。( I3b029 , b/395712033 ) - 自导航 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 包含这些提交。
新功能
- Navigation Safe Args 操作现在通过
@CheckResult
注解生成,以确保它们被使用。( I14d4c , b/356323084 )
错误修复
- 修复了
NavController
中的一个错误,当 backStack 状态保存为列表时,错误地尝试将其恢复到数组中。( Idfb9b ) - 自导航
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 包含这些提交。
错误修复
- 修复了使用 Navigation Compose 时导致意外缩放动画的问题。( I480f4 , b/353294030 )
- 自导航
2.8.6
起:通过 XML 提供的NavDestination
标签将通过NavType.get
进行解析,以确保遵循自定义NavType
逻辑。( I7ec2f , b/388100796 ) - 自导航
2.8.6
起:当导航到带有dataPattern
的 activity 时,ActivityNavigator
现在将尝试使用参数的NavType
对参数值进行编码。( I16376 , b/383616432 ) - 自导航
2.8.5
起:修复了使用 Navigation Compose 并在当前动画结束的同一帧中调用导航时导致意外缩放动画的问题。( I26cb1 , b/353294030 )
版本 2.9.0-alpha04
2024 年 12 月 11 日
androidx.navigation:navigation-*:2.9.0-alpha04
已发布。版本 2.9.0-alpha04 包含这些提交。
新功能
- 以前只能通过
reified
方法(即composable<YourScreen>
)访问的类型安全 API 现在具有直接接受KClass
实例的非 reified 版本。( Ia7eed , Id2879 , Ibf244 , I17d79 , Id09d2 , I54696 , Ia47be , I93281 , Ic1bf0 , Iba4ee , If56a5 , Icf969 , I67644 , I6f788 , b/382094941 , b/366291612 , b/381938808 )
下表提供了 reified 和 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 )
错误修复
- 自导航
2.8.5
起:修复了当回栈被弹出到 1 个条目且系统返回在同一帧中触发时,NavHost
可能在PredictiveBackHandler
内部抛出异常的问题。( I1a429 , b/375343407 ) - 自导航
2.8.5
起:修复了更新图的startDestination
时NavDestination
NullPointerException
。( I99421 , b/361560785 )
外部贡献
- 自导航
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 包含这些提交。
新功能
- 导航类型安全现在支持值类作为路由或路由的参数类型。( I9344a , b/374347483 )
错误修复
- 修复了当附加到
NavBackStackEntry
的LifecycleObserver
在包含的 Activity 或 Fragment 等宿主LifecycleOwner
更改其生命周期状态时触发回栈更改时可能发生的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 包含这些提交。
新功能
- 自定义导航器现在可以将其目标标记为实现
SupportingPane
接口,这向NavController
指示这些目标将与其他目标一起显示。例如,通过使用此接口,可以同时RESUMED
多个目标。( Id5559 ) - 自导航
2.8.3
起:为navigation-common
、navigation-runtime
和navigation-compose
模块添加了新的 lint 检查,以帮助识别任何未正确使用@Serializable
注解的类型安全路由。此检查适用于所有NavGraphBuilder
和NavDeepLinkBuilder
扩展函数。( I4a259 , I95402 , Ie601a , Id8c6e , I28bda , b/362725816 ) - 自导航
2.8.3
起:为navigation-common
、navigation-runtime
和navigation-compose
模块添加了新的 lint 检查,以帮助识别任何包含 Enum 参数且未正确使用@Keep
注解的类型安全路由。此检查适用于所有NavGraphBuilder
和NavDeepLinkBuilder
扩展函数。( I4a259 , I95402 , Ie601a , Id8c6e , I2b46f , b/358687142 )
行为变更
- 尝试使用以前
DESTROYED
的NavController
现在将导致IllegalStateException
。( I520da , b/369616172 )
错误修复
- 更新未找到 Enum 类异常,建议在混淆构建中 Enum 类被擦除时使用
@Keep
注解。( I90e79 , b/358137294 )
已知问题
- 在
Navigation 2.8.*
中添加的新 lint 规则存在一个问题,在尝试使用 Android Gradle Plugin 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 包含这些提交。
错误修复
- 修复了在导航 2.8.8 中发现的一个回归问题,该问题要求深层链接必须与深层链接请求或 intent 的所有字段精确匹配才能被视为匹配。这导致包含部分字段匹配而没有其他字段的深层链接不再起作用。( Ie5e36 , b/399826566 )
版本 2.8.8
2025 年 2 月 26 日
androidx.navigation:navigation-*:2.8.8
已发布。版本 2.8.8 包含这些提交。
错误修复
- 修复了带有通配符路径的路由与添加的深层链接不匹配的 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 包含这些提交。
错误修复
- Navigation Safe Args 现在提供对可组合目标的支持。( I35320 , b/362791955 )
版本 2.8.6
2025 年 1 月 29 日
androidx.navigation:navigation-*:2.8.6
已发布。版本 2.8.6 包含这些提交。
错误修复
- 通过 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 包含这些提交。
错误修复
- 修复了当回栈被弹出到 1 个条目且系统返回在同一帧中触发时,
NavHost
可能在PredictiveBackHandler
内部抛出异常的问题。( I1a429 , b/375343407 ) - 修复了更新图的
startDestination
时NavDestination
NullPointerException
。( I99421 , b/361560785 ) - 修复了使用 Navigation Compose 并在当前动画结束的同一帧中调用导航时导致意外缩放动画的问题。( I26cb1 , b/353294030 )
- 修复了当附加到
NavBackStackEntry
的LifecycleObserver
在包含的 Activity 或 Fragment 等宿主LifecycleOwner
更改其生命周期状态时触发回栈更改时可能发生的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 包含这些提交。
新功能
- 自导航
2.9.0-alpha03
起:导航类型安全现在支持值类作为路由或路由的参数类型 ( I9344a , b/374347483 )
错误修复
- 自导航
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 检查,以帮助识别任何包含 Enum 参数且未正确使用@Keep
注解的类型安全路由。此检查适用于所有NavGraphBuilder
和NavDeepLinkBuilder
扩展函数。( I4a259 , I95402 , Ie601a , Id8c6e , I2b46f , b/358687142 )
错误修复
- 修复了在
Navigation 2.8.*
中添加的新 lint 规则导致在尝试使用 Android Gradle Plugin 8.4+ 运行 lint 时出现Obsolete custom lint check
错误的问题。( I1be3d , b/368070326 , b/371463741 )
已知问题
- 当尝试使用 Lint 16 (AGP 8.7) 或更高版本运行 lint 时,导航 lint 将抛出 Obsolete custom lint check 错误。( 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>?
的可序列化类,而无需任何自定义NavType
。( I570eb , Ibc4c0 , I37461 , I5bed4 , b/359245753 )
错误修复
- 改进了导航未能将路由参数映射到
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 )
错误修复
- 导航现在要求传递给
NavGraph
的startDestination
的路由包含所有必需参数的值,包括不可为空且没有默认值的参数。( I18e74 , b/362594265 ) - Navigation safe args 现在增加了对不可为空字符串的支持,使得“null”值将被解析并按原样存储到捆绑包中。这与现有的行为不同,在现有行为中,“null”值被解析为空对象。此更改仅适用于不可为空的 String 类型。可空字符串保持不变。( I08b4a , b/348936238 )
- 除了通过明确添加到目标的深层链接外,
NavDestination
不能再通过深层链接进入。这也意味着您只能使用接受字符串路由的导航函数重载导航到目标的路由。这修复了一个可能导致深层链接到潜在受保护目标的漏洞。( 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 类型安全
- 导航现在使用 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 meets Type Safety 博客文章。
Navigation Compose 预测性返回
- Navigation Compose 现在通过 compose-animation 中的新
SeekableTransitionState
API 支持预测性应用内返回。这允许您使用返回手势查看上一个目标并进行自定义过渡,然后决定是通过完成手势提交事务还是取消。
Navigation Fragment 可组合
- 添加了一个新的
navigation-fragment-compose
工件,其中包含NavHostFragment
的ComposableNavHostFragment
替代方案,允许您将可组合目标添加到您的 Navigation XML 文件中。每个composable
目标必须表示为顶级、无参数的@Composable
方法,其完全限定名用作每个目标上的android:name
属性。当导航到其中一个目标时,将创建一个包含片段来显示可组合内容。
// 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。
- 导航现在提供了一个新的
CollectionNavType<T>
类,它是NavType<T>
的子类,用于基于集合的参数,例如列表、数组、映射。所有默认的NavType
数组(IntArrayType
、LongArrayType
、FloatArrayType
、BoolArrayType
和StringArrayType
)现在都继承自这个新类。 NavType
现在内置支持 Int、String、Boolean、Float 和 Long 列表。
版本 2.8.0-rc01
2024 年 8 月 21 日
androidx.navigation:navigation-*:2.8.0-rc01
已发布。版本 2.8.0-rc01 包含这些提交。
错误修复
- 修复了将顶级枚举类作为类型安全参数传入时导航崩溃的问题。( I0ba76 , b/358137294 )
- 导航 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,仅支持开箱即用的嵌套在另一个类中的枚举。顶级枚举将在下个版本中支持。
错误修复
- 当导航到重复或共享的目标时,导航将优先从图中当前位置导航到最近匹配的目标。( Ic89a4 , b/352006850 )
- safe args 中的导航现在添加了一个新的
NavType.EnumType
。这意味着Enum
类型不再需要自定义NavType
。请注意,Enum
的SerialName
必须是默认的完全限定名。( I66d22 , b/346475493 ) - safe args 中的导航已添加对可空参数类型的内置支持,包括
Int?
、Long?
、Float?
、Boolean?
和Enum<*>?
。( I32d13 ,I1c580 ,Ifba66 ,I978b0 ,Ide076 , b/351994237 ) NavGraph
的startDestination
现在将使用默认参数值,如果传递给NavGraph
的startDestination
路由完全等于startDestination.route
。( I13762 , b/354046047 )
版本 2.8.0-beta06
2024 年 7 月 24 日
androidx.navigation:navigation-*:2.8.0-beta06
已发布。版本 2.8.0-beta06 包含这些提交。
错误修复
- 修复了
WrongStartDestinationType
lint 检查未检查传入类类型上的伴生对象的问题,导致 lint 无法检测到错误。( I92b09 )
版本 2.8.0-beta05
2024 年 7 月 10 日
androidx.navigation:navigation-*:2.8.0-beta05
已发布。版本 2.8.0-beta05 包含这些提交。
错误修复
- 修复了当嵌套的
NavGraphs
共享相同的startDestination
路由时,singleTop
导航崩溃的问题。( I17b94 , b/294408596 )
版本 2.8.0-beta04
2024 年 6 月 26 日
androidx.navigation:navigation-*:2.8.0-beta04
已发布。版本 2.8.0-beta04 包含这些提交。
错误修复
- 导航现在支持在路径参数中使用空字符串进行导航。( Ic5dbd , b/339481310 )
- 改进了直接在类字段上通过
@Serializable(with =...)
声明自定义序列化器时的错误消息,以阐明这目前是不支持的功能。( I052b0 , b/341319151 ) SavedStateHandleFactory
测试 API 现在可以在非 Android 测试中使用,但需要 Robolectric 支持使用 Bundles 进行参数解析。( 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 )
错误修复
- 添加了关于
NavType.serializeAsValue
和serializeAsValues
的文档,以强调最终输出应该进行 URI 编码。( Ida6bd , b/344943214 ) - 修复了使用空
CollectionNavType
参数调用toRoute<T>
时崩溃的问题。当使用空CollectionNavType
导航时,输出参数将是您的 Serializable 类上声明的默认值,或者如果没有默认值,则为emptyCollection()
的返回值。( I84158 , Id630f , b/342672856 )
版本 2.8.0-beta02
2024 年 5 月 29 日
androidx.navigation:navigation-*:2.8.0-beta02
已发布。版本 2.8.0-beta02 包含这些提交。
错误修复
- 修复了使用可空自定义
NavType
时使用NavBackStackEntry.toRoute
导致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 可序列化对象创建SavedStateHandle
。( Id4867 , b/339080702 )
错误修复
- 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 meets Type Safety 博客文章。
新功能
navigation-fragment-compose
工件现在为ComposableFragment
内的可组合方法提供了LocalFragment
组合局部变量。( If35e5 )NavType
现在内置支持 Int、String、Boolean、Float 和 Long 列表。( 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
替代方案,允许您将composable
目标添加到您的 Navigation XML 文件中。每个composable
目标必须表示为顶级、无参数的@Composable
方法,其完全限定名用作每个目标上的android:name
属性。当导航到其中一个目标时,将创建一个包含片段来显示可组合内容。( 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 中基于 Kotlin 序列化的 Safe Args 支持已开始。这些 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 )
错误修复
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
。这也适用于嵌套的NavGraph
startDestinations
。( I0e0b5 , b/109505019 , b/188693139 )
API 变更
- 添加了新的抽象
CollectionNavType<T>
类,它是NavType<T>
的子类,用于基于集合的参数,例如列表、数组、映射。( Ic6d63 , b/188693139 ) - 所有默认的
NavType
数组(IntArrayType
、LongArrayType
、FloatArrayType
、BoolArrayType
和StringArrayType
)现在都是CollectionNavType
类型。( Idcf79 , b/188693139 ) NavType
现在提供了一个新的开放valueEquals
API,用于确定两个相同类型的值是否相等。( I6cb97 , b/327229511 )
错误修复
- 深层链接中的查询参数现在允许将花括号包围的参数名称(例如
{argName}
)形式的值作为基于字符串的NavTypes
的有效值。这修复了以前这种值对所有类型都被视为无效(或缺少值)的问题。( I18302 , b/327274038 ) - 支持路由的
NavController
函数(例如navigate
或popBackStack
)现在可以正确匹配填充了 ArrayNavTypes
参数的路由。( Iea805 , b/327229511 )
版本 2.8.0-alpha04
2024 年 3 月 6 日
androidx.navigation:navigation-*:2.8.0-alpha04
已发布。版本 2.8.0-alpha04 包含这些提交。
新功能
- 您现在可以通过在
composable
和/或navigation
函数的初始化中定义SizeTranform
来为 Navigation Compose 中的过渡指定它。( I91062 , b/296912651 )
错误修复
- 修复了 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 )
错误修复
- 修复了导航中的一个问题,该问题导致
NavGraph
ViewModels 过早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 中的新
SeekableTransitionState
API 支持预测性应用内返回。这允许您使用返回手势查看上一个目标并进行自定义过渡,然后决定是通过完成手势提交事务还是取消。( I8b8e9 )
版本 2.8.0-alpha01
2024 年 1 月 24 日
androidx.navigation:navigation-*:2.8.0-alpha01
已发布。版本 2.8.0-alpha01 包含这些提交。
错误修复
- 修复了
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 包含这些提交。
错误修复
- 从 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 包含这些提交。
错误修复
NavGraph
的equals()
函数现在正确考虑了其他图的节点,而不仅仅是调用图的节点。这将确保具有不同 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)
错误修复
- 修复了仅当图中包含链接两个目的地的操作时,如果多次使用完全相同的图调用
setGraph
,您的返回堆栈将被弹出的问题。(Ieaed7) - 快速导航到并关闭的对话框将不再泄露到
NavController.visibleEntries
列表中。(I67586, b/287969970) - 当条目弹出后发生配置更改时,如果
saveState
为 false,条目的ViewModel
现在将正确清除。(Idf242, b/298164648) - 修复了在配置更改或调用
setGraph
之前返回堆栈完全为空时,如果传入的 Intent 设置了FLAG_ACTIVITY_NEW_TASK
标志,NavController
可能会多次处理相同深层链接的问题。(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)
错误修复
- 修复了在使用
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 包含这些提交。
错误修复
- 修复了使用 Fragment 的 Navigation 中导致
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 包含这些提交。
错误修复
- 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 包含这些提交。
错误修复
- 修复了使用 Compose 的 Navigation 中可能导致在尝试访问
Lifecycle.State.DESTROYED
ViewModel
时出现错误的问题。(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)
错误修复
- 即使在 Activity 停止并恢复后,Navigation Compose 中的 NavHost 现在也能正确拦截系统返回调用。(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 包含这些提交。
错误修复
- 修复了作为
NavHost
一部分创建的EnterTransition
和ExitTransition
lambda 即使在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 包含这些提交。
错误修复
- Navigation Compose 现在为使用
popUpTo
选项的自定义过渡提供了正确的 Z 轴顺序。(/Ib1c3a, b/285153947)
版本 2.7.0-beta01
2023 年 6 月 7 日
androidx.navigation:navigation-*:2.7.0-beta01
已发布。版本 2.7.0-beta01 包含这些提交。
错误修复
- 即使在
Activity
已经STOPPED
和RESUMED
后,Navigation Compose 中的NavHost
现在也能正确拦截系统返回调用。(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)
错误修复
- 从 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 以来的 Navigation 重要更改
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)
现在都支持部分或完全填充参数的路由。请注意,参数必须与条目的参数完全匹配。- 尝试使用
navDeepLink
Kotlin DSL 创建空NavDeepLink
现在将导致 lint 警告,指示深层链接需要 uri、action 和/或 mimetype 才能有效。
自 2.5.0 以来的 Navigation with Fragments 重要更改
NavHostFragment
不再自行拦截系统返回按钮。这允许底层FragmentManager
处理系统返回。这允许 Fragment1.7.0-alpha01
及更高版本在 Android U 设备上提供应用内预测性返回动画。- 当与 Fragments 一起使用 Navigation 时,尝试手动执行将 Fragment 添加到
FragmentManager
的返回堆栈的FragmentTransaction
现在将抛出IllegalArgumentException
。您应该始终通过navigate()
API 添加 Fragment。 - 在导航 XML 文件的活动元素中,当使用精确字符串
${applicationId}
作为app:data
和app:dataPattern
属性中的占位符时,该占位符将在膨胀时自动填充上下文的packageName
。 FragmentNavigator
现在在导航和弹出NavBackStackEntries
时使用过渡 API。这意味着NavBackStackEntry
Lifecycle
现在将等待进入和退出 Fragment 特殊效果完成,然后才将其最终Lifecycle.State
状态。DialogFragmentNavigator
现在在导航和弹出NavBackStackEntries
时使用过渡 API。这意味着NavBackStackEntry
Lifecycle
现在将等待DialogFragment
Lifecycle
移动到DESTROYED
,然后自身才移动到DESTROYED
。NavHostFragment
现在允许您在NavHostFragment
附加到FragmentManager
后立即检索NavController
,而不仅仅是在onCreate()
之后。- Navigation 对动态功能模块的支持现在依赖于细粒度的 Play Feature Delivery Library。
- Navigation Safe Args 现在依赖于 Android Gradle Plugin 版本 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 包含这些提交。
错误修复
- 修复了使用 Fragment 的 Navigation 中的一个问题,即使用
popUpTo
导航并从返回堆栈中弹出 Fragment 而不重新创建其视图会导致系统返回功能停止工作。(Ieb8d4, b/281726455)
版本 2.6.0-rc01
2023 年 5 月 10 日
androidx.navigation:navigation-*:2.6.0-rc01
已发布。版本 2.6.0-rc01 包含这些提交。
错误修复
- 修复了使用 Fragment 的 Navigation 中的一个问题,即在
onResume()
生命周期回调中使用popUpTo
导航移除 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)
错误修复
- 当与 Fragments 一起使用 Navigation 时,尝试手动执行将 Fragment 添加到
FragmentManager
的返回堆栈的FragmentTransaction
现在将抛出IllegalArgumentException
。您应该始终通过navigate()
API 添加 Fragment。(I6d38e) - 当存在一个添加条目的
navigate
和一个在同一帧中移除它的popBackStack
时,返回堆栈上的最终顶部条目现在将始终一致地返回到RESUMED
Lifecycle.State
。(Id8067, b/276495952)
版本 2.6.0-alpha09
2023 年 4 月 5 日
androidx.navigation:navigation-*:2.6.0-alpha09
已发布。版本 2.6.0-alpha09 包含这些提交。
错误修复
- 修复了无效路由的检查,以便如果
NavDestination
包含不可为空的NavArgument
,则此目标的路由必须包含与不可为空的NavArgument
相同名称的参数占位符。(Ic62bf, b/274697949) - 基于
Action/MimeType
的深层链接导航现在将失败,如果导航操作缺少与Action/MimeType
匹配的NavDestination
所需的不可为空的NavArgument
。(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)
错误修复
- 修复了弹出包含非空参数的嵌套图时发生的
NullPointerException
。(6b3581, b/249988437) - 在执行带有
popUpTo
的导航后使用系统返回时,NavController
的状态将弹出到正确的条目。(I3a8ec, b/270447657) FragmentNavigator
现在将在返回堆栈通过系统返回或popBackStack()
弹出时正确弹出条目,无论事务是否对片段使用效果。(I81bdf)- 不使用导航将片段添加到
FragmentNavigator
的FragmentManager
不再导致崩溃。(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 包含这些提交。
错误修复
- 接受路由的
getBackStackEntry
、popBackStack
、clearBackStack
API 变体现在接受带有可空参数和可空查询参数的路由模式。(I22294, b/269302500) - 修复了从
NavController
调用clearBackStack()
时不会清除与已清除返回堆栈关联的片段管理器中保存状态的问题。(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 变更
- 所有
NavController
navigate
重载现在都用@MainThread
注释,以确保它们在主线程上调用。(I2c0b0, b/263427111)
错误修复
- 修复了在使用动态片段导航时尝试导航导致的崩溃。(I3ee29, b/268360479)
- 修复了通过系统返回按钮导航到另一个片段时,底部栏未更新为正确选中项的错误。(If559f, b/269044426)
已知问题
- 当与 Fragments 一起使用 Navigation 时,如果使用
Animation
API,NavBackStackEntry
的生命周期无法达到RESUMED
状态。(b/269646882) - 当与 Fragments 一起使用 Navigation 并使用
BottomNavigation
导航时,如果尝试恢复包含多个条目的返回堆栈,BottomMenuItem
未正确更新。(b/270447657) - 当与 Fragments 一起使用 Navigation 时,恢复状态后,
NavBackStackEntry
Lifecycle
在其片段DESTROYED
时不会被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)FragmentNavigator
现在在导航和弹出NavBackStackEntries
时使用过渡 API。这意味着NavBackStackEntry
Lifecycle
现在将等待进入和退出 Fragment 特殊效果完成,然后才将其最终Lifecycle.State
状态。(I3cb19, b/238686802)DialogFragmentNavigator
现在在导航和弹出NavBackStackEntries
时使用过渡 API。这意味着NavBackStackEntry
Lifecycle
现在将等待DialogFragment
Lifecycle
移动到DESTROYED
,然后自身才移动到DESTROYED
。(I53ee5, b/261213893)
API 变更
NavigatorState
现在提供了prepareForTransition
API,允许Navigator
将NavBackStackEntries
移动到中间Lifecycle.State
。(I42c21, b/238686802)- 您现在可以通过
backstack
属性访问与NavGraphNavigator
或ComposeNavigator
关联的返回堆栈。ComposeNavigator
现在还公开了onTransitionComplete()
回调,以将已执行导航或popBackStack
操作的NavBackStackEntry
标记为完成。(I02062, I718db, b/257519195)
错误修复
- 当使用
push/popWithTransition
API 且条目已在处理中时,导航器状态现在将不执行任何操作。(Iadbfa, b/261213893) - 当使用
launchSingleTop
和嵌套的NavGraph
时,从原始目的地到其startDestination
的所有目的地都将仅正确添加到返回堆栈的顶部。(Id4bea, b/253256629) - 当导航到具有
launchSingleTop
标志设置为 true 的相同目的地时,Navigation 现在将正确替换DialogFragment
实例。(I45b5a, b/149572817) - Navigation SafeArgs 在使用长度恰好为 19 个字符的参数时,将不再导致编译错误。(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)
错误修复
- Navigation 深层链接现在是延迟解析的,而不是在图初始化时解析,这可以提高应用程序启动时的性能。(Iab0ab)
- 修复了深层链接到具有空默认参数的目的地后向上导航导致的崩溃。(I51c24, b/243183636)
依赖项更新
- Navigation 对动态功能模块的支持现在依赖于细粒度的 Play Feature Delivery Library。(Ib4ddc)
- Navigation Safe Args 现在依赖于 Android Gradle Plugin 版本 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 包含这些提交。
错误修复
- 从 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)
错误修复
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 文件的活动元素中,当使用精确字符串
${applicationId}
作为app:data
和app:dataPattern
属性中的占位符时,该占位符将在膨胀时自动填充上下文的packageName
。(Iaabde, b/234223561) - 尝试使用
navDeepLink
Kotlin 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)
错误修复
- 从 Navigation
2.5.2
向后移植:动态导航现在会在导航到其他模块中的活动目的地之前正确尝试安装它们。(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 包含这些提交。
错误修复
- 当没有可用于组合
Crossfade
的目的地时,NavHost
将不再导致NoSuchElementException
。现在它只会跳过组合。(Ieb46e, b/253299416) - 修复了当目的地从返回堆栈中弹出时,已保存的 Compose 状态(例如,
rememberSaveable
的用法)未被遗忘和移除的问题。(I64949)
版本 2.5.2
2022 年 9 月 7 日
androidx.navigation:navigation-*:2.5.2
已发布。版本 2.5.2 包含这些提交。
错误修复
- 动态导航现在会在导航到其他模块中的活动目的地之前正确尝试安装它们。(Ia2c16, b/240292838)
- 当导航到相同目的地并将
launchSingleTop
标志设置为 true 时,Navigation 现在将正确替换 Fragment 实例。(I5a2f1, b/237374580) - 修复了由于导航到与新弹出的起始目的地共享父级的双重嵌套图导致的
IllegalStateException
。(I9f7cb, b/243778589)
依赖项更新
- Navigation
2.5.2
现在依赖于 Fragment1.5.2
。(aosp/2178734)
版本 2.5.1
2022 年 7 月 27 日
androidx.navigation:navigation-*:2.5.1
已发布。版本 2.5.1 包含这些提交。
错误修复
Navigation Safe Args
在使用保存在Bundle
中的自定义参数类型时,将不再导致生成的类中出现弃用警告。(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 版本的兼容性。- 添加了对使用 namespace build.gradle 属性而不是 applicationId 的支持。
其他更改
visibleEntries
API 不再是实验性的,它提供了一个函数来检索NavController
当前可见的所有条目,其目标是当前可见的。
版本 2.5.0-rc02
2022 年 6 月 15 日
androidx.navigation:navigation-*:2.5.0-rc02
已发布。版本 2.5.0-rc02 包含这些提交。
错误修复
- 修复了在使用 Navigation Compose
NavHost
时,快速切换底部目的地导致的崩溃。(I3979a, b/234054916) Navigation SafeArgs
在使用applicationIdSuffix
和命名空间(没有applicationId
,或者applicationId
和命名空间不同)时将不再崩溃。(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
文件中的<activity>
元素内放置<deeplink>
元素。(Ic15a5, b/178403185)
错误修复
NavHost
和DialogHost
中的可组合范围现在按预期顺序处理,即内部可组合项在外部可组合项之前处理。(I157e6)- Navigation SafeArgs 现在在
ArgumentsGenerationTask
中使用PathSensitivity.RELATIVE
以允许缓存重定位。这意味着缓存条目现在可以从 CI 构建重用于本地构建。(I5f67c, b/173420454) UnrememberedGetBackStackEntryDetector
lint 规则已更新,以确保围绕getBackStackEntry()
调用的remember
调用也传递NavBackStackEntry
对象作为键。(Ib7081, b/227382831)
版本 2.5.0-beta01
2022 年 4 月 20 日
androidx.navigation:navigation-*:2.5.0-beta01
已发布。版本 2.5.0-beta01 包含这些提交。
错误修复
DialogNavigator
现在在执行dismiss()
调用时使用popWithTransition
。这修复了在使用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
不再是实验性的。(I4829f, b/225394514)
错误修复
- NavHost 现在依赖于
NavController
中的visibleEntries
来确定要组合的条目。这意味着当使用嵌套 NavHost 时,内部NavHost
现在应该正确地动画退出。(I4ba2b, b/225394514) NavController
提供的visibleEntries
StateFlow
现在基于条目最大生命周期状态而不是当前生命周期状态。这意味着即使navController
的宿主生命周期低于 STARTED,可见条目的列表也将保持不变。(I9e2a8, b/225394514)SavedStateViewFactory
现在支持使用CreationExtras
,即使它已使用SavedStateRegistryOwner
初始化。如果提供了 extras,则忽略已初始化的参数。(I6c43b, b/224844583)NavDeepLink
现在可以解析带有一个没有值的查询参数的 Uris。(I0efe8, b/148905489)- 空字符串现在被视为深层链接中的有效参数。(I70a0d, b/217399862)
Navigation Safe Args
在使用命名空间且不存在AndroidManifest.xml
时将不再崩溃。(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)
错误修复
NavDeepLinks
现在正确支持嵌入在路由/深层链接 URI 中的编码换行符。(I513d1, b/217815060)- 当与
NavBackStackEntries
一起使用CreationExtras
来创建 ViewModel 时,它现在将正常工作。(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 包含这些提交。
错误修复
- 从 Navigation
2.4.1
向后移植:当使用带有嵌套图的视图绑定时,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)
错误修复
- 修复了从 Fragment 的
onCreate()
访问通过by navGraphViewModels()
创建的ViewModel
会导致IllegalStateException
的问题。(I8a14d) NavDeepLink
不再不必要地解码参数两次,这意味着现在将正确解码的参数传递给您的最终目的地。(I31b0a, b/210711399)
Safe Args
- Safe Args 现在依赖于 Android Gradle Plugin 版本 7.0.4。这意味着 Navigation Safe Args 将不再兼容 Android Studio 7.0 之前的版本,但现在兼容 Android Gradle Plugin 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 包含这些提交。
错误修复
- 从 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
向后移植:Navigation Safe Args
在使用命名空间且不存在AndroidManifest.xml
时将不再崩溃。(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 包含这些提交。
错误修复
- 当使用带有嵌套图的视图绑定时,
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 Plugin 版本 7.0.4。这意味着 Navigation Safe Args 将不再兼容 Android Studio 7.0 之前的版本,但现在兼容 Android Gradle Plugin 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 Artifact 都已用 Kotlin 重写。这改善了使用泛型(例如
NavType
子类)的类的可空性。所有以前属于-ktx
Artifact 的 Kotlin 扩展函数都已移至其各自的主 Artifact。-ktx
Artifact 将继续发布,但完全为空。 navigation-fragment
Artifact 现在包含通过新的AbstractListDetailFragment
实现的预构建的双窗格布局。此片段使用SlidingPaneLayout
来管理列表窗格(由您的子类提供)和详细信息窗格,后者使用NavHostFragment
作为其实现,如我们的示例实现所示。NavController
上的currentBackStackEntryAsFlow()
方法提供了一个Flow
,该 Flow 在当前NavBackStackEntry
更改时发出。此 Flow 可以作为手动管理OnDestinationChangedListener
的替代方案。- NavController 现在通过实验性的
visibleEntries
属性提供了以StateFlow
形式检索所有可见NavBackStackEntry
实例的列表的功能。 - 现在可以扩展
NavType
类以创建自定义 NavTypes。自定义类型仅在以编程方式构建导航图时受支持,例如通过 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 上的
popUpTo
Kotlin 属性已弃用,取而代之的是popUpToId
。 - 已弃用
getStartDestination()
API,取而代之的是getStartDestinationId()
。
与通过 ID 导航不同,通过路由导航遵循与隐式深层链接相同的规则,您可以直接导航到任何嵌套图中的任何目的地,确保这些路由可以在多模块项目中使用,而无需显式地为每个目的地添加外部可见的深层链接。
Navigation Compose
navigation-compose
工件提供了Navigation Component和Jetpack Compose之间的集成。它使用 @Composable
函数作为应用程序中的目的地。
此版本提供
- 一个
NavHost
可组合项,允许您通过 Kotlin DSL 构建导航图,使用composable
和dialog
目的地,并支持可选的导航器,例如来自 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()
或触发系统返回按钮时将其移除。现有的 NavOptions
类和导航图 XML 中 <action>
元素的集成已扩展以支持保存和恢复返回堆栈。
作为此更改的一部分,NavigationUI
的 onNavDestinationSelected()
、BottomNavigationView.setupWithNavController()
和 NavigationView.setupWithNavController()
方法现在会自动保存和恢复弹出目的地的状态,从而无需任何代码更改即可支持多个返回堆栈。当 Navigation 与 Fragments 一起使用时,这是与多个返回堆栈集成推荐的方式。
保存和恢复状态的底层 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” />
在
navOptions
Kotlin 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
,并且现在将setGraph()
、popBackStack()
、navigateUp()
和navigate()
(更新NavBackStackEntry
Lifecycle
的方法)标记为@MainThread
,使 Navigation 与 Lifecycle2.3.0
中引入的主线程强制执行保持一致。 - 深层链接现在验证
Uri
中是否存在所有必需的参数(即没有默认值的参数)。 NavDeepLink
解析的参数现在将井号与问号一样视为路径段之间的分隔符,从而防止参数跨越井号。- 生成动作时,Safe Args 生成的 Kotlin 代码现在将没有默认值的参数放在有默认值的参数之前。
- 生成参数时,Safe Args 现在将没有默认值的参数放在有默认值的参数之前。
- Safe-Args 现在依赖于 Android Gradle Plugin 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 Plugin 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)
错误修复
- 深层链接将不再忽略值与占位符名称相同的参数。(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) - 修复了当 Navigation Compose 的
NavHost
与activity
目的地一起使用时,会导致无限重组的问题。(I8f64c) - 修复了 Navigation Compose 中的一个内存泄漏问题,即在配置更改或进程终止后,它会保留旧活动的引用。(I4efcb, b/204905432)
Safe Args Bug 修复
- SafeArgs 在进程终止后尝试恢复自定义 Parcelable 数组时不再崩溃。(I618e8, b/207315994)
- 修复了 Safe Args 中一个不允许布尔数组具有
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)
错误修复
- 修复了当
NavHost
直接添加到活动的setContent()
时,NavBackStackEntries 在移动到Lifecycle.State.STARTED
后被推到Lifecycle.State.CREATED
的问题。(Ia5ac1, b/203536683) - 修复了弹出
DialogFragment
目的地(在对话框实际显示之前)会导致对话框未实际关闭的竞态条件,从而导致用户手动关闭错误对话框时崩溃的问题。(I687e5) - 修复了
NavigationUI
上的onNavDestinationSelected
API 会返回true
的问题,即使您实际上没有navigate()
到该导航图。它现在使用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 与 Fragments 一起使用。(I901e3, b/201446416)
API 变更
visibleEntries
API 现在是实验性的。(I93f6f)
错误修复
- 当过渡被在同一屏幕之间来回导航中断时,ViewModels 将不再被销毁。(Id52d8, b/200817333)
- 当将深层链接添加到
NavDestination
时,可空NavDeepLink
参数不再需要默认值。(I5aad4, b/201320030) - 具有不同 Lifecycles 的 NavBackStackEntries 不再被视为相等。这意味着 NavHost 在使用 singleTop 导航和重新选择底部菜单项时将正确地重新组合所有目的地。(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 现在能够通过
visibleEntries
StateFlow 检索所有可见的NavBackStackEntry
实例列表。(Ia964e) rememberNavController()
现在接受一个可选的Navigator
实例集,这些实例将添加到返回的NavController
中,以更好地支持可选的导航器,例如来自 Accompanist Navigation Material 的导航器。(I4619e)
错误修复
- 动态导航在 Activity 重新创建时不再崩溃。(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 变更
navArgument
Kotlin DSL 函数现在是navigation-common
的一部分,而不是navigation-compose
。这将需要更新导入才能继续使用此函数。(I1d095)
行为变更
- 生成参数时,Safe Args 现在将没有默认值的参数放在有默认值的参数之前。(I89709, b/198493585)
错误修复
- 使用 Navigation Compose 时,NavGraphs 仅在其所有子级都被
DESTROYED
后才会被DESTROYED
。(I86552, b/198741720) - 可空
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
类以创建自定义 NavTypes。自定义类型仅在以编程方式构建导航图时受支持,例如通过 Navigation Graph Kotlin DSL。(I78440, b/196871885)
行为变更
- 生成动作时,Safe Args 生成的 Kotlin 代码现在将没有默认值的参数放在有默认值的参数之前。(Idb697, b/188855904)
- 深层链接现在验证
Uri
中是否存在所有必需的参数(即没有默认值的参数)。(#204, b/185527157)
错误修复
- 在 composable() 中使用
getBackStackEntry
和previousBackStackEntry
,并结合remember()
,将不再导致堆栈中没有目的地时出现异常。(I75138, b/194313238) - Navigation Compose 现在在更改返回堆栈参数并使用
launchSingleTop=true
时正确重新组合。(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 版本包含这些提交。
错误修复
- Navigation Compose 现在在配置更改和使用多返回堆栈功能更改图时正确保存状态。(If5a3d, b/195141957)
- 当使用 Navigation Compose 和多个返回堆栈时,重新选择同一个选项卡将不再导致空白屏幕。(I860dc, b/194925622)
NavHost
现在观察NavBackStackEntry
的Lifecycle.State
中的变化,这意味着在片段中使用NavHost
将在生命周期变化时正确地重新组合,而不是导致空白屏幕。(I4eb85, b/195864489)- 修复了关闭
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)
错误修复
- 弹出导航图的最后一个目的地不再抛出
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 的图。具有相同起始目的地和图中目的地的图将被视为相等,并且不会清除
NavController
返回堆栈。(I0b8db, b/175392262)
错误修复
- 修复了在附加到
NavBackStackEntry
的LifecycleObserver
中调用popBackStack()
时由于 NavController 状态的重入更新导致的NoSuchElementException
。(I64621) AbstractListDetailFragment
现在允许在不使用AbstractListDetailFragment
时,将SlidingPaneLayout
完全从您的 APK 中剥离。(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
包含一个双窗格布局的预构建实现。此片段使用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
和popWithTransition
API 来异步推送或弹出目的地。请注意,此 API 尚未被任何包含的导航器使用。(Ic4d7c, b/172112072)
行为变更
NavDeepLinkBuilder
现在将PendingIntent.FLAG_IMMUTABLE
添加到createPendingIntent()
返回的PendingIntent
,确保此 API 在面向 Android 12 时按预期工作。(If8c52)
错误修复
- 修复了
<include-dynamic>
的一个问题,该问题导致传递给图的参数未正确传递给动态包含的图。(I3e115) - 修复了导航到使用具有默认值
@null
的string[]
参数的目的地时出现的NullPointerException
。(I1fbe8) - 为
@Navigator.Name
添加 ProGuard 规则,修复在使用 R8 3.1 完整模式时出现的问题。(I2add9, b/191654433) - SafeArgs 在使用
Kotlin
1.5.0 之前的版本构建应用程序时不再失败。(Icd1ff, b/190739257)
版本 2.4.0-alpha03
2021 年 6 月 16 日
androidx.navigation:navigation-*:2.4.0-alpha03
已发布。2.4.0-alpha03 版本包含这些提交。
错误修复
- 修复了导航到包含的动态图时需要两次
navigate()
调用的问题。(I7785c, b/188859835) - 修复了 Navigation
2.4.0-alpha01
引入的一个回归问题,即setupActionBarWithNavController()
在您位于顶级目的地时无法正确移除向上图标。(I5d443, b/189868637) - 修复了在以前弹出 NavController 的根图后调用
popBackStack()
时出现的IllegalStateException
。(I2a330, b/190265699) by navArgs()
的 ProGuard 规则现在在使用navigation-common
或任何依赖它的工件时正确应用。(I68800, b/190082521)- 第一次接收回调时调用
navigate()
的OnDestinationChangedListener
现在可以正确获取第二个回调,其中包含其导航到的目的地。(Ie5f9e, b/190228815) - Safe Args 在与动态功能模块和 AGP 7.0+ 一起使用时不再崩溃。(I69518, b/189966576)
已知问题
- Safe Args 在使用 Gradle
6.7.0
时,由于依赖于旧版 Kotlin,将出现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,允许选择不保存状态。虽然始终保存状态是正确的行为,但仍有一些已弃用的库(即保留片段)无法在保存状态时得到支持,因此这为应用程序提供了逐步从任何不受支持的 API 转换的机会。(Idf93c)
Navigation 现在提供了
findDestination()
和getHierarchy()
API,可用于帮助实现自定义 NavigationUI。findDestination()
是NavGraph
上的扩展函数,用于在图中查找目的地。getHierarchy()
是NavDestination
上的函数,可用于验证给定目的地是否位于另一个目的地的层次结构中。(I2932f, b/188183365)val matchingRoute: Boolean = destination.hierarchy.any { it.route == routeToFind }
以前接受
BottomNavigationView
的 NavigationUI 方法已更新为接受 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)
错误修复
DialogFragmentNavigator
现在使用NavigatorState.pop()
API 通知NavController
何时通过点击系统返回按钮或点击对话框外部关闭对话框,确保NavController
状态始终与 Navigator 的状态同步。(I2ead9)Navigation 在使用
OnDestinationChangedListeners
列表进行操作时,不再从onDestinationChanged
回调中抛出ConcurrentModificationException
。(Ib1707, b/188860458)Safe Args 在尝试在 Kotlin 中生成方向属性时不再崩溃。(Id2416, b/188564435)
NavDestination 上的 setId 方法现在正确地用
@IdRes
注释,因此它只接受资源 ID。(I69b80)findNode
的 int 参数现在是resId
而不是resid
。(I7711d)
依赖项更新
- Safe-Args 现在依赖于 Android Gradle Plugin 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()
或触发系统返回按钮时将其移除。现有的 NavOptions
类和导航图 XML 中 <action>
条目的集成已扩展以支持保存和恢复返回堆栈。(b/80029773)
作为此更改的一部分,NavigationUI
的 onNavDestinationSelected()
、BottomNavigationView.setupWithNavController()
和 NavigationView.setupWithNavController()
方法现在会自动保存和恢复弹出目的地的状态,从而无需任何代码更改即可支持多个返回堆栈。当 Navigation 与 Fragments 一起使用时,这是与多个返回堆栈集成推荐的方式。(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” />
在
navOptions
Kotlin 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
和 Navigation with Fragments 中用于 <fragment>
目的地的 FragmentNavigator
和 DynamicFragmentNavigator
都已更新,以使用新的 Navigator API 并支持保存和恢复状态。
导航路由
路由是唯一标识目的地的 String
。虽然以前仅在 Navigation Compose 中使用,但此概念现已升级为核心 Navigation API 的一部分。这提供了通过 Navigation Kotlin DSL 构建图时使用整数 ID 的替代方案。(b/172823546)
所有以前只接受 ID 的 API 现在都有一个接受路由 String
的重载。这包括 navigate()
、popBackStack()
、popUpTo()
和 getBackStackEntry()
。
这带来了一些 API 影响
- Kotlin DSL 上的
popUpTo
kotlin 属性已弃用,取而代之的是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
子类)的类的可空性。所有以前属于-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
扩展,它将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
,并且现在将setGraph()
、popBackStack()
、navigateUp()
和navigate()
(更新NavBackStackEntry
Lifecycle
的方法)标记为@MainThread
,使 Navigation 与 Lifecycle2.3.0
中引入的主线程强制执行保持一致。(b/171125856) - 从深层链接解析 Enum 参数现在不区分大小写,允许像
http://www.example.com/red
这样的深层链接匹配www.example.com/{color}
深层链接,即使枚举的值为RED
。(#152, b/135857840)
Compose 兼容性
androidx.navigation:navigation-compose:2.4.0-alpha01
仅与 Compose 版本1.0.0-beta07
及更高版本兼容。
错误修复
- 修复了尾随参数占位符优先于具有匹配精确后缀的深层链接的问题。(#153, b/184072811)
NavHostFragment
现在支持使用与默认DialogFragmentNavigator
相同的@Navigator.Name("dialog")
的自定义 Navigators。(Ib1c2c, b/175979140)- 改进了
NavigatorProvider#addNavigator
的行为,以确保重复调用同一实例不会导致问题。(#176, b/187443146)
外部贡献
- 感谢 simonschiller 为 Safe Args 构建支持,为每个
NavArgs
类生成fromSavedStateHandle()
方法。(#122, b/136967621) - 感谢 Bradleycorn 使从深层链接解析 Enum 参数不区分大小写。(#152, b/135857840)
- 感谢 osipxd 修复了尾随参数占位符优先于具有匹配精确后缀的深层链接的问题。(#153, b/184072811)
- 感谢 tatocaster 更新 Safe Args 以依赖于 KotlinPoet
1.8.0
。(#172, b/183990444) - 感谢 jossiwolf 使
NamedNavArgument
的name
和argument
字段以及解构函数成为公共的。(#174, b/181320559) - 感谢 jossiwolf 引入了一个新的
NavBackStackEntry#provideToCompositionLocals
扩展,它将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)
错误修复
- 即使未找到
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
现在返回一个可空的ViewModelStoreOwner
,以更好地确定当前组合中是否存在ViewModelStoreOwner
。需要ViewModelStoreOwner
的 API(例如viewModel()
和NavHost
)在未设置ViewModelStoreOwner
时仍会抛出异常。(Idf39a)
错误修复
- 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
填充LocalSavedStateRegistryOwner
CompositionLocal,确保任何直接保存到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 版本包含这些提交。
错误修复
- 修复了在配置更改或进程终止和重新创建后
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 现在支持 NavOptions,用于使用 popUpTo 和 launchSingleTop 操作(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
导航时,您现在可以通过KEY_DEEP_LINK_INTENT
从参数中获取 intent,从而访问结果目的地中的Uri
、操作和 MIME 类型,这与外部深层链接已有的功能相同。(I975c3, b/181521877)
错误修复
OnBackPressedCallbacks
(将NavBackStackEntry
作为 LifecycleOwner 添加到调度程序)现在可以在 Activity 生命周期处于STOPPED
后再STARTED
的情况下,正确拦截返回事件 (Iff94f, b/182284739)。- 深层链接域解析现在不区分大小写,确保
www.example.com
既能匹配www.example.com
又能匹配www.Example.com
。请注意,查询参数名称仍然区分大小写。 (#144, b/153829033) - 修复了当目标有多个非空默认参数,并且您只覆盖了这些参数的子集就导航到该目标时可能发生的
NullPointerException
。 (aosp/1644827)
依赖项更新
- Navigation Safe Args Gradle 插件现在依赖于 Kotlin Gradle Plugin 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)
错误修复
- 修复了在使用 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 包含这些提交。
错误修复
- 在
NavBackStackEntry
的Lifecycle
移动到CREATED
之前弹出它,不再会发生崩溃。 (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 包含这些提交。
错误修复
- 修复了
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)
NavHostFragment.findNavController(Fragment)
除了检查 Fragment 层次结构和 Fragment 的视图层次结构外,现在还会检查 DialogFragment 的根装饰视图。这允许您使用FragmentScenario
和Navigation.setViewNavController()
测试使用 Navigation 的对话框片段。 (I69e0d)
版本 2.3.1
版本 2.3.1
2020 年 10 月 14 日
androidx.navigation:navigation-*:2.3.1
已发布。版本 2.3.1 包含这些提交。
新功能
- Navigation UI 中已添加默认 Animator 资源,建议替代默认动画资源。 (b/167430145)
- NavOptions 现在会覆盖 hashcode 和 equals 方法 (b/161586466)
- Navigation 现在在“无 ID 目标” IllegalArgumentException 中包含当前目标,这应该可以改善开发人员的调试体验。 (b/168311416)
错误修复
- 即使生成的参数类名超过 100 个字符,Safe Args 也不会再换行。 (b/168584987)
依赖项更改
navigation-ui
现在依赖于 DrawerLayout 1.1.1,确保NavigationUI
即使在使用LOCK_MODE_LOCKED_CLOSED
或LOCK_MODE_LOCKED_OPEN
时也能够打开抽屉。 (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
Artifact 允许您导航到功能模块中定义的目标,并根据需要自动处理功能模块的安装。有关更多信息,请参阅使用功能模块进行导航。 - 导航测试:
navigation-testing
Artifact 提供了TestNavHostController
,允许您设置当前目标并在导航操作后验证返回堆栈。有关更多信息,请参阅测试导航。 - 返回结果:与导航返回堆栈上每个目标关联的
NavBackStackEntry
现在允许您访问一个SavedStateHandle
,它适用于存储应与特定返回堆栈条目关联的少量保存状态。有关更多信息,请参阅返回结果到上一个目标。 NavigationUI
对Openable
的支持:NavigationUI
中所有DrawerLayout
的用法已被更通用的Openable
接口取代,该接口在 CustomView1.1.0
中添加,并由 DrawerLayout1.1.0
中的DrawerLayout
实现。- 深层链接中的 Action 和 Mime Type 支持:深层链接已扩展到支持
app:action
和app:mimeType
,除了之前可用的app:uri
。NavController
现在通过新的NavDeepLinkRequest
类支持通过这些字段的任何组合进行导航。有关更多信息,请参阅使用 NavDeepLinkRequest 导航。
已知问题
- 对深层链接 action 和 mime 类型的支持尚未在 Manifest Merger 中提供。在此工作完成之前,清单中
<nav-graph>
元素生成的任何<intent-filter>
元素都不会在其<data>
元素中包含您的 mime 类型或您的自定义<action>
。您必须手动将适当的<intent-filter>
添加到您的清单中。
版本 2.3.0-rc01
2020 年 6 月 10 日
androidx.navigation:navigation-*:2.3.0-rc01
已发布。版本 2.3.0-rc01 包含这些提交。
错误修复
- 修复了使用
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 包含这些提交。
错误修复
- 修复了进程终止后
NavBackStackEntry
的Lifecycle
未正确更新的问题。 (b/155218371) - 在调用
setGraph()
之前注册的OnDestinationChangedListener
实例,在进程终止后现在会正确接收恢复的目标。 (b/155218371) - 在使用
singleTop
时,NavBackStackEntry
现在会正确更新其参数,并且更新后的参数会发送到所有OnDestinationChangeListener
实例。 (b/156545508)
依赖项更新
NavigationUI
Artifact 现在依赖于 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 变更
- 极大地扩展了对动态导航目标的 Kotlin DSL 支持。 (b/148969800)
错误修复
- 修复了在使用嵌套起始目标时,深层链接 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 现在公开了一个用于 Action 的
defaultArguments
Map
,与 Navigation XML 文件中<action>
元素设置默认值的功能相对应。 (b/150345605)
错误修复
- 从 Navigation 2.2.2 开始:修复了当您的 Activity 中有多个
NavHostFragment
实例时,深层链接到图的起始目标时出现IllegalStateException
的问题。 (b/147378752)
依赖项更新
- Navigation 现在依赖于 Fragment
1.2.4
。 (aosp/1277325) - 动态导航现在依赖于 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 中增加了对功能模块活动和片段目标的支援。 (b/148969800)
API 变更
DynamicExtras
类不再使用 Builder 模式,现在可以直接构造。 (aosp/1253671)DynamicActivityNavigator
现在在其构造函数中接受一个Context
,而不是一个Activity
。 (aosp/1250252)
错误修复
NavigationUI
不再忽略空标签(即android:label=””
的目标),现在正确地将标题设置为空字符串。 (b/148679860)
依赖项更新
- Navigation Dynamic Features Artifacts 现在依赖于 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
接口(DrawerLayout
在 DrawerLayout1.1.0-alpha04
中实现此接口),允许您将Openable
的自定义实现与NavigationUI
一起使用。 (b/129030452)
错误修复
navigation-common-ktx
的 ProGuard 规则现在正确地只保留使用的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
已发布。此版本中包含的提交可以在此处找到。
新功能
NavBackStackEntry
现在允许您访问一个SavedStateHandle
,它适合存储少量应与特定返回堆栈条目关联的保存状态。有关示例用例,请参阅返回结果。 (b/79672220)
API 变更
- 已添加
getCurrentBackStackEntry()
和getPreviousBackStackEntry()
的便捷方法,以便更轻松地检索当前和先前目标的NavBackStackEntry
。 (b/79672220)
错误修复
- 当在您自己的任务堆栈上启动应用程序时,
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
已发布。此版本中包含的提交可以在此处找到。
新特性
- 新的
navigation-testing
Artifact 提供了TestNavHostController
类。此类提供了一种替代模拟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
开始:navigation-ui
的DrawerArrowDrawable
的 ProGuard 规则已更新,以确保不需要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 包含这些提交。
错误修复
- 修复了当您的 Activity 中有多个
NavHostFragment
实例时,深层链接到图的起始目标时出现IllegalStateException
的问题。 (b/147378752) NavigationUI
不再忽略空标签(即android:label=””
的目标),现在正确地将标题设置为空字符串。这已在 Navigation 2.3.0-alpha04 中发布。 (b/148679860)navigation-common-ktx
的 ProGuard 规则现在正确地只保留使用的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) navigation-ui
的DrawerArrowDrawable
的 ProGuard 规则已更新,以确保不需要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 集成:
SavedStateViewModelFactory
现在是使用by navGraphViewModels()
或ViewModelProvider
构造函数时,默认使用的工厂,该构造函数使用NavController.getBackStackEntry()
或NavController.getViewModelStoreOwner()
返回的ViewModelStoreOwner
。 - 深层链接的查询参数支持:带有查询参数的深层链接现在支持重新排序的查询参数;具有默认值或可空的参数在匹配深层链接时现在是可选的。
- 改进的动画支持:
NavHostFragment
现在使用来自 Fragment 1.2.0 的FragmentContainerView
,修复了动画 Z 顺序问题和窗口内边距分发到片段的问题。
版本 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) - 当与
FragmentContainerView
一起使用时,NavHostFragment
现在在配置更改后正确恢复图。 (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 生成的
Directions
Java 类现在包含默认值。 (b/141099045) - Safe Args 生成的
Args
Java 类现在包含默认值。 (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
已发布。此版本中包含的提交可以在此处找到。
新特性
- 带有查询参数的深层链接现在支持重新排序的查询参数;具有默认值或可空的参数在匹配深层链接时现在是可选的。 (b/133273839)
- 您现在可以调用
NavController.getBackStackEntry()
,传入返回堆栈上目标或导航图的 ID。返回的NavBackStackEntry
除了提供用于启动该目标的参数外,还提供了 Navigation 驱动的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 以来的重要更改
- 将 ViewModels 范围限定为导航图:您现在可以使用
-ktx
库的 Kotlin 用户通过by navGraphViewModels()
属性委托,或通过使用添加到NavController
的getViewModelStoreOwner()
API 来创建范围限定在导航图级别的 ViewModel。有关更多信息,请参阅在目标之间共享与 UI 相关的数据。 - 对话框目标:您现在可以创建
<dialog>
目标,当您navigate
到它们时,它们将显示DialogFragment
。NavHostFragment
默认支持对话框目标。有关更多信息,请参阅从 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
现在会为 Up 按钮的移除添加动画。 (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
Artifact。可以通过 XML 添加的自定义导航器应使用此属性,以与 Navigation Editor 的主机面板集成。 (b/133880955)
API 更改
NavController
上的getViewModelStore()
API 已被弃用,取而代之的是返回ViewModelStoreOwner
的新getViewModelStoreOwner()
方法。 (aosp/987010)- 浮动窗口目标(例如
<dialog>
目标)的实现已通用化为标记接口FloatingWindow
,所有<dialog>
目标现在都实现了该接口。用于与顶部应用栏交互的 NavigationUI 方法现在会忽略FloatingWindow
目标。 (b/133600763)
行为变更
- Navigation 现在在使用
<dialog>
目标时,正确保持其状态与屏幕上显示的状态同步。因此,当您导航到非对话框和非活动目标(例如<fragment>
目标)时,Navigation 现在会自动弹出<dialog>
目标。 (b/134089818)
Bug 修复
- Navigation 现在会抑制处理深层链接时重新创建 activity 发生的动画,修复了视觉闪烁问题。 (b/130362979)
- 修复了在添加初始片段时弹出片段时,导航返回堆栈会不同步的错误。 (b/133832218)
版本 2.1.0-alpha05
2019 年 6 月 5 日
androidx.navigation:*:2.1.0-alpha05
已发布。此版本中包含的提交可以在此处找到。
API 更改
NavController
上的主机相关 API 已重命名并移至NavController
的新子类NavHostController
。 (aosp/966091)NavController
的setHostOnBackPressedDispatcherOwner()
方法已替换为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/132077777DialogFragmentNavigator
现在正确处理popBackStack()
和navigateUp()
操作。b/132576764- 修复了重复在嵌套图之间导航时出现的
IllegalStateException: unknown destination during restore
问题。b/131733658
版本 2.1.0-alpha03
2019 年 5 月 7 日
androidx.navigation:*:2.1.0-alpha03
已发布。此版本中包含的提交可以在此处找到。
已知问题
- NavHostFragment 尽管使用
app:defaultNavHost="false"
,但仍会拦截系统返回按钮事件。b/132077777
新特性
- 您现在可以创建
<dialog>
目标,当您navigate
到它们时,它们将显示DialogFragment
。NavHostFragment
默认支持对话框目标。b/80267254 - 除了使用资源 ID 或
NavDirections
实例调用navigate
外,您现在可以通过Uri
进行导航,它使用您已添加到目标以导航到正确目标的<deepLink>
。b/110412864
行为变更
- NavigationUI 提供的默认动画已从 400ms 加速到 220ms,以匹配 activity 和 fragment 的默认动画速度。b/130055522
API 更改
NavHostFragment
的createFragmentNavigator()
方法已被弃用,其功能已移至新的onCreateNavController()
方法,以更清楚地表明这是当子类化NavHostFragment
时添加自定义导航器的正确入口点。b/122802849- 已向
NavDestination
添加了hasDeepLink()
方法,允许您检查给定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
已发布。此版本中包含的提交可以在此处找到。
新特性
- 您现在可以创建范围限定在导航图级别的 ViewModel,对于 Kotlin 用户,可以通过
by navGraphViewModels()
属性委托实现,或者通过使用添加到NavController
的getViewModelStore()
API 实现。b/111614463
API 更改
- 您现在可以将
app:targetPackage
添加到<activity>
目标,以限制匹配的包名。它支持app:targetPackage="${applicationId}"
来将包限制为您自己的应用程序 ID。b/110975456
Bug 修复
<activity>
目标的android:name
不再在膨胀时解析为 Class,从而避免了使用动态功能时出现 ClassNotFoundExceptions。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 和 Bundle 创建点击监听器的替代方案。b/127631752 FragmentNavigator.instantiateFragment
现在已被弃用。默认实现现在使用FragmentFactory
来实例化 Fragment。b/119054429
错误修复
- 当目标附加了参数时,Navigation 不再发送空的
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 的新 Artifact,并将其依赖项更改为 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
}
对于安全参数,请在您的顶层 build.gradle
文件中添加以下 classpath
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 稳定版的第二个发布候选版本。此版本包含一些错误修复。
错误修复
- 修复了如果根图没有 ID,
popBackStack()
将被忽略的问题 b/126251695 - 在处理没有
FLAG_ACTIVITY_NEW_TASK
的深层链接后调用navigateUp()
时,现在可以正确处理导航回应用程序任务 b/126082008 - 修复了
ActivityNavigator.applyPopAnimationsToPendingTransition
未应用正确的弹出退出动画的问题 b/126237567 - Safe Args 生成的 Kotlin 代码现在会正确地转义与
R
类关联的包名中的 Kotlin 关键字,例如in
和fun
。b/126020455
版本 1.0.0-rc01
2019 年 2 月 21 日
这是 Navigation 1.0.0 稳定版的发布候选版本。此版本包含一个错误修复。
错误修复
- 修复了在使用 Fragment 和
singleTop
导航操作时的问题 b/124294805
版本 1.0.0-beta02
2019 年 2 月 12 日
此版本包含一些小的改进和重要的错误修复。
新功能
- 您现在可以将
0
用作reference
参数的android:defaultValue
。b/124248602
行为变更
- 精确的深层链接匹配现在优先于带有
.*
或参数匹配的深层链接。b/123969518
错误修复
popBackStack()
和navigateUp
现在在弹出返回堆栈上的最后一个目标时正确返回false
,修复了1.0.0-beta01
中引入的回归问题。b/123933201- Navigation 现在在恢复保存的实例状态时正确设置
ClassLoader
,避免了在使用Navigator
保存状态或发送到NavDestination
的参数中自定义类时出现的问题。b/123893858 - Safe Args 生成的 NavArgs 类在从保存的实例状态恢复
Parcelable[]
参数时不再崩溃。b/123963545 - Safe Args 现在正确清理了不必要的生成的 Kotlin 类。b/124120883
版本 1.0.0-beta01
2019 年 2 月 4 日
这是 Navigation 的第一个 Beta 版本;展望未来,除非出现严重问题,否则 Navigation API 预计将保持稳定直到下一个版本。此版本包含一些错误修复和行为更改。
行为变更
- Navigation 现在确保参数默认值在运行时和通过 Safe Args 处理时完全相同。因此,只有
app:argType="reference"
的参数才能将默认值指向另一个资源(例如@color/colorPrimary
)。尝试将引用默认值与不同的app:argType
一起使用将在解析导航 XML 时导致异常。b/123551990 - Safe Args 现在依赖于 Android Gradle Plugin 3.3.0 aosp/888413
- Safe Args 现在依赖于 Kotlin 1.3.20 aosp/888414
错误修复
- Safe Args 现在可以在所有版本的 Android Gradle Plugin 上用于库和功能模块。b/121304903
- 修复了导致单个
popBackStack()
操作将返回堆栈顶部所有目标副本弹出,而不是一次只弹出一个目标的回归问题。b/123552990 - 修复了
FragmentNavigator
状态与NavController
状态不同步的问题,导致在尝试恢复返回堆栈时出现IllegalStateException
。b/123803044 - 修复了在使用 ProGuard 进行混淆时,
NavigationUI
处理的返回箭头不显示的问题。b/123449431 - Safe Args 生成的代码现在正确处理指向格式为
.OuterClass$InnerClass
的静态内部类的app:argType
。b/123736741 - Safe Args 生成的 Java 代码现在正确处理全局操作和深度嵌套的目标。b/123347762
版本 1.0.0-alpha11
2019 年 1 月 23 日
这是 1.0.0-alpha10
的一个热修复版本,修复了 Safe Args 的一个问题。
错误修复
- 修复了 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
插件仍然可用的 Builder 模式。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
错误修复
NavDeepLinkBuilder
现在通过使用您传入的参数来确定唯一性,从而正确处理到同一目标的多个同时PendingIntent
。b/120042732- 当使用嵌套的
NavHostFragment
或其他子 Fragment 及其返回堆栈时,NavController
现在可以正确处理popBackStack()
操作。b/122770335 NavigationUI
现在正确设置 Up 按钮的内容描述。b/120395362- Safe Args 生成的 Directions 类现在正确处理与目标操作具有相同 ID 的全局操作。b/122962504
- 当
equals()
返回 true 时,Safe Args 生成的NavDirections
类的hashCode()
值现在是相等的。b/123043662 FragmentNavigator
现在会抛出更好的错误消息,如果您尝试在NavHostFragment
的FragmentManager
上执行自定义FragmentTransactions
。您应该始终使用getChildFragmentManager()
。b/112927148
版本 1.0.0-alpha09
2018 年 12 月 18 日
此版本包含破坏性 API 更改;请参阅下面的“破坏性更改”部分。
我们已选择停止开发 android.arch.navigation:navigation-testing
工件。尽管它在 NavController
的内部测试中很有帮助,但我们强烈建议采用其他测试策略,例如模拟 NavController
实例,以验证是否正确执行了 navigate()
调用。这种方法在 AndroidDevSummit 2018 的单 Activity 演讲中进行了详细讨论,我们还将努力提供更多专门关于 Navigation 测试的文档。
新功能
- 与
NavigationUI
方法一起使用时,menuCategory="secondary"
的MenuItem
将不再弹出返回堆栈。b/120104424 AppBarConfiguration
现在允许您设置一个备用的OnNavigateUpListener
实例,当navController.navigateUp()
返回false
时将调用该实例。b/79993862 b/120690961
破坏性更改
- 当使用
argType="reference"
的<argument>
时,Navigation 不再解析引用,而是提供原始资源 ID 本身。b/111736515 onNavDestinationSelected()
现在默认会弹出到导航图的起始目标,使其与setup
方法保持一致。向您的MenuItem
添加menuCategory="secondary"
以避免弹出返回堆栈。aosp/852869- 生成的
Args
类的fromBundle()
方法现在接受一个非空Bundle
,而不是一个可空Bundle
aosp/845616
错误修复
- 现在,参数会从深层链接中正确解析为正确的
argType
,而不再总是作为字符串解析 b/110273284 - Navigation 现在正确导出其公共资源 b/121059552
- Safe Args 现在与 Android Gradle Plugin 3.4 Canary 4 及更高版本兼容 b/119662045
版本 1.0.0-alpha08
2018 年 12 月 6 日
此版本包含破坏性 API 更改;请参阅下面的“破坏性更改”部分。
新功能
- 目标标签与
NavigationUI
方法一起使用时,现在将自动将android:label
中的{argName}
实例替换为正确的参数 b/80267266 - Navigation 现在依赖于 Support Library 28.0.0 b/120293333
破坏性更改
OnNavigatedListener
已重命名为OnDestinationChangedListener
b/118670572OnDestinationChangedListener
现在也传递参数的Bundle
aosp/837142app:clearTask
和app:launchDocument
属性及其相关方法已被移除。使用图的根部的app:popUpTo
来从返回堆栈中移除所有目标。b/119628354ActivityNavigator.Extras
现在使用Builder
模式,并增加了设置任何Intent.FLAG_ACTIVITY_
标志的功能 aosp/828140NavController.onHandleDeepLink
已重命名为handleDeepLink
aosp/836063- 许多不适合子类化的类和方法(如
NavOptions
、NavInflater
、NavDeepLinkBuilder
和AppBarConfiguration
)已设为final
aosp/835681 - 已移除已弃用的
NavHostFragment.setGraph()
方法 aosp/835684 - 已移除已弃用的
NavigationUI.navigateUp(DrawerLayout, NavController)
方法。aosp/835684 - Fragment 的创建已移至
FragmentNavigator
,使得将 Fragment 创建委托给FragmentFactory
更容易。b/119054429 NavGraphNavigator
的构造函数不再接受Context
aosp/835340- NavigatorProvider 现在是一个类,而不是一个接口。
getNavigatorProvider()
返回的NavigatorProvider
功能没有改变。aosp/830660 - 已移除
NavDestination.navigate()
。请改为在Navigator
上调用navigate()
。aosp/830663 Navigator
进行了重大重构,移除了对OnNavigatorNavigatedListener
的需求,而是让navigate
返回导航到的NavDestination
。Navigator
实例不能再向NavController
发送弹出事件。考虑使用OnBackPressedCallback
拦截返回按钮按下并调用navController.popBackStack()
。aosp/833716
错误修复
- 当目标是
<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
错误修复
- 深层链接现在正确解析查询参数。b/110057514
- Activity 目标现在正确应用所有进入和退出动画。b/117145284
- 修复了使用自定义 Navigator 时在配置更改后发生的崩溃。b/110763345
Safe Args
- Safe args 现在对 Android Gradle Plugin 3.2.1 有固定依赖。b/113167627
- 现在可以为内部类生成 Directions。b/117407555
- 修复了生成指向 <include> 图的 Directions 的问题。b/116542123
版本 1.0.0-alpha06
2018 年 9 月 20 日
新功能
- 现在支持 Fragment 和 Activity 目标的共享元素转换 b/79665225。有关详细信息,请参阅使用 Navigation Architecture Component 实现导航
- 在
NavigationView
中选择项目现在将关闭任何包含的底部工作表 b/112158843
API 变更
- 重大更改: Navigator
navigate()
方法现在接受Navigator.Extras
参数。 - NavController 的
getGraph()
方法现在是NonNull
b/112243286
错误修复
- 如果与来自单个目标的视图一起使用,
NavigationUI.setupWithNavController()
不再泄漏视图 b/111961977 - Navigator
onSaveState()
现在只调用一次 b/112627079
Safe Args
- 导航目标 Directions 类现在会扩展其父类的 Directions 类(如果存在) b/79871405
- Directions 和 Args 类现在具有有用的
toString()
实现 b/111843389
版本 1.0.0-alpha05
2018 年 8 月 10 日
错误修复
- 修复了导致返回堆栈行为不正确的错误。b/111907708
- 修复了生成的 Args 类的
equals()
中的错误。b/111450897 - 修复了 Safe Args 中的构建失败。b/109409713
- 修复了从资源标识符到 Java 名称的转换问题 b/111602491
- 修复了 Safe Args 插件中关于可空性的错误消息。
- 添加了缺失的可空性注解。
版本 1.0.0-alpha04
2018 年 7 月 19 日
Navigation 1.0.0-alpha04
及相关的 Safe Args gradle 插件包含一些 API 更改、行为更改和错误修复。
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
属性确实不为空 b/111451769 - 已向 NavDirections 和 Args 生成的类添加了额外的
NonNull
注解 b/111455455 b/111455456
错误修复
- 修复了深层链接到 Fragment 目标后系统返回按钮的问题 b/111515685
版本 1.0.0-alpha03
2018 年 7 月 12 日
Navigation 1.0.0-alpha03
及相关的 Safe Args gradle 插件包含一些 API 更改、行为更改和错误修复。
API / 行为更改
- 已为 Toolbar 添加 NavigationUI.setupWithNavController 方法 b/109868820
- 已为 CollapsingToolbarLayout 添加 NavigationUI.setupWithNavController 方法 b/110887183
- 当返回堆栈为空或给定目标 ID 不在返回堆栈中时,popBackStack() 现在返回 false b/110893637
- FragmentNavigator 现在在 FragmentManager 保存状态后忽略导航操作,避免“Can not perform this action after onSaveInstanceState”异常 b/110987825
Safe Args
- 重大更改: 操作和参数名称中的非字母数字字符将在相应的 NavDirections 方法名称中替换为驼峰式命名
- 例如,
DemoController.index
将变为setDemoControllerIndex
b/79995048 - 例如,
action_show_settings
将变为actionShowSettings
b/79642240
- 例如,
- 重大更改: 参数现在默认被视为非空。要允许字符串和 Parcelable 参数中的空值,请添加
app:nullable="true"
b/79642307 - 您现在可以使用
app:type="long"
和“123L”形式的 defaultValues b/79563966 - 现在支持 Parcelable 参数,使用
app:type
的完全限定类名。唯一支持的默认值是"@null"
b/79563966 - Args 类现在实现
equals()
和hashCode()
b/79642246 - Safe Args 插件现在可以应用于库项目 b/80036553
- Safe Args 插件现在可以应用于功能项目 b/110011752
错误修复
- 修复了在 Fragment 生命周期方法期间导航时的问题 b/109916080
- 修复了多次通过嵌套图导航时的问题 b/110178671
- 修复了使用
setPopUpTo
和图中第一个目标时的问题 b/109909461 - 修复了所有
app:defaultValue
值都作为字符串传递的问题 b/110710788 - Android Gradle Plugin 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 现在会对从深层链接 URL 解析的参数进行 URL 解码。b/79982454
错误修复
修复了从 Fragment 生命周期方法中调用 navigate 时出现的
IllegalStateException
。b/79632233Navigation 现在依赖于 Support Library 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
。