Rutas en Flutter

- Andrés Cruz

Rutas en Flutter

Conceptos y clases centrales del ruteo en Flutter

Ruta: una ruta es una especie de abstracción de una "pantalla" o "página" de una aplicación, en este caso una aplicación de Flutter puedes ver una similitud entre una URL de un navegador y una página a la cual queremos acceder. Navegador: Crea un widget (una página que generalmente es un Stateless o un StateFul): además de esto, mantiene un historial basado en la pila de widgets ya que cada vez que vamos navegando; es decir, abriendo nuevas páginas o pantallas, se van apilando las mismas en una pila. Un navegador puede empujar y desplegar rutas para ayudar al usuario a moverse de una pantalla a otra. MaterialPageRoute: una ruta modal que reemplaza toda la pantalla con una transición adaptable a la plataforma; esto nosotros lo podemos personalizar para hacer transiciones o animaciones personalizadas para pasar entre una página a otra empleando el componente de navegación que te comentaba anteriormente; por lo tanto es el mecanismo más potente y con esto también el más complicado para hacer las transiciones entre pantallas.

Adaptar la transición entre pantallas según la plataforma

Recordemos que podemos crear distintas aplicaciones para distintas plataformas con un solo proyecto; cada plataforma tiene sus particularidades, sobre todo Android e iOS que tienes tanto estilos diferentes, pasando por transiciones de pantallas distintas.

La transición que ve al pasar de una pantalla a otras pantallas:

  • Para Android, la transición de entrada de la página desliza la página hacia arriba y se desvanece. La transición de salida es la misma pero a la inversa.
  • Para iOS, la página se desliza desde la derecha y sale al revés. La página también se desplaza hacia la izquierda en paralaje cuando entra otra página para cubrirla.

Todos estos son aspectos personalizables y que podemos adaptar mediante los Material Route que te explicaba anteriormente.

Esta transición ocurre solo debido a MaterialPageRoute. También puede modificar esta transición. Para modificar esta transición, debe jugar con MaterialPageRoute o PageRouteBuilder.

Las aplicaciones móviles suelen mostrar elementos de pantalla completa llamados "pantallas" o "páginas". En Flutter, estos elementos se denominan rutas y son administrados por un widget Navigator. El navegador administra una pila de objetos de ruta y proporciona métodos para administrar la pila, como Navigator.push y Navigator.pop.

Ejemplo 1: enrutamiento simple

En este ejemplo, puede ver que:

Se usa el método Navigator.push para enrutar a la nueva pantalla  Se usa el método Navigator.pop para regresar.

Navigator mantiene el historial de rutas basado en la pila y lo que esté en la parte superior de la pila que es nuestra página actual en nuestra aplicación.

Navigator.push toma dos argumentos (BuildContext, Route <T>). En lugar de Ruta, estamos usando MaterialPageRoute que reemplaza toda la pantalla con una transición adaptativa a la plataforma.

En nuestro main.dart, tenemos que configurar todas las rutas que nosotros vayamos a emplear para realizar la navegación; son las páginas que generalmente corresponden a archivos separados; de tal manera que una estructura común es tener un archivo por página:

import 'package:flutter/material.dart';

Vamos a crear una archivo nuevo, que corresponde a una página dentro de la carpeta llamada lib; el archivo va a ser pages/home.dart:

import 'package:flutter/material.dart';
import 'package:pruebas/pages/second.dart';
 
class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: new Center(
        child: ElevatedButton(
          onPressed: () {
            Route route = MaterialPageRoute(builder: (context) => SecondPage());
            Navigator.push(context, route);
          },
          child: Text('Home'),
        ),
      ),
    );
  }
}

Y otra más, llamada pages/second.dart:

import 'package:flutter/material.dart';
 
class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Second Home'),
      ),
      body: new Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.pop(context);
          },
          child: Text('Go Back'),
        ),
      ),
    );
  }
}

Ejemplo 2: Enrutamiento con nombre

En este ejemplo, puede ver que estoy usando el método Navigator.pushNamed para enrutar a la nueva pantalla y Navigator.pop para regresar. Navigator mantiene un historial de rutas basado en pilas.

Navigator.pushNamed toma dos argumentos obligatorios (BuildContext, String, {Object}) y un argumento opcional. En lugar de String, estamos pasando el String que habíamos predefinido en rutas. Si tiene alguna idea sobre expressjs, le resultará muy familiar. Como le dije anteriormente, MaterialPageRoute es responsable de la transición de página y aquí, en este código completo, no he usado este MaterialPageRoute, entonces puede ser un poco difícil para usted cambiar la transición de página.

class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Second Home'),
      ),
      body: new Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.pop(context);
          },
          child: Text('Go Back'),
        ),
      ),
    );
  }
}

1 Esta fue la ruta básica y ahora quiero contarles algo sobre los ejemplos anteriores. Si en su ruta "/" está presente, entonces no es obligatorio definir la ruta inicial. Hará "/" como su ruta inicial y si desea que su ruta inicial sea diferente de "/", entonces puede definir.

MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Material App',
      routes: {'/': (_) => HomePage(), 'second': (_) => SecondPage()},
    )

2 Esta fue la ruta básica y ahora quiero contarles algo sobre los ejemplos anteriores. Si en su ruta "/" está presente, entonces no es obligatorio definir la ruta inicial. Hará "/" como su ruta inicial y si desea que su ruta inicial sea diferente de "/", entonces puede definir.

MaterialApp( home: SecondHome(), routes: <String, WidgetBuilder>{   '/home': (context) => HomePage(),   '/second': (context) => SecondPage(), }, ),

3. Si desea que cuando alguna ruta no coincida, debería mostrar la pantalla de error de "enlace 404" no encontrado, entonces puede usar:

MaterialApp(
 routes: <String, WidgetBuilder>{
...
 },
 onUnknownRoute: (RouteSettings setting) {
   String unknownRoute = setting.name ;
   return new MaterialPageRoute(
               builder: (context) => NotFoundPage()
   );
 }
),

Ejemplo 3: onGenerateRoute

Aquí puede ver que estoy usando MaterialPageRoute y ahora puede modificar fácilmente la animación de transición. En este caso, no es necesario que las rutas onGenerateRoute creará las rutas por usted. Técnicamente, las rutas están presentes allí, pero usted no las inicializa. onGenerateRoute: crea una ruta para la configuración de ruta dada:

return MaterialApp(
      home: HomePage(),
      onGenerateRoute: (RouteSettings settings) {
        switch (settings.name) {
          case '/':
            return MaterialPageRoute(builder: (context) => HomePage());
            break;
          case '/second':
            return MaterialPageRoute(builder: (context) => SecondPage());
            break;
        }
      },
    );

Material fuente

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz en Udemy

Acepto recibir anuncios de interes sobre este Blog.