SDK 34迁移后Jetpack Compose 1.5.4编译报错问题
SDK 34迁移后Jetpack Compose 1.5.4导航过渡编译报错解决方案
问题概述
将Android SDK从33升级到34,搭配Jetpack Compose 1.5.4使用时,导航组件composable函数的过渡参数调用出现编译失败:
composable( route = route, arguments = arguments, deepLinks = deepLinkList(route), enterTransition = { enterTransition() }, popEnterTransition = { popEnterTransition() }, popExitTransition = { popExitTransition() }, exitTransition = { exitTransition() } ) {
报错根异常为org.jetbrains.kotlin.psi2ir.generators.ErrorExpressionException,定位到enterTransition()调用位置。
核心原因
SDK 34对Android API做了调整,而旧版本的Navigation Compose未适配这些变化,与Jetpack Compose 1.5.4的兼容性出现冲突,导致编译期IR(中间表示)生成失败,触发上述异常。
解决步骤
1. 升级Navigation Compose到兼容版本
使用适配SDK 34的Navigation Compose版本,推荐2.7.5及以上,该版本修复了与高版本SDK、Compose 1.5.4的兼容性问题。在Module级build.gradle.kts中更新依赖:
dependencies { // 替换旧的Navigation Compose依赖 implementation("androidx.navigation:navigation-compose:2.7.5") }
2. 修正过渡函数调用上下文
确保enterTransition()等函数在正确的NavBackStackEntry上下文中调用。如果是自定义过渡函数,需保证签名匹配:
// 正确的过渡函数示例 private fun enterTransition(): AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition { return { slideInHorizontally(initialOffsetX = { it }) } }
也可直接在lambda内编写过渡逻辑,避免上下文歧义:
composable( route = route, arguments = arguments, deepLinks = deepLinkList(route), enterTransition = { slideInHorizontally(initialOffsetX = { it }) }, popEnterTransition = { slideInHorizontally(initialOffsetX = { -it }) }, popExitTransition = { slideOutHorizontally(targetOffsetX = { -it }) }, exitTransition = { slideOutHorizontally(targetOffsetX = { it }) } ) { // 页面内容 }
3. 清理构建缓存并重新编译
- 在Android Studio中执行
File -> Invalidate Caches... -> Invalidate and Restart - 终端运行
./gradlew clean build命令,彻底清理缓存后重新编译项目
内容的提问来源于stack exchange,提问作者Jeevan Rupacha
相关产品推荐
相关产品推荐

