Saltar a contenido

93. 1. Jetpack Compose

Algunas características:
Características:
* Programación Declarativa: Jetpack Compose utiliza el paradigma de programación declarativa. En lugar de describir los pasos para alcanzar un cierto estado en la UI (como se hace en la programación imperativa), simplemente describes cómo debería ser la UI en términos del estado actual de la aplicación. De esta forma, el framework se encarga de actualizar la UI cuando cambia el estado de la aplicación
* Funciones Composables: Las funciones "composables" son el bloque de construcción básico en Jetpack Compose. Estas funciones, marcadas con el modificador @Composable, pueden invocar a otras funciones composables para crear y componer una interfaz de usuario. Cuando el estado de los datos cambia, estas funciones se vuelven a ejecutar para reflejar los cambios en la UI.
* State: Jetpack Compose proporciona un sistema de manejo de estados para poder reaccionar a los cambios en el estado de la aplicación. Cuando un valor de estado cambia, el sistema de Compose "recompone" o vuelve a ejecutar todas las funciones que dependen de ese estado, actualizando la UI para reflejar los cambios.
* Modificadores: Los modificadores en Compose son funciones que configuran o ajustan la apariencia y el comportamiento de los elementos de la UI. Permiten añadir estilo, clics, scrolling, padding, etc.
* Interoperabilidad: Jetpack Compose puede coexistir con el sistema de UI de Android existente, lo que permite a los desarrolladores adoptarlo gradualmente en sus aplicaciones existentes sin tener que reescribir todo desde cero.

Otra:
* Se regeneran las pantallas solamente en los componentes que cambian. * Widgets sin estados

Las UI se declaran en funciones con anotación @Composable:

@Composable
fun Greeting(name: String){
        Text("Hola")
}
Aquí "Text" es una función, no una clase. En Jetpack compose el convenio es escribir las funciones composable iniciando en mayúsculas Las funciones Composable admiten parámetros.

Aspectos de las funciones Compose:
* La función lleva la notación @Composable * La función C puede aceptar parámtros * La función es idempotente, y no tiene efectos secundarios * Se comporta igual cuando se llama varias veces * Sin efectos secundarios: No cambia variables globales, propiedades, etc.

93.1 1.1. Arquitectura

Los elementos de la IU son jerárquicos: se contienen unos a otros formando un árbol

[todo] Seguir aquí: https://developer.android.com/jetpack/compose/mental-model?hl=es-419

93.1.1 1.1.1. Recomposición

93.2 1.2. Navegación

https://developer.android.com/jetpack/compose/navigation?hl=es-419

el video: https://youtu.be/nwdc1ct06TI

93.3 1.3. Material Design

Compose incluye implementaciones de Material Design, listos para usar. Material Design se basa en tres pilares: * Color * Typography * Shape

En el siguiente ejemplo se cambia el estilo del título y el borde de la imagen usando Material Design:

// ...
import androidx.compose.foundation.border
import androidx.compose.material.MaterialTheme

@Composable
fun MessageCard(msg: Message) {
   Row(modifier = Modifier.padding(all = 8.dp)) {
       Image(
           painter = painterResource(R.drawable.profile_picture),
           contentDescription = null,
           modifier = Modifier
               .size(40.dp)
               .clip(CircleShape)
               .border(1.5.dp, MaterialTheme.colors.secondary, CircleShape)
       )

       Spacer(modifier = Modifier.width(8.dp))

       Column {
           Text(
               text = msg.author,
               color = MaterialTheme.colors.secondaryVariant
           )

           Spacer(modifier = Modifier.height(4.dp))
           Text(text = msg.body)
       }
   }
}

93.4 1.4. Modificadores (para los componentes)

Permiten establecer cualquier propiedad de los componentes.
Además permite hacer "pulsable" cualquier componente.
Usamos la clase estática Modifier
Podemos encadenar métodos de Modifier:


El orden de aplicación es en el que aparece llamado.

Qué podemos modificar:

93.4.1 1.4.1. Pading

Espacios entre el comopente y el borde

93.5 1.5. Personalizar componentes ("customize")

93.5.1 1.5.1. TextStyle

Para cualquier componente de texto.: * Color * fontWeight * fontSize * ...

Y estilos de Material Design, Ejemplo:

Text(text="hola",
    style= MaterialTheme.typography.button
)
Aplicara: * fontFamily: Roboto * fontSize: 14sp * letterSpaccing: 1.25so

94. 2. Componentes.

Seguir en este documento local

94.1 2.1. Reutilizar Componentes

Utilizamos funciones Composable con o sin parámetros e incluirlas en Surface o cualquier contenedor

94.2 2.2. Estados (State)

En la recomposición se repinta la pantalla de los componentes con configuración de "state".
State es un componente Composable. Diagrama como se actualiza los estados.

State (los datos) desacoplados de la vista.

ver https://openwebinars.net/academia/aprende/crear-interfaz-usuario-jetpack-compose/13442/

94.2.1 2.2.1. Patrón State Hoisting

Se mueven todos los estados de los componentes hijos a los padres. Sólo el patrón padre maneja los estados.

Para conseguir esto sustituimos los estados en los hijos por dos parámetros en cada función hija: 1. value: T Valor para mostrar. 2. onValueschande: (T) -> Unit : lambda, evento que dispara la modificación del estado.

Ejemplo: Esta primera función es el componente padre. Gestiona el estado studenState y recibe en la función lambda final con que se llama a StudentList ()

Padre
@Composable  
fun MainScreen() {  
    val studentsState = remember { mutableStateListOf("Esther", "Jaime") }  
    Surface(  
        color = Color.LightGray,  
        modifier = Modifier.fillMaxSize()  
    ) {  
        StudentList(studentsState) {  
            studentsState.add("Miguel")  
        }  
 }}
Función hija
@Composable  
fun StudentList(students: List<String>, onButtonClick: () -> Unit) {  
    Column(  
        modifier = Modifier.fillMaxSize(),  
        horizontalAlignment = Alignment.CenterHorizontally  
    ) {  
        for (student in students) {  
            StudentText(name = student)  
        }  
        Button(  
            onClick = onButtonClick,  
        ) {  
            Text(text = "Add new student")  
        }
    }
}

94.3 Apendice

Enlaces

Videos: * Android Kotlin desde cero parte I. * Lista de ejemplos de proyectos en github con compose * Multiples ejemplos composeacademy

ver 0.8 3-11-23