首页 > 解决方案 > 如何将 @IntRange() 支持注释应用于 Kotlin 属性设置器

问题描述

我一直在试图找出如何申请@IntRange(from = 1)我的 Kotlin 财产。经过几次失败的尝试,我终于在 Java 中创建了我想要的类,并将其转换为 Android Studio 中的 Kotlin。这是我的Java类:

import android.support.annotation.IntRange;

public class SimpleThing {

    private int val;

    @IntRange(from = 1)
    public int getVal() {
        return val;
    }

    public void setVal(@IntRange(from = 1) int val) {
        this.val = val;
    }

}

这是我从 Android Studio 得到的自动转换:

import android.support.annotation.IntRange

class SimpleThing {

    @get:IntRange(from = 1)
    var `val`: Int = 0

}

@IntRange似乎适用于 getter 但不适用于 setter 。是否可以将此注释应用于设置器,以便出现适当的 lint 警告。目前我刚刚重写了 set 方法来抛出一个 IllegalArgumentException ,如下所示:

@get:IntRange(from = 1)
var rowSize: Int = 3
    set(value) {
        if (value < 1) throw IllegalArgumentException("row size must be at least 1")
        field = value
        notifyDataSetChanged()
    }

我已经尝试添加@set:IntRange(from = 1),但我得到了错误This annotation does not apply for type void,因为它试图应用于@IntRange返回值(在 setter 的情况下是无效的)而不是 setter 参数。

标签: androidkotlinandroid-annotationsandroid-lintkotlin-interop

解决方案


@setparam注释似乎是我正在寻找的内容,但是当我尝试分配范围之外的值时,Android Studio 中没有发出 lint 警告。

这是我的新代码:

@get:IntRange(from = 1)
@setparam:IntRange(from = 1)
var rowSize: Int = 3
    set(value) {
        if (value < 1) throw IllegalArgumentException("row size must be at least 1")
        field = value
        notifyDataSetChanged()
    }

这是我通常希望看到一个 lint 警告的地方,告诉我我正在分配一个 int 范围之外的值

在此处输入图像描述

但是,在 Kotlin 代码中使用 SimpleThing 类时确实会出现 lint 警告

在此处输入图像描述

将 Kotlin 方法作为 Java 代码调用时也不会出现 lint 警告

在此处输入图像描述

看起来这个功能还没有实现。


推荐阅读