Jetpack Compose es un moderno kit de herramientas de UI para Android, lanzado por Google, que tiene como objetivo simplificar y acelerar el desarrollo de interfaces de usuario. Es un marco declarativo que permite a los desarrolladores crear interfaces complejas con menos código, y es completamente compatible con las aplicaciones Android existentes. A continuación, se presentan algunos conceptos clave, características y pasos básicos para comenzar a usar Jetpack Compose.
Conceptos Clave
- UI Declarativa: A diferencia del enfoque imperativo tradicional (definir la interfaz en XML y manipularla con Java/Kotlin), Jetpack Compose utiliza funciones para describir el estado de la UI. Cuando el estado cambia, el marco actualiza automáticamente la interfaz.
- Funciones Composable: Estas son funciones anotadas con
@Composableque se utilizan para crear componentes de UI. Pueden llamarse de forma anidada para construir estructuras de UI jerárquicas. - Gestión de Estado: Con los tipos
StateyMutableState, puedes definir fuentes de datos reactivas dentro o fuera de las funciones Composable. Cuando el estado cambia, la UI asociada se recompondrá automáticamente. - Efectos Secundarios: En ocasiones, necesitas realizar operaciones que no dependen directamente de los parámetros de entrada, como iniciar coroutines o suscribirte a flujos de datos. Jetpack Compose proporciona APIs como
LaunchedEffect,DisposableEffectyrememberUpdatedStatepara manejar estos casos. - Soporte para Material Design: Incluye soporte integrado para componentes de Material Design, como botones, campos de texto, tarjetas, etc., y también ofrece la capacidad de personalizar temas.
Pasos Básicos para Usar Jetpack Compose
- Configuración del Proyecto
Para habilitar Jetpack Compose en tu proyecto, asegúrate de incluir las dependencias necesarias en tus archivos Gradle. Por ejemplo, en build.gradle (Project):
gradle ``` buildscript { dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0" // ... } }
Y en `build.gradle (Module)`:
gradle ```
android {
// ...
composeOptions {
kotlinCompilerExtensionVersion '1.5.3'
}
}
dependencies {
implementation "androidx.compose.material:material:1.5.0"
implementation "androidx.compose.ui:ui:1.5.0"
implementation "androidx.compose.ui:ui-tooling-preview:1.5.0"
debugImplementation "androidx.compose.ui:ui-tooling:1.5.0"
implementation "androidx.activity:activity-compose:1.7.2"
// ...
}
Asegúrate de ajustar los números de versión según las últimas versiones disponibles. 2. Creación de Funciones Composable
Escribe una función Composable simple, como una que muestre un componente de texto:
kotlin ``` @Composable fun Saludo(nombre: String) { Text(text = "¡Hola $nombre!") }
3. **Integración en Activity o Fragment**
Configura el contenido de tu Activity principal para que sea una función Composable:
kotlin ```
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material.Text
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Saludo("Android")
}
}
}
- Ejecución de la Aplicación
Construye y ejecuta tu aplicación. Deberías ver la interfaz generada por la función Composable Saludo.
Características Adicionales
- Animaciones: Usa
animate*AsStateyTransitionpara crear transiciones suaves. - Gestos: Utiliza
Modifier.pointerInputydetectTapGesturespara manejar eventos de toque. - Navegación: Usa la biblioteca
Compose Navigationpara gestionar la navegación entre pantallas. - Pruebas: Escribe pruebas unitarias e integradas para verificar el comportamiento de la UI.
Ejemplo de Código
A continuación, se muestra un ejemplo un poco más complejo que combina la gestión de estado y la interacción del usuario:
kotlin ``` import androidx.compose.foundation.layout.* import androidx.compose.material.Button import androidx.compose.material.Text import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp
@Composable fun AppContador() { var contador by remember { mutableStateOf(0) }
Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text("Contador: $contador")
Spacer(modifier = Modifier.height(8.dp))
Button(onClick = { contador++ }) {
Text("Incrementar")
}
}
}
Este código define una aplicación de contador que incluye un componente `Text` para mostrar el valor actual del contador y un `Button` para incrementarlo. Cada vez que se hace clic en el botón, la variable de estado `contador` se actualiza, lo que provoca que la UI se refresque automáticamente.