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

亲爱的Stackoverflow同仁! 我有以下代码,产生followin lint错误。 皮棉问题

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

该消息指出, apply()函数中的this引用指向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 } } } 

它看起来像一个错误这是一个已知的错误,但实际上可以看到为什么你看到的Bundle.java源代码的警告。

之前api 21 Bundle有一个方法( 在这里检查 )

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

而班级本身没有超班。 从api 21 Bundle扩展了一个新添加的BaseBundle类,并且这个方法的BaseBundle被移到了BaseBundle 。 所以,当你调用API 21以上的方法时,该方法属于BaseBundle ,对于较低版本,它属于Bundle

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