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

时间:2017-07-31 12:27:24

标签: android android-studio kotlin lint

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

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

该消息指出this内部的apply()引用指向自API 21以来可用的BaseBundle类,它将在较低的API上崩溃。 Bundle#putString(key, value)绝对可以在较低版本上使用,但Android Studio 3.0-alpha8中存在错误。

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

哪个引用Bundle类型不是BaseBundle

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

2 个答案:

答案 0 :(得分:3)

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

在api 21之前Bundle有一个方法(check here

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

并且班级本身没有超级班级。从api 21 Bundle扩展了新添加的BaseBundle类,此方法putStringmovedBaseBundle。因此,当您在api 21及更高版本上调用该方法时,该方法属于BaseBundle,对于较低版本,它属于Bundle

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

答案 1 :(得分:1)

一种解决方法是使用let代替apply,例如:

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