2017-05-20 3 views
0

Ich habe eine Funktion implementiert, die ich anko ApplyRecursive übergeben habe.Kotlin Smartcast funktioniert nicht für LinearLayout.LayoutParams

Innerhalb dieser Funktion würde Ich mag ein marginEnd hinzuzufügen, ist der Blick ins Innere eines Linearlayout ist, so habe ich den folgenden Code:

when(view.layoutParams) { 
    is LinearLayout.LayoutParams -> { 
     view.layoutParams.marginEnd = view.resources.getDimensionPixelSize(R.dimen.min_spacing) 
    } 
} 

Und ich erhalten den Fehler, dass die view.layoutParams ein veränderliches ist Eigenschaft, die geändert werden könnte. So hatte ich die Besetzung zu zwingen:

when(view.layoutParams) { 
    is LinearLayout.LayoutParams -> { 
     (view.layoutParams as LinearLayout.LayoutParams).marginEnd = view.resources.getDimensionPixelSize(R.dimen.min_spacing) 
    } 
} 

hier bei Stackoverflow Blick sah ich, dass Kotlin nicht klug Guss in Variablen, die NULL-Werte zulässt sein kann, aber die view.layoutParams NULL ist nicht zulässig, also warum die intelligente Guss kann folgst du nicht auf den Typ?

+0

Uhm, weil es wandelbar ist, da die Fehlermeldung sagt? Nullbarkeit hat nichts mit intelligenten Casts zu tun. – yole

Antwort

4

Smartcast funktioniert in diesem Fall nicht, da sich der Typ der Variablen, mit der Sie die Typprüfung durchgeführt haben, möglicherweise geändert hat (z. B. durch einen anderen Thread), und wenn ja, Sie würde eine Laufzeitausnahme erhalten, wenn Sie versuchen, es zu übertragen.

Die Lösung ist entweder die Besetzung manuell zu tun, wie du getan hast, oder eine temporäre val auf Ihre Funktion einzuführen, die Smart-Besetzung auf funktionieren wird, da wir seine Art kennen wird sich nicht ändern:

val params = view.layoutParams 
when(params) { 
    is LinearLayout.LayoutParams -> { 
     params.marginEnd = view.resources.getDimensionPixelSize(R.dimen.min_spacing) 
    } 
} 

Edit: als zusätzliche Anmerkung, können Sie auch diese Variable einführen, indem let mit:

view.layoutParams.let { params -> 
    when(params) { 
     is LinearLayout.LayoutParams -> { 
      params.marginEnd = view.resources.getDimensionPixelSize(R.dimen.min_spacing) 
     } 
    } 
} 
Verwandte Themen