升级Navigation至2.4.1后动态功能模块导航崩溃求助
应用采用Dynamic Feature Module架构,将Navigation组件依赖从2.3.0版本升级至2.4.1版本:
原依赖:
//Navigation Component const val ANDROIDX_NAVIGATION_UI = "androidx.navigation:navigation-ui:2.3.0" const val ANDROIDX_NAVIGATION_UI_KTX = "androidx.navigation:navigation-ui-ktx:2.3.0" const val ANDROIDX_NAVIGATION_FRAGMENT = "androidx.navigation:navigation-fragment:2.3.0" const val ANDROIDX_NAVIGATION_FRAGMENT_KTX = "androidx.navigation:navigation-fragment-ktx:2.3.0" const val ANDROIDX_NAVIGATION_DYNAMIC_FEATURE = "androidx.navigation:navigation-dynamic-features-fragment:2.3.0"
升级后依赖:
const val ANDROIDX_NAVIGATION_UI = "androidx.navigation:navigation-ui:2.4.1" const val ANDROIDX_NAVIGATION_UI_KTX = "androidx.navigation:navigation-ui-ktx:2.4.1" const val ANDROIDX_NAVIGATION_FRAGMENT = "androidx.navigation:navigation-fragment:2.4.1" const val ANDROIDX_NAVIGATION_FRAGMENT_KTX = "androidx.navigation:navigation-fragment-ktx:2.4.1" const val ANDROIDX_NAVIGATION_DYNAMIC_FEATURE = "androidx.navigation:navigation-dynamic-features-fragment:2.4.1"
升级后,导航至其他Dynamic Feature Module中的Fragment时应用崩溃,报错信息:
java.lang.IllegalArgumentException: No destination with ID -2046558191 is on the NavController's back stack. The current destination is Destination(-2097020893) label=CartNavigationFragment class=com.myapp.CartNavigationFragment
验证导航目标是否已加载
Navigation 2.4.x对动态模块导航图的加载机制做了调整,需确保目标Fragment所在的动态模块已完成加载,且导航图已合并到主导航图中。可在导航前通过NavController.graph.findDestination(targetDestId)检查目标ID是否存在,若不存在则等待模块加载完成后再执行导航。调整NavController的获取时机
避免在Fragment生命周期早期(如onCreateView)直接调用findNavController()执行导航,改用view.post { ... }延迟执行,或先确认NavController.currentDestination与预期一致后再跳转。统一所有模块的Navigation版本
检查主模块和所有动态模块的build.gradle,确保所有Navigation相关依赖的版本完全一致,不存在版本差异。同时确认动态模块已正确引入navigation-dynamic-features-fragment依赖。检查导航栈操作参数
若导航时使用了popUpTo或popUpToInclusive参数,核对目标ID是否正确对应导航栈中的有效目的地。2.4.x版本对导航栈的校验更严格,错误的popUpTo目标会触发该异常。升级到修复版本
Navigation 2.4.1存在部分动态模块导航的已知bug,可尝试升级至2.4.2及以上版本,该版本修复了动态模块导航图合并的相关问题。若仍有问题,可临时降级回2.3.0版本排查。
内容的提问来源于stack exchange,提问作者Sammy Freeman

