2017-07-31 15 views
6

次のlintエラーを生成する次のコードがあります。 lint issueAndroidスタジオ3.0-alpha8のKotlin apply()拡張lintメッセージ

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

メッセージは、下位APIにクラッシュするAPI 21が提供されてBaseBundleクラスにapply()ファンクションポイント内部そのthis基準を指摘しています。 Bundle#putString(key, value)は確実に下位バージョンで利用できますが、Android Studio 3.0-alpha8にエラーがあります。

私はこのよう逆コンパイルコードを見ることができるように、非常に奇妙な問題: decompiled

BundleタイプではないBaseBundleを参照してください。

最初にリントエラーが発生するのはなぜですか?

+0

? – lelloman

+0

@lelloman私はAndroid Studio "Show Kotlin Bytecode"に頼っていました。タブには、Android Studioペインの右側に表示される「デコンパイル」ボタンがあります。別の方法は "classyshark-bytecode-viewer"を使うことですが、私はそれを試していません。 –

+0

クールなthx!あなたのコードを試したところ、TestKtクラスをViewにすると警告が消えます。\ – lelloman

答えて

1

回避策の一つのように、let代わりのapplyを使用することです:どのようにあなたは、コードを逆コンパイルなかった

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

本当にバグのようですknown bugですが、Bundle.javaのソースコードを見ると警告が表示される理由は実際に分かります。 API 21 Bundle

は、方法(check here

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

を持っていたし、クラス自体には、スーパークラスがありませんでした。 api 21 Bundleから新しく追加されたBaseBundleクラスを拡張し、このメソッドputStringmovedからBaseBundleになりました。したがって、api 21以上のメソッドを呼び出すと、メソッドはBaseBundleに属し、下位バージョンはBundleに属します。

Bundle型変数でメソッドを直接呼び出すと、警告が表示されないため、これはapplyブロックと何らかの形で関連しています。

+0

もう一つの問題があります:https://youtrack.jetbrains.com/issue/KT-17973 –

関連する問題