En aquest tema, aprendrem sobre les rutes nomenades en Flutter, una manera eficient i organitzada de gestionar la navegació entre pantalles en una aplicació Flutter. Les rutes nomenades permeten definir i utilitzar noms per a les diferents pantalles, facilitant la navegació i el manteniment del codi.
Què són les Rutes Nomenades?
Les rutes nomenades són una manera de definir les rutes de navegació utilitzant noms en lloc de referències directes a les pantalles. Això permet una navegació més clara i fàcil de mantenir, especialment en aplicacions grans amb moltes pantalles.
Avantatges de les Rutes Nomenades
- Claredat: Els noms de les rutes fan que el codi sigui més llegible.
 - Mantenibilitat: És més fàcil actualitzar i gestionar les rutes en un sol lloc.
 - Flexibilitat: Permet passar dades entre pantalles de manera més senzilla.
 
Configuració de les Rutes Nomenades
Pas 1: Definir les Rutes
Primer, definim les rutes en el fitxer principal de l'aplicació (main.dart). Utilitzem un mapa (Map<String, WidgetBuilder>) per associar els noms de les rutes amb els constructors de les pantalles.
import 'package:flutter/material.dart';
void main() {
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      initialRoute: '/',
      routes: {
        '/': (context) => HomeScreen(),
        '/second': (context) => SecondScreen(),
      },
    );
  }
}
class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home Screen'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.pushNamed(context, '/second');
          },
          child: Text('Go to Second Screen'),
        ),
      ),
    );
  }
}
class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Second Screen'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.pop(context);
          },
          child: Text('Go back'),
        ),
      ),
    );
  }
}Pas 2: Navegar Utilitzant les Rutes Nomenades
Per navegar a una ruta nomenada, utilitzem el mètode Navigator.pushNamed i passem el context i el nom de la ruta.
Per tornar a la pantalla anterior, utilitzem el mètode Navigator.pop.
Passar Dades Entre Pantalles
Podem passar dades entre pantalles utilitzant les rutes nomenades. Això es fa passant arguments a la ruta.
Pas 1: Definir Arguments
Definim una classe per als arguments que volem passar.
class ScreenArguments {
  final String title;
  final String message;
  ScreenArguments(this.title, this.message);
}Pas 2: Passar Arguments
Quan naveguem a la ruta, passem els arguments utilitzant la propietat arguments.
Navigator.pushNamed(
  context,
  '/second',
  arguments: ScreenArguments(
    'Hello',
    'This is a message from the first screen',
  ),
);Pas 3: Rebre Arguments
A la pantalla de destinació, rebem els arguments utilitzant el mètode ModalRoute.of(context).settings.arguments.
class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final ScreenArguments args = ModalRoute.of(context)!.settings.arguments as ScreenArguments;
    return Scaffold(
      appBar: AppBar(
        title: Text(args.title),
      ),
      body: Center(
        child: Text(args.message),
      ),
    );
  }
}Exercici Pràctic
Objectiu
Crear una aplicació Flutter amb dues pantalles. La primera pantalla ha de tenir un botó que navegui a la segona pantalla passant un missatge. La segona pantalla ha de mostrar aquest missatge i tenir un botó per tornar a la primera pantalla.
Solució
import 'package:flutter/material.dart';
void main() {
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      initialRoute: '/',
      routes: {
        '/': (context) => HomeScreen(),
        '/second': (context) => SecondScreen(),
      },
    );
  }
}
class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home Screen'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.pushNamed(
              context,
              '/second',
              arguments: ScreenArguments(
                'Hello',
                'This is a message from the first screen',
              ),
            );
          },
          child: Text('Go to Second Screen'),
        ),
      ),
    );
  }
}
class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final ScreenArguments args = ModalRoute.of(context)!.settings.arguments as ScreenArguments;
    return Scaffold(
      appBar: AppBar(
        title: Text(args.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(args.message),
            ElevatedButton(
              onPressed: () {
                Navigator.pop(context);
              },
              child: Text('Go back'),
            ),
          ],
        ),
      ),
    );
  }
}
class ScreenArguments {
  final String title;
  final String message;
  ScreenArguments(this.title, this.message);
}Resum
En aquest tema, hem après a utilitzar les rutes nomenades en Flutter per gestionar la navegació entre pantalles de manera eficient. Hem vist com definir rutes, navegar utilitzant noms de rutes i passar dades entre pantalles. Les rutes nomenades fan que el codi sigui més clar i fàcil de mantenir, especialment en aplicacions grans.
Curs de Desenvolupament Flutter
Mòdul 1: Introducció a Flutter
- Què és Flutter?
 - Configuració de l'Entorn de Desenvolupament
 - Comprensió de l'Arquitectura de Flutter
 - Creació de la Teva Primera Aplicació Flutter
 
Mòdul 2: Conceptes Bàsics de Programació en Dart
- Introducció a Dart
 - Variables i Tipus de Dades
 - Sentències de Flux de Control
 - Funcions i Mètodes
 - Programació Orientada a Objectes en Dart
 
Mòdul 3: Widgets de Flutter
- Introducció als Widgets
 - Widgets Stateless vs Stateful
 - Widgets Bàsics
 - Widgets de Disseny
 - Widgets d'Entrada i Formulari
 
Mòdul 4: Gestió de l'Estat
Mòdul 5: Navegació i Enrutament
- Introducció a la Navegació
 - Navegació Bàsica
 - Rutes Nomenades
 - Passar Dades Entre Pantalles
 - Deep Linking
 
Mòdul 6: Xarxes i APIs
- Obtenir Dades d'Internet
 - Analitzar Dades JSON
 - Gestió d'Errors de Xarxa
 - Ús d'APIs REST
 - Integració de GraphQL
 
Mòdul 7: Persistència i Emmagatzematge
- Introducció a la Persistència
 - Preferències Compartides
 - Emmagatzematge de Fitxers
 - Base de Dades SQLite
 - Ús de Hive per a l'Emmagatzematge Local
 
Mòdul 8: Conceptes Avançats de Flutter
- Animacions en Flutter
 - Pintura Personalitzada i Canvas
 - Canals de Plataforma
 - Isolates i Concurrència
 - Optimització del Rendiment
 
Mòdul 9: Proves i Depuració
- Introducció a les Proves
 - Proves Unitàries
 - Proves de Widgets
 - Proves d'Integració
 - Tècniques de Depuració
 
Mòdul 10: Desplegament i Manteniment
- Preparació per al Llançament
 - Construcció per a iOS
 - Construcció per a Android
 - Integració i Desplegament Continu (CI/CD)
 - Manteniment i Actualització de la Teva Aplicació
 
