Hemos visto como mostrar un objeto de la clase List empleando a la función componible LazyColumn e items, veremos como trabajar con listas que mantienen el estado, para que cada vez que agreguemos un elemento a la lista, el mismo se muestre en la pantalla gracias a Compose.
Se deben disponer dos controles para el ingreso del nombre de un contacto y su mail. Al presionar un botón almacenar dichos valores en una lista con estado y mostrar todos los contactos en pantalla.
La interfaz previa a ingresar datos debe aparecer:
Luego que ingresamos varios datos se debe mostrar mediante LazyColumn cada uno de los contactos:
El código fuente es:
package com.tutorialesprogramacionya.compose10 import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material.Button import androidx.compose.material.Divider import androidx.compose.material.OutlinedTextField import androidx.compose.material.Text import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { AdministrarContactos() } } } data class Contacto(val nombre: String, val mail: String) val contactos = mutableStateListOf<Contacto>() @Composable fun AdministrarContactos() { var nombre by remember { mutableStateOf("") } var mail by remember { mutableStateOf("") } Column() { OutlinedTextField(value = nombre, onValueChange = {nombre = it},label={Text("Nombre de contacto")},modifier= Modifier .fillMaxWidth() .padding(5.dp)) OutlinedTextField(value = mail, onValueChange = {mail = it},label={Text("mail")},modifier= Modifier .fillMaxWidth() .padding(5.dp)) Button(onClick = { val nuevoContacto=Contacto(nombre,mail) contactos.add(nuevoContacto) nombre="" mail="" },modifier=Modifier.padding(5.dp)) { Text(text = "Agregar",modifier=Modifier.fillMaxWidth()) } LazyColumn() { items (contactos) {contacto-> MostrarContacto(contacto) } } } } @Composable fun MostrarContacto(contacto:Contacto) { Text(text = contacto.nombre) Text(text = contacto.mail) Divider(modifier= Modifier .fillMaxWidth() .width(4.dp),color= Color.Black) }
Fuera de la clase MainActivity y cualquier otra función componible, definimos una variable global que almacenará una lista mutable con estado de la clase 'Contacto':
data class Contacto(val nombre: String, val mail: String) val contactos = mutableStateListOf<Contacto>()
Cuando se modifique la lista, por ejemplo se agregue un elemento, Compose se encargará de actualizar en la interfaz visual todos los lugares donde se haga referencia a la misma.
Hemos creado dos funciones componibles, la primera que llamamos desde el MainActivity se llama 'AdministrarContactos'. En esta función definimos dos variables para guardar el estado de los controles OutlineTextField:
var nombre by remember { mutableStateOf("") } var mail by remember { mutableStateOf("") } Column() { OutlinedTextField(value = nombre, onValueChange = {nombre = it},label={Text("Nombre de contacto")},modifier= Modifier .fillMaxWidth() .padding(5.dp)) OutlinedTextField(value = mail, onValueChange = {mail = it},label={Text("mail")},modifier= Modifier .fillMaxWidth() .padding(5.dp))
También llamamos a la función componible 'Button' y definimos una función lambda para el click del mismo, donde procedemos a llamar al método add para añadir un elemento a la lista mutable (recordemos que esto dispara la recomposición de la pantalla y se muestra el nuevo contacto ingresado):
Button(onClick = { val nuevoContacto=Contacto(nombre,mail) contactos.add(nuevoContacto) nombre="" mail=""
Finalmente llamamos a la función LazyColumn que mostrará cada elemento de la lista 'contactos':
LazyColumn() { items (contactos) {contacto-> MostrarContacto(contacto) } }
La segunda función componible que implementamos se llama 'MostrarContacto', la misma tiene por objetivo mostrar el nombre y mail del contacto que llega como parámetro y una línea divisoria:
@Composable fun MostrarContacto(contacto:Contacto) { Text(text = contacto.nombre) Text(text = contacto.mail) Divider(modifier= Modifier .fillMaxWidth() .width(4.dp),color= Color.Black) }
Este proyecto lo puede descargar en un zip desde este enlace: Compose10.zip