Kotlin在Android Studio 3.0-alpha8中应用()扩展lint消息

问题描述:

我有以下代码会产生以下lint错误。 lint issueKotlin在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中存在错误。

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

里面做参考Bundle类型不是BaseBundle

为什么我们首先有Lint错误?

+0

你怎么反编译的代码? – lelloman

+0

@lelloman我确实依赖Android Studio“显示Kotlin字节码”。在Android Studio窗格右侧显示的选项卡中有一个“反编译”按钮。另一种方法是使用“classyshark-bytecode-viewer”,但我没有尝试过。 –

+0

酷thx!我试过你的代码,我注意到一件事,如果我使TestKt类扩展了View,警告消失..:\ – lelloman

一种解决方法是使用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类和此方法putStringmovedBaseBundle。因此,当您在api 21及更高版本上调用该方法时,该方法属于BaseBundle,对于较低版本,它属于Bundle

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

+0

还有另一个问题:https://youtrack.jetbrains.com/issue/KT-17973 –