You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose Navigation升级后NavArgs导入歧义报错

报错触发原因

该报错是Compose Destinations库升级到1.5.11-beta版本后,KSP代码生成逻辑变更+页面导航参数定义不规范共同导致的:

  1. 1.5.11-beta版本的代码生成器在构建自动生成的NavArgsGetter.kt文件时,会为每一个带导航参数的Destination页面,单独导入其内部嵌套的同名NavArgs类。当项目中存在2个及以上带参Destination时,就会出现多个同名NavArgs的平级导入,Kotlin编译器无法区分引用目标,直接抛出Conflicting import, imported name 'NavArgs' is ambiguous歧义错误。如果新增的AddEditPlaceScreen不配置参数,就不会生成对应的NavArgs类,仅剩PlaceInfoScreen一个NavArgs导入,自然不会触发冲突。
  2. 1.1.2-beta旧版本不存在该问题,是因为旧版本生成代码时不会单独导入嵌套的NavArgs类,所有引用都通过xxxDestination.NavArgs的全限定路径写法调用,哪怕类名重复也不会产生导入冲突。
  3. 当前定义的AddEditPlaceScreen参数本身不符合导航路由规范:路由仅支持Bundle可存储的基础类型、String、Parcelable/Serializable类型参数,直接传递普通自定义类PlaceListing?作为导航参数,会干扰代码生成逻辑,进一步提升冲突出现的概率。
修复方案

可根据项目实际情况选择以下任意一种方案修复:

  • 修正导航参数定义:移除AddEditPlaceScreen中不符合规范的place: PlaceListing?参数,替换为可序列化的基础类型参数(比如placeId: Int? = null),进入编辑页后通过id从本地数据源/ViewModel获取对应Place数据,保留符合规范的布尔参数isEditMode: Boolean = false即可。
  • 升级依赖版本:将Compose Destinations依赖升级到1.6.0-beta及以上正式修复版本,新版本已经调整了NavArgsGetter的代码生成逻辑,不再平级导入多个同名NavArgs类,所有引用都使用全限定类名,从根源上避免了导入歧义问题。
  • 自定义NavArgs委托类:如果暂时不打算升级版本,可以通过navArgsDelegate为每个页面指定唯一命名的导航参数类,避免生成同名内部NavArgs类,示例代码如下:
// 自定义独立的导航参数类,类名全局唯一
@Parcelize
data class AddEditPlaceNavArgs(
    val isEditMode: Boolean = false,
    val placeId: Int? = null
) : Parcelable

// 在Destination注解中绑定自定义的参数类
@Destination(navArgsDelegate = AddEditPlaceNavArgs::class)
@Composable
fun AddEditPlaceScreen(
    viewModel: AddEditPlaceViewModel = hiltViewModel(),
    navigator: DestinationsNavigator
) {
    // 从ViewModel或SavedStateHandle中获取参数即可
    val args = navArgs<AddEditPlaceNavArgs>()
    // 其余页面逻辑
}

注意:自定义NavArgs类必须实现Parcelable或Serializable接口,保证参数可以被Bundle正常存储传递。

内容的提问来源于stack exchange,提问作者Reksa Fitrananda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 22:36:20