带有 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"      
  } 
}