En aplicaciones móviles, es común la necesidad de pasar datos entre diferentes pantallas. Flutter proporciona varias maneras de hacerlo, dependiendo de la complejidad y los requisitos de la aplicación. En esta lección, exploraremos las técnicas más comunes para pasar datos entre pantallas en Flutter.
Contenido
Introducción
Pasar datos entre pantallas es una tarea fundamental en el desarrollo de aplicaciones móviles. En Flutter, esto se puede lograr de varias maneras, incluyendo el uso de constructores y el paquete Navigator
. A continuación, veremos cómo implementar estas técnicas con ejemplos prácticos.
Pasando Datos Usando el Constructor
La forma más sencilla de pasar datos entre pantallas es a través del constructor de la clase de la pantalla de destino. Este método es directo y fácil de entender.
Ejemplo
Supongamos que tenemos dos pantallas: HomeScreen
y DetailScreen
. Queremos pasar un mensaje desde HomeScreen
a DetailScreen
.
// HomeScreen.dart import 'package:flutter/material.dart'; import 'detail_screen.dart'; class HomeScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Home Screen'), ), body: Center( child: ElevatedButton( onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (context) => DetailScreen(message: 'Hello from HomeScreen!'), ), ); }, child: Text('Go to Detail Screen'), ), ), ); } } // DetailScreen.dart import 'package:flutter/material.dart'; class DetailScreen extends StatelessWidget { final String message; DetailScreen({required this.message}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Detail Screen'), ), body: Center( child: Text(message), ), ); } }
Explicación
- HomeScreen: En
HomeScreen
, usamosNavigator.push
para navegar aDetailScreen
. Pasamos el mensaje como un argumento del constructor. - DetailScreen: En
DetailScreen
, recibimos el mensaje a través del constructor y lo mostramos en unText
widget.
Pasando Datos Usando Navigator
Otra forma de pasar datos entre pantallas es usando el paquete Navigator
y el método pushNamed
. Este método es útil cuando se trabaja con rutas nombradas.
Ejemplo
Primero, definimos las rutas en el archivo principal de la aplicación.
// main.dart import 'package:flutter/material.dart'; import 'home_screen.dart'; import 'detail_screen.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', initialRoute: '/', routes: { '/': (context) => HomeScreen(), '/detail': (context) => DetailScreen(), }, ); } }
Luego, modificamos HomeScreen
y DetailScreen
para usar rutas nombradas.
// HomeScreen.dart import 'package:flutter/material.dart'; class HomeScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Home Screen'), ), body: Center( child: ElevatedButton( onPressed: () { Navigator.pushNamed( context, '/detail', arguments: 'Hello from HomeScreen!', ); }, child: Text('Go to Detail Screen'), ), ), ); } } // DetailScreen.dart import 'package:flutter/material.dart'; class DetailScreen extends StatelessWidget { @override Widget build(BuildContext context) { final String message = ModalRoute.of(context)!.settings.arguments as String; return Scaffold( appBar: AppBar( title: Text('Detail Screen'), ), body: Center( child: Text(message), ), ); } }
Explicación
- Definición de Rutas: En
main.dart
, definimos las rutas de la aplicación usando el parámetroroutes
deMaterialApp
. - HomeScreen: En
HomeScreen
, usamosNavigator.pushNamed
para navegar aDetailScreen
y pasamos el mensaje usando el parámetroarguments
. - DetailScreen: En
DetailScreen
, recuperamos el mensaje usandoModalRoute.of(context)!.settings.arguments
.
Ejercicio Práctico
Ejercicio
Crea una aplicación con dos pantallas: InputScreen
y DisplayScreen
. En InputScreen
, el usuario debe ingresar su nombre en un campo de texto. Al presionar un botón, navega a DisplayScreen
y muestra el nombre ingresado.
Solución
// main.dart import 'package:flutter/material.dart'; import 'input_screen.dart'; import 'display_screen.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', initialRoute: '/', routes: { '/': (context) => InputScreen(), '/display': (context) => DisplayScreen(), }, ); } } // input_screen.dart import 'package:flutter/material.dart'; class InputScreen extends StatelessWidget { final TextEditingController _controller = TextEditingController(); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Input Screen'), ), body: Padding( padding: const EdgeInsets.all(16.0), child: Column( children: [ TextField( controller: _controller, decoration: InputDecoration(labelText: 'Enter your name'), ), SizedBox(height: 20), ElevatedButton( onPressed: () { Navigator.pushNamed( context, '/display', arguments: _controller.text, ); }, child: Text('Submit'), ), ], ), ), ); } } // display_screen.dart import 'package:flutter/material.dart'; class DisplayScreen extends StatelessWidget { @override Widget build(BuildContext context) { final String name = ModalRoute.of(context)!.settings.arguments as String; return Scaffold( appBar: AppBar( title: Text('Display Screen'), ), body: Center( child: Text('Hello, $name!'), ), ); } }
Conclusión
En esta lección, hemos aprendido cómo pasar datos entre pantallas en Flutter usando dos métodos principales: a través del constructor y usando Navigator
con rutas nombradas. Ambas técnicas son útiles y pueden ser aplicadas dependiendo de las necesidades de tu aplicación. Practica estos métodos para familiarizarte con ellos y mejorar tus habilidades en Flutter.
En la próxima lección, exploraremos el concepto de Deep Linking y cómo implementarlo en tus aplicaciones Flutter.
Curso de Desarrollo con Flutter
Módulo 1: Introducción a Flutter
- ¿Qué es Flutter?
- Configuración del Entorno de Desarrollo
- Entendiendo la Arquitectura de Flutter
- Creando Tu Primera App con Flutter
Módulo 2: Conceptos Básicos de Programación en Dart
- Introducción a Dart
- Variables y Tipos de Datos
- Sentencias de Control de Flujo
- Funciones y Métodos
- Programación Orientada a Objetos en Dart
Módulo 3: Widgets en Flutter
- Introducción a los Widgets
- Widgets Stateless vs Stateful
- Widgets Básicos
- Widgets de Diseño
- Widgets de Entrada y Formularios
Módulo 4: Gestión de Estado
Módulo 5: Navegación y Enrutamiento
- Introducción a la Navegación
- Navegación Básica
- Rutas Nombradas
- Pasando Datos Entre Pantallas
- Deep Linking
Módulo 6: Redes y APIs
- Obteniendo Datos de Internet
- Parseo de Datos JSON
- Manejo de Errores de Red
- Usando APIs REST
- Integración con GraphQL
Módulo 7: Persistencia y Almacenamiento
- Introducción a la Persistencia
- Preferencias Compartidas
- Almacenamiento de Archivos
- Base de Datos SQLite
- Usando Hive para Almacenamiento Local
Módulo 8: Conceptos Avanzados de Flutter
- Animaciones en Flutter
- Custom Paint y Canvas
- Canales de Plataforma
- Isolates y Concurrencia
- Optimización de Rendimiento
Módulo 9: Pruebas y Depuración
- Introducción a las Pruebas
- Pruebas Unitarias
- Pruebas de Widgets
- Pruebas de Integración
- Técnicas de Depuración
Módulo 10: Despliegue y Mantenimiento
- Preparación para el Lanzamiento
- Construcción para iOS
- Construcción para Android
- Integración Continua/Despliegue Continuo (CI/CD)
- Mantenimiento y Actualización de Tu App