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?