@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
相关产品推荐
相关产品推荐

