es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Jetpack Compose no respeta las clases de orden superior.

Cómo superar / resolver el siguiente fragmento para cumplir con el compilador de Jetpack Compose (muestra sintética):

enum class UINavigator: @Composable () -> Unit {
    MAIN;

<pre><code>private val nav: NavHostController = rememberNavController()

override operator fun invoke() = ...
</code></pre>

}

Error:

@Composable invocations can only happen from the context of a @Composable function

Sin embargo, UINavigator ya implementa una Función de Orden Superior.

¿Es un error o una restricción que no se cubre en la documentación?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para resolver el error y hacer que la clase enum UINavigator cumpla con el compilador de Jetpack Compose, necesitas hacer algunos ajustes:

    1. Elimina la anotación @Composable de la declaración de la clase enum.
    2. Implementa la función invoke como una función componible separada que toma un parámetro NavHostController.

    Tu código debería lucir así:

    enum class UINavigator {
        MAIN;
    
        operator fun invoke(navController: NavHostController) {
            navController.navigate("main")
        }
    }
    
    @Composable
    fun UINavigatorWrapper() {
        val navController = rememberNavController()
        UINavigator.MAIN(navController)
    }
    

    Al hacer esto, puedes llamar UINavigator.MAIN(navController) dentro de una función componible, lo cual cumple con el requisito del compilador de Jetpack Compose.

    Esto no es un error, sino más bien una restricción que está documentada en la documentación oficial de Jetpack Compose. La anotación @Composable solo puede usarse dentro de una función componible y no en otros contextos como las clases enum.

Comments are closed.