2017-07-31 89 views
6

我有以下代碼會產生以下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

回答

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類和此方法putStringmovedBaseBundle。因此,當您在api 21及更高版本上調用該方法時,該方法屬於BaseBundle,對於較低版本,它屬於Bundle

這與apply塊有某種關係,因爲如果直接調用Bundle-類型變量的方法,則不會出現警告。

+0

還有另一個問題:https://youtrack.jetbrains.com/issue/KT-17973 –