android: ¿Puedo almacenar una función componible en una variable?

CorePress2024-01-24  9

En Kotlin, la función es un ciudadano de primera clase. Podemos almacenar una función en una variable como se muestra a continuación

val functionVariable: () -> Unit = ::myFunction

fun myFunction() { }

Sin embargo, para la función @Composable, ¿cómo puedo hacerlo?

Si hice lo siguiente, aparecerá un error, es decir, org.jetbrains.kotlin.diagnostics.SimpleDiagnostic@e93b05f8 (error: no se pudo mostrar el mensaje)

val functionVariable: () -> Unit = ::myFunction

@Composable
fun myFunction() { }

¿Existe alguna manera de almacenar funciones componibles como una variable?

No estoy seguro de tu pregunta. Pruebe, por ejemplo: val botón = Botón(onClick = {}){Text("Botón 1")}

– Gabriele Mariotti

27 de marzo de 2021 a las 9:18

Quizás quieras explicar con mayor detalle qué es lo que significa "llorará mal". significa.

- CommonsWare

27/03/2021 a las 10:39

Probé val button = Button(onClick = {}){Text("Button 1")} pero no funciona. De todos modos, en realidad estoy planeando guardarlo en un function variable, para poder tener una función componible más dinámica (por ejemplo, almacenar en una var en lugar de una val)... Al igual que una función normal, podemos almacenar en una variable y luego llamar a function.invoke() cuando para activarlo.

- Elye

27/03/2021 a las 10:41

He añadido detalles sobre el mensaje de error @CommonsWare

- Elye

27/03/2021 a las 10:45

2

El complemento del compilador Compose Kotlin tiene limitaciones. Estás viendo la limitación en las referencias de funciones. Existen limitaciones similares en expresiones lambda, funciones locales y reflexión. Todos menos el reflejo probablemente estén bloqueados por este problema de Kotlin.

- CommonsWare

27 de marzo de 2021 a las 10:54



------------------------------------

La referencia de función componible aún no es compatible (y eso es lo que realmente es el mensaje de error). Además, la anotación @Composable es parte de la firma de la función porque agrega algunos parámetros a la función. Entonces necesitas usar la función val.ciónVariable: @Composable () -> Unidad = { miFunción() }.

0



------------------------------------

Puedes declarar una variable de función componible, como:

var functionVariable: @Composable () -> Unit = {}

Más tarde puedes reasignarlo (esencialmente redefinirlo) como:

functionVariable = { myFunction1() }

o

functionVariable = { myFunction2() }

Pero si ya tienes functionVariable insertada en tu Composable más grande, la reasignación probablemente no desencadenará la recomposición. Lo que hago es declarar una variable de estado como:

var functionAssigned by mutableStateOf(0)

Y en tu Composable más grande donde colocas functionVariable, haz:

if (functionAssigned >= 0) functionVariable()

Y siempre que quieras reasignar la variable, haz:

functionVariable = { myFunction2() }
functionAssigned++

Eso desencadenaránecesitaba recomposición.

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare