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

@AndroidEntryPoint 注解AbstractComposeView编译报错问题咨询

问题产生原因

Hilt的@AndroidEntryPoint注解在做字节码插桩处理时,当前版本的Gradle插件存在明确限制:被标记的类的直接基类,不能存在带默认参数的构造函数。
你代码中继承的androidx.compose.ui.platform.AbstractComposeView本身的构造函数带有默认参数声明,同时自定义的KeyboardView使用了@JvmOverloads生成多重重载构造,正好触发了Hilt的这个校验规则,最终导致编译失败。

修复方案

你可以根据自己的实际场景二选一:

  • 方案1:保留View上的@AndroidEntryPoint注解,手动声明View的三个标准构造重载,移除主构造上的@JvmOverloads和默认参数,完全避开Hilt的构造参数校验。
    调整后的代码如下:
    @AndroidEntryPoint
    class KeyboardView : AbstractComposeView {
        private var keyboardActionListener: OnKeyboardActionListener? = null
    
        // 代码动态创建View时调用
        constructor(context: Context) : super(context)
        // XML布局inflate时调用
        constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
        // 带默认样式属性的构造
        constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
    
        fun setOnKeyboardActionListener(keyboardActionListener: OnKeyboardActionListener) {
            this.keyboardActionListener = keyboardActionListener
        }
    
        @Composable
        override fun Content() {
            Vendiboard {
                keyboardActionListener?.onKeyboardAction(it)
            }
        }
    }
    
  • 方案2:如果你不需要在KeyboardView的非Composable代码段中注入依赖,只是需要在Composable内部获取ViewModel实例,可以直接移除KeyboardView类上的@AndroidEntryPoint注解。
    由于承载该View的Service本身已经被@AndroidEntryPoint标记,只要你在Service中给View正确设置ViewTreeViewModelStoreOwner、ViewTreeSavedStateRegistryOwner等Compose必要的Owner配置,在Content()的Composable作用域内直接调用hiltViewModel()就可以正常拿到注入的ViewModel实例,完全绕开Hilt对View基类构造的限制。

内容的提问来源于stack exchange,提问作者Farhan Farooqui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 06:24:16