La navegación en Flutter es como cambiar de una página a otra en tu app. Es súper fácil una vez que entiendes los conceptos básicos.
Pantallas en Flutter son widgets que representan una única vista en tu app. Cada pantalla tiene su propia clase y su propio método build().
import 'package:flutter/material.dart';
class MiPantalla extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Mi Pantalla'),
),
body: Center(
child: Text('¡Hola desde mi pantalla!'),
),
);
}
} Aquí tienes la pantalla principal de tu app. Cuando se abre, muestra un botón que, al ser presionado, navega a la segunda pantalla.
import 'package:flutter/material.dart';
class PantallaPrincipal extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Pantalla Principal'),
backgroundColor: Colors.blue,
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'¡Bienvenido!',
style: TextStyle(fontSize: 24),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// Navegar a la segunda pantalla
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SegundaPantalla(),
),
);
},
child: Text('Ir a Segunda Pantalla'),
),
],
),
),
);
}
} Aquí tienes la segunda pantalla de tu app. Cuando se abre, muestra un botón que, al ser presionado, vuelve a la pantalla principal.
class SegundaPantalla extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Segunda Pantalla'),
backgroundColor: Colors.green,
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'¡Estás en la segunda pantalla!',
style: TextStyle(fontSize: 20),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// Volver a la pantalla anterior
Navigator.pop(context);
},
child: Text('Volver Atrás'),
),
],
),
),
);
}
} El archivo main.dart es el punto de entrada de tu app. Asegúrate de configurar la MaterialApp con la PantallaPrincipal como la pantalla inicial.
import 'package:flutter/material.dart';
void main() {
runApp(MiApp());
}
class MiApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
title: 'Navegación Flutter',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: PantallaPrincipal(), // Pantalla inicial
);
}
} Aquí tienes un ejemplo de cómo enviar datos de una pantalla a otra. En la pantalla que envía, cuando se presiona el botón, se navega a la PantallaConDatos y se pasa el nombre y la edad.
// En la pantalla que envía
ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PantallaConDatos(
nombre: 'Juan',
edad: 25,
),
),
);
},
child: Text('Enviar Datos'),
) class PantallaConDatos extends StatelessWidget {
final String nombre;
final int edad;
// Constructor que recibe los datos
PantallaConDatos({required this.nombre, required this.edad});
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Datos Recibidos')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Nombre: $nombre', style: TextStyle(fontSize: 20)),
Text('Edad: $edad años', style: TextStyle(fontSize: 20)),
SizedBox(height: 20),
ElevatedButton(
onPressed: () => Navigator.pop(context),
child: Text('Volver'),
),
],
),
),
);
}
} En este ejemplo, se definen tres rutas: /, /segunda, y /tercera. La ruta inicial es /, que se mapea a la PantallaPrincipal.
class MiApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
title: 'App con Rutas',
initialRoute: '/', // Ruta inicial
routes: {
'/': (context) => PantallaPrincipal(),
'/segunda': (context) => SegundaPantalla(),
'/tercera': (context) => TerceraPantalla(),
},
);
}
} Para navegar a una ruta nombrada, como /segunda, puedes usar Navigator.pushNamed(context, '/segunda'). Esto navega a la SegundaPantalla.
// Ir a una ruta nombrada
ElevatedButton(
onPressed: () {
Navigator.pushNamed(context, '/segunda');
},
child: Text('Ir a Segunda'),
)
// Volver atrás
ElevatedButton(
onPressed: () {
Navigator.pop(context);
},
child: Text('Volver'),
) import 'package:flutter/material.dart';
void main() => runApp(MiApp());
class MiApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: Inicio(),
);
}
}
class Inicio extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Inicio')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () => Navigator.push(
context,
MaterialPageRoute(builder: (context) => Perfil()),
),
child: Text('Ver Perfil'),
),
SizedBox(height: 10),
ElevatedButton(
onPressed: () => Navigator.push(
context,
MaterialPageRoute(builder: (context) => Configuracion()),
),
child: Text('Configuración'),
),
],
),
),
);
}
}
class Perfil extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Perfil')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Mi Perfil', style: TextStyle(fontSize: 24)),
SizedBox(height: 20),
ElevatedButton(
onPressed: () => Navigator.pop(context),
child: Text('Volver al Inicio'),
),
],
),
),
);
}
}
class Configuracion extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Configuración')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Configuración', style: TextStyle(fontSize: 24)),
SizedBox(height: 20),
ElevatedButton(
onPressed: () => Navigator.pop(context),
child: Text('Volver al Inicio'),
),
],
),
),
);
}
} Scaffold en tus pantallasAppBar automáticamente agrega el botón “atrás”