Kotlin在Android Studio 3.0-alpha8中应用()扩展lint消息
我有以下代码会产生以下lint错误。 Kotlin在Android Studio 3.0-alpha8中应用()扩展lint消息
fun newInstance(message: String?): DialogFragment {
return DialogFragment().apply {
arguments = Bundle().apply {
putString("arg", message)
}
}
}
该消息指出this
参考内部apply()
功能指向BaseBundle
类,它是可用的API以来21会崩溃较低API。 Bundle#putString(key, value)绝对可用于较低版本,但Android Studio 3.0-alpha8中存在错误。
里面做参考Bundle
类型不是BaseBundle
。
为什么我们首先有Lint错误?
一种解决方法是使用let
代替apply
,如:
fun newInstance(message: String?): DialogFragment {
return DialogFragment().apply {
arguments = Bundle().let {
it.putString("arg", message)
it
}
}
}
它确实看起来像一个错误这是一个known bug但实际上可以看到为什么你看到Bundle.java源代码时得到警告。
API 21 Bundle
之前有一个方法(check here)
public void putString(@Nullable String key, @Nullable String value)
和类本身并没有超类。从api 21 Bundle
扩展新增BaseBundle
类和此方法putString
已moved到BaseBundle
。因此,当您在api 21及更高版本上调用该方法时,该方法属于BaseBundle
,对于较低版本,它属于Bundle
。
这与apply
块有某种关系,因为如果直接调用Bundle
-类型变量的方法,则不会出现警告。
还有另一个问题:https://youtrack.jetbrains.com/issue/KT-17973 –
你怎么反编译的代码? – lelloman
@lelloman我确实依赖Android Studio“显示Kotlin字节码”。在Android Studio窗格右侧显示的选项卡中有一个“反编译”按钮。另一种方法是使用“classyshark-bytecode-viewer”,但我没有尝试过。 –
酷thx!我试过你的代码,我注意到一件事,如果我使TestKt类扩展了View,警告消失..:\ – lelloman