Pasar Argumentos entre páginas

Los argumentos son información que se quiere pasar de una pantalla a otra, como el usuario de un login, información de un producto, etc. 

Existen dos maneras de pasar argumentos de una página a otra. Una es mediante el método pushNamed() del Navigator y el otro es pasarlos directamente por el contructor de la clase del Widget, mediante el método onGenerateRoute() en el widget padre, en el main.dart

Forma #1

Se hace uso del paraámetro con nombre arguments, del navigator, que se incluye en en cualquiera de sus métodos para navegar. 

  • Por el lado que se quiere pasar se hace esto: 

Navigator.pushNamed(context, 'details', arguments: movie);

(‘details’ es la página y movie es el objeto con los argumentos)

  • Por el lado receptor se hace esto, (generalmente en el build() del widget para obtener un contexto):

_movie = ModalRoute.of(context).settings.arguments;

Forma  #2

La principal característica es que la información se recibe en el constructor de la página, como si gueran argumentos de un objeto. 

En lugar de utilizar la propiedad routes:{} para generar las rutas de la aplicación en el main.dart, se
utiliza la propiedad onGenerateRoute(), la cual genera una sola ruta y debe regresar un solo Widget, (a
diferencia de routes que es un mapa de Widgets). Sin embargo onGenerateRoute() incluye un objeto
RouteSettings, que contiene los arguments y el nombre de la pagina que se esta generando y por medio
de decisiones regresar la pagina correspondiente.

// Proporciona una función para manejar las rutas con nombre. Usa esta función para
// identificar la ruta con nombre que ha sido añadida con push, y crea la
// pantalla correcta.
onGenerateRoute: (settings) {
    // Si haces push de la ruta PassArgumentsScreen
    if (settings.name == PassArgumentsScreen.routeName) {
        // Convierte los argumentos al tipo correcto: ScreenArguments.
        final ScreenArguments args = settings.arguments;
        // Entonces, extrae los datos requeridos de los argumentos
        // y pasa los datos a la pantalla correcta.
            return MaterialPageRoute(
                builder: (context) {
                    return PassArgumentsScreen(
                        title: args.title,
                        message: args.message,
                    );
                },
            );
      }
}

Notar que en este ejemplo ScreenArguments es un modelo programado por nosotros que contiene x información y PassArgumentsScreen es la pantalla a la que queremos navegar, la cuál contiene un constructor con 2 argumentos. 

Comentarios