带有 snackbar 扩展功能的 lint 错误
Lint error with snackbar extension function
我有以下扩展功能来减少代码并避免在显示小吃店时忘记持续时间:
fun Fragment.showSnackbar(text: String, length: Int = Snackbar.LENGTH_SHORT) {
view?.run { Snackbar.make(this, text, length).show() }
}
但是 lint 给我以下错误:
Error: Must be one of: BaseTransientBottomBar.LENGTH_INDEFINITE, BaseTransientBottomBar.LENGTH_SHORT, BaseTransientBottomBar.LENGTH_LONG or value must be ≥ 1 (was -1) [WrongConstant]
view?.run { Snackbar.make(this, textResId, length).show() }
~~~~~~
似乎如果你传递一个自定义长度参数,它应该是一个 int >=0 并且它检测到默认参数是一个自定义参数而不是 system/class 但它是 (LENGTH_SHORT, 即-1).
如果长度参数是 BaseTransientBottomBar.Duration
类型(这是设置长度参数的可能值的接口符号),它编译得很好,但我不知道如何将其分配为默认值.
有什么方法可以避免 lint 错误或设置 BaseTransientBottomBar.Duration
类型的默认值?
--- 编辑:应用@rahat 方法后:
fun Fragment.showSnackbar(text: String, @BaseTransientBottomBar.Duration length: Int = Snackbar.LENGTH_SHORT) {
view?.run { Snackbar.make(this, text, length).show() }
}
错误:
[PATH]/DesignExt.kt:18: Error: Must be one of: BaseTransientBottomBar.LENGTH_INDEFINITE, BaseTransientBottomBar.LENGTH_SHORT, BaseTransientBottomBar.LENGTH_LONG [WrongConstant]
fun Fragment.showSnackbar(text: String, @BaseTransientBottomBar.Duration length: Int = Snackbar.LENGTH_SHORT) {
~~~~~~~~~~~~~~~~~~~~~
由于被调用方法的签名如下
@NonNull
public static Snackbar make(
@NonNull View view, @NonNull CharSequence text, @Duration int duration)
和 class Snackbar
public class Snackbar extends BaseTransientBottomBar<Snackbar>
最后Duration
的签名是
@RestrictTo(LIBRARY_GROUP)
@IntDef({LENGTH_INDEFINITE, LENGTH_SHORT, LENGTH_LONG})
@IntRange(from = 1)
@Retention(RetentionPolicy.SOURCE)
public @interface Duration {}
所以传递的值必须是Duration
中的值之一,即使是,lint也会来,因为参数没有注释,可以接受任何Int
值,但是当你注释然后当你用一个不同于 Duration
中存在的值调用你的方法时,它会在那个地方给你警告,并且它 可能 导致 RuntimException 如果传递的值不是其中之一。
试试这个,
fun Fragment.showSnackbar(text: String, @BaseTransientBottomBar.Duration length: Int = Snackbar.LENGTH_SHORT) {
view?.run { Snackbar.make(this, text, length).show() }
}
最后我避免了将警告 'WrongConstant' 添加到 lint.xml 文件中的错误。如果它是文件中唯一的内容,它将是:
android {
lintOptions {
warning "WrongConstant"
}
}
我有以下扩展功能来减少代码并避免在显示小吃店时忘记持续时间:
fun Fragment.showSnackbar(text: String, length: Int = Snackbar.LENGTH_SHORT) {
view?.run { Snackbar.make(this, text, length).show() }
}
但是 lint 给我以下错误:
Error: Must be one of: BaseTransientBottomBar.LENGTH_INDEFINITE, BaseTransientBottomBar.LENGTH_SHORT, BaseTransientBottomBar.LENGTH_LONG or value must be ≥ 1 (was -1) [WrongConstant]
view?.run { Snackbar.make(this, textResId, length).show() }
~~~~~~
似乎如果你传递一个自定义长度参数,它应该是一个 int >=0 并且它检测到默认参数是一个自定义参数而不是 system/class 但它是 (LENGTH_SHORT, 即-1).
如果长度参数是 BaseTransientBottomBar.Duration
类型(这是设置长度参数的可能值的接口符号),它编译得很好,但我不知道如何将其分配为默认值.
有什么方法可以避免 lint 错误或设置 BaseTransientBottomBar.Duration
类型的默认值?
--- 编辑:应用@rahat 方法后:
fun Fragment.showSnackbar(text: String, @BaseTransientBottomBar.Duration length: Int = Snackbar.LENGTH_SHORT) {
view?.run { Snackbar.make(this, text, length).show() }
}
错误:
[PATH]/DesignExt.kt:18: Error: Must be one of: BaseTransientBottomBar.LENGTH_INDEFINITE, BaseTransientBottomBar.LENGTH_SHORT, BaseTransientBottomBar.LENGTH_LONG [WrongConstant]
fun Fragment.showSnackbar(text: String, @BaseTransientBottomBar.Duration length: Int = Snackbar.LENGTH_SHORT) {
~~~~~~~~~~~~~~~~~~~~~
由于被调用方法的签名如下
@NonNull
public static Snackbar make(
@NonNull View view, @NonNull CharSequence text, @Duration int duration)
和 class Snackbar
public class Snackbar extends BaseTransientBottomBar<Snackbar>
最后Duration
的签名是
@RestrictTo(LIBRARY_GROUP)
@IntDef({LENGTH_INDEFINITE, LENGTH_SHORT, LENGTH_LONG})
@IntRange(from = 1)
@Retention(RetentionPolicy.SOURCE)
public @interface Duration {}
所以传递的值必须是Duration
中的值之一,即使是,lint也会来,因为参数没有注释,可以接受任何Int
值,但是当你注释然后当你用一个不同于 Duration
中存在的值调用你的方法时,它会在那个地方给你警告,并且它 可能 导致 RuntimException 如果传递的值不是其中之一。
试试这个,
fun Fragment.showSnackbar(text: String, @BaseTransientBottomBar.Duration length: Int = Snackbar.LENGTH_SHORT) {
view?.run { Snackbar.make(this, text, length).show() }
}
最后我避免了将警告 'WrongConstant' 添加到 lint.xml 文件中的错误。如果它是文件中唯一的内容,它将是:
android {
lintOptions {
warning "WrongConstant"
}
}