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
已经 moved 到 BaseBundle
。所以,当你在api 21及以上调用该方法时,该方法属于BaseBundle
,对于低版本它属于Bundle
。
这在某种程度上与 apply
块有关,因为如果您直接在 Bundle
类型的变量上调用该方法,则不会出现警告。
一种解决方法是使用 let
而不是 apply
,例如:
fun newInstance(message: String?): DialogFragment {
return DialogFragment().apply {
arguments = Bundle().let {
it.putString("arg", message)
it
}
}
}
我有以下代码会产生以下 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
已经 moved 到 BaseBundle
。所以,当你在api 21及以上调用该方法时,该方法属于BaseBundle
,对于低版本它属于Bundle
。
这在某种程度上与 apply
块有关,因为如果您直接在 Bundle
类型的变量上调用该方法,则不会出现警告。
一种解决方法是使用 let
而不是 apply
,例如:
fun newInstance(message: String?): DialogFragment {
return DialogFragment().apply {
arguments = Bundle().let {
it.putString("arg", message)
it
}
}
}