La expresión lambda no se usa

Mientras usaba el Switch de Android, estaba adjuntando un setOnCheckedChangeListener y recibí esta advertencia

La expresión lambda no se usa. Si te refieres a un bloque, puedes usar 'ejecutar {…}'

Aquí 'el fragment de código:

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

Usar run soluciona esta advertencia, pero ¿alguien sabe la causa detrás de esto? ¿Cómo se usa la expresión lambda?

Está mezclando la notación lambda de Java con la notación lambda de Kotlin, creando una lambda que devuelve otra lambda anidada en este caso. La syntax correcta e idiomática sería así:

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

Sacando todo el ruido, una lambda normal se ve así:

 { arg1, arg2 -> returnValue } 

Tu hiciste esto:

 { arg1, arg2 -> { returnValue } } 

Que también podría escribirse así:

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

Esta notación hace que sea un poco más claro que el lambda no devuelve el valor de retorno, pero devuelve otro lambda sin parameters que devuelve el valor de retorno.

Por lo general, el comstackdor lo detendrá como un tipo de devolución incorrecto, pero en su caso, el valor de retorno de la lambda no se utiliza. Entonces, solo estás creando la lambda interna sin devolverla o ejecutarla, es por eso que recibes una advertencia.

Sí el

 _, isChecked -> { ... } 

Debe ser cambiado a

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

Así que simplemente elimine las llaves, porque si no, simplemente crea un bloque que no se ejecuta en absoluto. Alternativamente, también podrías hacer

 _, isChecked -> run { preferences.userStatus = isChecked switchToggleVisibility(isChecked) if (isChecked) { fetchStats() getOrders() } else { releaseOrder() } } 
  • Kotlin: lambdas seguros (sin pérdida de memory)?
  • Cómo escribir el generador HTML correcto en Kotlin
  • Kotlin: comparar los valores de propiedad de diferentes objects objective con (fuera) reflexión
  • ¿Pasar lambdas a Observable.subscribe en kotlin dará como resultado pérdidas de memory?
  • Kotlin lambdas y tipo de inferencia
  • ¿Cómo escribir lambdas con generics en kotlin?
  • Kotlin: Declaración a Lambda
  • ¿Cómo pasar arguments a la function lambda anónima en Kotlin?
  • ¿Cómo omitir los parameters lambda en Kotlin?
  • Inicializador de propiedad de múltiples líneas / complejo sin lambda
  • java.lang.NoClassDefFoundError $$ inlined $ forEach $ lambda $ 1 en Kotlin