Flutter – Custom routing

Routing with settings from URL-querystring or arguments from pustNamed

URL example: domainname/secondpage?firstname=Lou&lastname=Reed

Pagetitle in browser is defined with the help of the Title widget or with the custom made function: setPageTitle()

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

import 'package:url_strategy/url_strategy.dart';

void main() {
  setPathUrlStrategy();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      /*
      initialRoute: '/',
      routes: {
        HomePage.routeName: (context) => HomePage(),
        SecondPage.routeName: (context) => SecondPage(),
      },
      */
      onGenerateRoute: generateRoute,
      onUnknownRoute: (settings) {
        return MaterialPageRoute(builder: (context) => HomePage());
      },
    );
  }
}

Route<dynamic> generateRoute(RouteSettings settings) {
  final Map parameters = Uri.base.queryParametersAll;
  final arguments = settings.arguments;

  print('Parametre: $parameters');
  print('Arguments: $arguments');

  final List<String> uri = settings.name!.split('?');

  //Write url queryparameters or settings-arguments to Routesettings - or null
  final RouteSettings? arg = (parameters.length > 0 || arguments != null)
      ? RouteSettings(arguments: (arguments != null) ? arguments : parameters)
      : null;

  switch (uri[0]) {
    case HomePage.routeName:
      return MaterialPageRoute(
        builder: (context) => HomePage(),
        settings: arg,
      );
    case FirstPage.routeName:
      return MaterialPageRoute(
        builder: (context) => FirstPage(),
        settings: arg,
      );
    case SecondPage.routeName:
      return MaterialPageRoute(
        builder: (context) => SecondPage(),
        settings: arg,
      );
    default:
      return MaterialPageRoute(builder: (context) => HomePage());
  }
}

/// Homepage page
class HomePage extends StatelessWidget {
  static const String routeName = '/';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Title(
          title: 'Homepage',
          color: Colors.green,
          child: ElevatedButton(
            onPressed: () => Navigator.of(context).pushNamed(
              FirstPage.routeName,
              arguments: {'my_argument': '47'},
            ),
            child: Text('move to Firstpage with an argument'),
          )),
    );
  }
}

/// First page
class FirstPage extends StatelessWidget {
  static const routeName = '/firstpage';

  @override
  Widget build(BuildContext context) {
    setPageTitle('Firstpage', context);
    var arguments = ModalRoute.of(context)?.settings.arguments;

    return Scaffold(
      body: Text('Firstpage | arguments: $arguments'),
    );
  }
}

/// Seconde page
class SecondPage extends StatelessWidget {
  static const routeName = '/secondpage';

  @override
  Widget build(BuildContext context) {
    setPageTitle('Secondpage', context);
    var arguments = ModalRoute.of(context)?.settings.arguments;
    return Scaffold(
      body: Text('Secondpage | arguments: $arguments'),
    );
  }
}

/// Set title of page in browser
void setPageTitle(String title, BuildContext context) {
  SystemChrome.setApplicationSwitcherDescription(ApplicationSwitcherDescription(
    label: title,
    primaryColor: Theme.of(context).primaryColor.value, // This line is required
  ));
}