android 自定义lint规则:如何修复“此注解不适用于目标'expression'”

9jyewag0  于 2023-11-15  发布在  Android
关注(0)|答案(1)|浏览(152)

我正在为android/compose编写我的第一个自定义lint-detector:
“不要使用标准按钮,使用我们专门设计的自定义按钮”
探测器本身按预期工作:
x1c 0d1x的数据
然而,Lint抑制并不像预期的那样工作:“此注解不适用于目标'expression'”



我必须回到另一个范围才能让它工作:


我如何以这样一种方式修复我的lint规则,我可以针对表达式?

我的当前(简化)实现:

class MissingDefaultDetector : Detector(), SourceCodeScanner {

    companion object {
        private const val old = "Button"

        @JvmField
        val ISSUE: Issue = Issue.create(
            id = "PreferDefaultComposables",
            briefDescription = "Prefer 'DefaultComposables'",
            explanation = "The default implementation should be used",
            category = Category.CORRECTNESS,
            priority = 6,
            severity = Severity.WARNING,
            implementation = Implementation(
                MissingDefaultDetector::class.java,
                Scope.JAVA_FILE_SCOPE
            )
        )
    }

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

    override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
        context.report(
            issue = ISSUE,
            scope = node,
            location = context.getNameLocation(node),
            message = "Prefer our custom version(s) of this component",
        )
    }
}

字符串

xam8gpfp

xam8gpfp1#

错误消息“This annotation is not applicable to target 'expression'”表示@SuppressLint(“NoteDefaultComposables”)annotation不能用于表达式,只能用于声明(如类、字段、方法或参数)。
在您的代码中,@SuppressLint(“Default DefaultComposables”)注解用于Button函数调用。这是不允许的,因为该函数调用是表达式,而不是声明。
要解决这个问题有两种方法

方法1 -

@Composable
fun ButtonText() {

    // Declare the Button function call inside a lambda expression
    @SuppressLint("PreferDefaultComposables")
    val button: Unit = Button(onClick = { }) {
        Text(text = "Click me")
    }
}

字符串

办法2

@Composable
fun ButtonText() {

    @SuppressLint("PreferDefaultComposables")
    @Composable
    fun InnerButton() {
        Button(onClick = { }) {
            Text(text = "Click me")
        }
    }

    InnerButton()
}


默认的方法是声明outside或者onButtonText函数。但是你需要的是声明inside。希望这些方法对你有帮助

相关问题