Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

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?

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software