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

Android Compose自定义Lint规则:修复注解不适用于表达式问题

解决自定义Lint检测器抑制注解无法作用于表达式的问题

问题根源

你的Lint规则默认不支持在表达式级别应用@SuppressLint注解,需要显式配置Issue的注解目标类型,允许作用于表达式。

核心修改方案

在创建Issue对象时,通过setAnnotationTargets方法指定允许的注解目标为AnnotationTarget.EXPRESSION,同时优化检测器逻辑避免误判自定义Button。

修改后的完整代码

class MissingDefaultDetector : Detector(), SourceCodeScanner {

    companion object {
        private const val STANDARD_BUTTON_NAME = "Button"

        @JvmField
        val ISSUE: Issue = Issue.create(
            id = "PreferDefaultComposables",
            briefDescription = "优先使用自定义组件",
            explanation = "应使用团队定制样式的自定义Button,而非AndroidX标准Button",
            category = Category.CORRECTNESS,
            priority = 6,
            severity = Severity.WARNING,
            implementation = Implementation(
                MissingDefaultDetector::class.java,
                Scope.JAVA_FILE_SCOPE
            )
        )
        // 关键:配置允许在表达式级别应用抑制注解
        .setAnnotationTargets(AnnotationTarget.EXPRESSION)
    }

    override fun getApplicableMethodNames(): List<String> = listOf(STANDARD_BUTTON_NAME)

    override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
        // 仅检测AndroidX的标准Button,避免误判自定义Button
        val buttonClass = method.containingClass?.qualifiedName
        if (buttonClass in listOf("androidx.compose.material.Button", "androidx.compose.material3.Button")) {
            context.report(
                issue = ISSUE,
                scope = node,
                location = context.getNameLocation(node),
                message = "请使用团队定制的Button组件替代标准Button",
            )
        }
    }
}

关键说明

  • setAnnotationTargets(AnnotationTarget.EXPRESSION):这行代码是解决抑制注解报错的核心,它告知Lint该规则的@SuppressLint注解可以应用在表达式节点上,此时在Button调用处添加注解就不会再提示“该注解不适用于目标‘expression’”。
  • 增加类名校验:原代码会匹配所有名为Button的方法调用,容易误判你自己团队的自定义Button,添加类名过滤后,只会检测AndroidX库中的标准Button。

抑制注解使用示例

现在可以直接在表达式级别添加抑制:

@SuppressLint("PreferDefaultComposables")
Button(onClick = {}) {
    Text("临时保留的标准Button")
}

内容的提问来源于stack exchange,提问作者m.reiter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:42:51