1
resposta

Trabalhando com rotas nomeadas, passagem de vários parêmetros

Olá.

Gostaria de uma ajuda na parte de rotas nomeadas, quero centralizar todas as rotas da app numa classe do tipo RouteGenerator e possibilitar por exemplo que sejam passados para as rotas diversos tipos de argumentos no parâmetro arguments no pushNamed. Aí a pergunta é, qual a forma correta para primeiro passar esse diversos parâmetros e principalmente, qual a forma correta de fazer o cast dos parâmetros n o método build da classe de destino. Eu tenho uma estrutura inicial assim:

import 'package:flutter/material.dart';
import 'package:routing_prep/main.dart';

class RouteGenerator {
  static Route<dynamic> generateRoute(RouteSettings settings) {
    // Getting arguments passed in while calling Navigator.pushNamed
    final args = settings.arguments;

    switch (settings.name) {
      case '/':
        return MaterialPageRoute(builder: (_) => FirstPage());
      case '/second':
        // Validation of correct data type
        if (args is String) {
          return MaterialPageRoute(
            builder: (_) => SecondPage(
                  data: args,
                ),
          );
        }
        // If args is not of the correct type, return an error page.
        // You can also throw an exception while in development.
        return _errorRoute();
      default:
        // If there is no such named route in the switch statement, e.g. /third
        return _errorRoute();
    }
  }

  static Route<dynamic> _errorRoute() {
    return MaterialPageRoute(builder: (_) {
      return Scaffold(
        appBar: AppBar(
          title: Text('Error'),
        ),
        body: Center(
          child: Text('ERROR'),
        ),
      );
    });
  }
}

Mas estou achando essa validação, errada por que posso ter vários objetos no arguments:

if (args is String) {
          return MaterialPageRoute(
            builder: (_) => SecondPage(
                  data: args,
                ),
          );
        }

Seria correto fazer o cast utilizando o índice do objeto no arguments, por exemplo digamos que eu no pushName passei no arguments o primeiro objeto do tipo Pessoa e o segundo objeto um int, daí na hora de recuperar eu faria final Pessoa p = arguments[0] cast Pessoa; final int idade = arguments[1] cast int; Ou nem precisa fazer isso por que já é sabido no arguments qual o tipo do objeto?

1 resposta

Olá Fabrício, tudo bom?

Dá uma olhada nesse código aqui.

A rota produce-details e a rota package-details recebem parâmetros para passarem para a tela que elas abrem.

Qualquer dúvida, estamos a disposição. Abraço