2017-07-21 26 views
5

Podczas korzystania z Androidem Switch, byłem załączając setOnCheckedChangeListener do niego i dostaje to ostrzeżenieWyrażenie lambda jest nieużywany

Wyrażenie lambda jest niewykorzystana. Jeśli masz na myśli blok, można użyć „run {...}”

Oto fragment kodu:

switchAction.setOnCheckedChangeListener({ 
    _, isChecked -> 
    { 
     preferences.userStatus = isChecked 
     switchToggleVisibility(isChecked) 
     if (isChecked) { 
      fetchStats() 
      getOrders() 
     } else { 
      releaseOrder() 
     } 
    } 
}) 

Korzystanie run ma naprawić to ostrzeżenie, ale nie każdy wie, za przyczynę to? W jaki sposób wyrażenie lambda nie jest używane?

Odpowiedz

1

Tak,

_, isChecked -> 
    { ... } 

muszą zostać zmienione na

_, isChecked -> 
    preferences.userStatus = isChecked 
    switchToggleVisibility(isChecked) 
    if (isChecked) { 
     fetchStats() 
     getOrders() 
    } else { 
     releaseOrder() 
    } 

Więc po prostu usuń nawiasy klamrowe, bo inaczej po prostu stworzyć blok, który nie jest zrealizowane w ogóle. Ewentualnie można również zrobić

_, isChecked -> 
    run { 
     preferences.userStatus = isChecked 
     switchToggleVisibility(isChecked) 
     if (isChecked) { 
      fetchStats() 
      getOrders() 
     } else { 
      releaseOrder() 
     } 
    } 
10

Ty mieszanie notacji lambda Javy z notacji lambda Kotlin, tworząc lambda, która zwraca inną zagnieżdżony lambda w tym przypadku. Prawidłowe i idiomatyczne składnia będzie wyglądać następująco:

switchAction.setOnCheckedChangeListener { _, isChecked -> 
    preferences.userStatus = isChecked 
    switchToggleVisibility(isChecked) 
    if (isChecked) { 
     fetchStats() 
     getOrders() 
    } else { 
     releaseOrder() 
    } 
} 

Biorąc wszystko hałas na zewnątrz, normalny lambda wygląda następująco:

{ arg1, arg2 -> returnValue } 

Zrobiłeś to:

{ arg1, arg2 -> { returnValue } } 

które mogłyby również być napisane tak:

{ arg1, arg2 -> { -> returnValue } } 

Ta notacja czyni nieco jaśniejszym, że lambda nie zwraca wartości zwracanej, ale zwraca inną wartość lambda bez parametrów zwracających wartość zwracaną.

Zwykle zostanie to przechwycone przez kompilator jako zły typ zwracanego elementu, ale w twoim przypadku nie zostanie użyta zwracana wartość lambda. Więc właśnie tworzysz wewnętrzną lambdę, nie zwracając jej ani nie uruchamiając, dlatego otrzymujesz ostrzeżenie.