Android Studio 3.0-alpha8 中的 Kotlin apply() 扩展 lint 消息

Kotlin apply() extension lint message in Android Studio 3.0-alpha8

我有以下代码会产生以下 lint 错误。

fun newInstance(message: String?): DialogFragment {
    return DialogFragment().apply {
        arguments = Bundle().apply {
            putString("arg", message)
        }
    }
}

该消息指出 apply() 函数中的 this 引用指向 BaseBundle class 自 API 21 后可用,这将在较低时崩溃API。 Bundle#putString(key, value)低版本肯定可以,但是AndroidStudio 3.0-alpha8.

有错误

这个问题很奇怪,因为我可以看到反编译代码是这样的:

参考 Bundle 类型不是 BaseBundle

为什么我们首先出现 Lint 错误?

它真的看起来像一个错误它是一个 known bug 但如果查看 Bundle.java 来源,实际上可以明白为什么你会收到警告代码。

之前api21Bundle有个方法(check here)

public void putString(@Nullable String key, @Nullable String value)

而 class 本身没有超级 class。从 api 21 Bundle 扩展了新添加的 BaseBundle class 并且此方法 putString 已经 movedBaseBundle。所以,当你在api 21及以上调用该方法时,该方法属于BaseBundle,对于低版本它属于Bundle

这在某种程度上与 apply 块有关,因为如果您直接在 Bundle 类型的变量上调用该方法,则不会出现警告。

一种解决方法是使用 let 而不是 apply,例如:

fun newInstance(message: String?): DialogFragment {
    return DialogFragment().apply {
        arguments = Bundle().let {
            it.putString("arg", message)
            it
        }
    }
}