| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // ignore_for_file: public_member_api_docs |
| |
| import 'package:flutter/material.dart'; |
| import 'package:go_router/go_router.dart'; |
| |
| import 'shared/data.dart'; |
| |
| part 'all_types.g.dart'; |
| |
| @TypedGoRoute<AllTypesBaseRoute>(path: '/', routes: <TypedGoRoute<GoRouteData>>[ |
| TypedGoRoute<BigIntRoute>(path: 'big-int-route/:requiredBigIntField'), |
| TypedGoRoute<BoolRoute>(path: 'bool-route/:requiredBoolField'), |
| TypedGoRoute<DateTimeRoute>(path: 'date-time-route/:requiredDateTimeField'), |
| TypedGoRoute<DoubleRoute>(path: 'double-route/:requiredDoubleField'), |
| TypedGoRoute<IntRoute>(path: 'int-route/:requiredIntField'), |
| TypedGoRoute<NumRoute>(path: 'num-route/:requiredNumField'), |
| TypedGoRoute<DoubleRoute>(path: 'double-route/:requiredDoubleField'), |
| TypedGoRoute<EnumRoute>(path: 'enum-route/:requiredEnumField'), |
| TypedGoRoute<EnhancedEnumRoute>( |
| path: 'enhanced-enum-route/:requiredEnumField'), |
| TypedGoRoute<StringRoute>(path: 'string-route/:requiredStringField'), |
| TypedGoRoute<UriRoute>(path: 'uri-route/:requiredUriField'), |
| ]) |
| @immutable |
| class AllTypesBaseRoute extends GoRouteData { |
| const AllTypesBaseRoute(); |
| |
| @override |
| Widget build(BuildContext context) => const BasePage<void>( |
| dataTitle: 'Root', |
| param: null, |
| ); |
| } |
| |
| class BigIntRoute extends GoRouteData { |
| BigIntRoute({ |
| required this.requiredBigIntField, |
| this.bigIntField, |
| }); |
| |
| final BigInt requiredBigIntField; |
| final BigInt? bigIntField; |
| |
| @override |
| Widget build(BuildContext context) => BasePage<BigInt>( |
| dataTitle: 'BigIntRoute', |
| param: requiredBigIntField, |
| queryParam: bigIntField, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('BigIntRoute'), |
| onTap: () => go(context), |
| selected: GoRouter.of(context).location == location, |
| ); |
| } |
| |
| class BoolRoute extends GoRouteData { |
| BoolRoute({ |
| required this.requiredBoolField, |
| this.boolField, |
| }); |
| |
| final bool requiredBoolField; |
| final bool? boolField; |
| |
| @override |
| Widget build(BuildContext context) => BasePage<bool>( |
| dataTitle: 'BoolRoute', |
| param: requiredBoolField, |
| queryParam: boolField, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('BoolRoute'), |
| onTap: () => go(context), |
| selected: GoRouter.of(context).location == location, |
| ); |
| } |
| |
| class DateTimeRoute extends GoRouteData { |
| DateTimeRoute({ |
| required this.requiredDateTimeField, |
| this.dateTimeField, |
| }); |
| |
| final DateTime requiredDateTimeField; |
| final DateTime? dateTimeField; |
| |
| @override |
| Widget build(BuildContext context) => BasePage<DateTime>( |
| dataTitle: 'DateTimeRoute', |
| param: requiredDateTimeField, |
| queryParam: dateTimeField, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('DateTimeRoute'), |
| onTap: () => go(context), |
| selected: GoRouter.of(context).location == location, |
| ); |
| } |
| |
| class DoubleRoute extends GoRouteData { |
| DoubleRoute({ |
| required this.requiredDoubleField, |
| this.doubleField, |
| }); |
| |
| final double requiredDoubleField; |
| final double? doubleField; |
| |
| @override |
| Widget build(BuildContext context) => BasePage<double>( |
| dataTitle: 'DoubleRoute', |
| param: requiredDoubleField, |
| queryParam: doubleField, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('DoubleRoute'), |
| onTap: () => go(context), |
| selected: GoRouter.of(context).location == location, |
| ); |
| } |
| |
| class IntRoute extends GoRouteData { |
| IntRoute({ |
| required this.requiredIntField, |
| this.intField, |
| }); |
| |
| final int requiredIntField; |
| final int? intField; |
| |
| @override |
| Widget build(BuildContext context) => BasePage<int>( |
| dataTitle: 'IntRoute', |
| param: requiredIntField, |
| queryParam: intField, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('IntRoute'), |
| onTap: () => go(context), |
| selected: GoRouter.of(context).location == location, |
| ); |
| } |
| |
| class NumRoute extends GoRouteData { |
| NumRoute({ |
| required this.requiredNumField, |
| this.numField, |
| }); |
| |
| final num requiredNumField; |
| final num? numField; |
| |
| @override |
| Widget build(BuildContext context) => BasePage<num>( |
| dataTitle: 'NumRoute', |
| param: requiredNumField, |
| queryParam: numField, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('NumRoute'), |
| onTap: () => go(context), |
| selected: GoRouter.of(context).location == location, |
| ); |
| } |
| |
| class EnumRoute extends GoRouteData { |
| EnumRoute({ |
| required this.requiredEnumField, |
| this.enumField, |
| }); |
| |
| final PersonDetails requiredEnumField; |
| final PersonDetails? enumField; |
| |
| @override |
| Widget build(BuildContext context) => BasePage<PersonDetails>( |
| dataTitle: 'EnumRoute', |
| param: requiredEnumField, |
| queryParam: enumField, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('EnumRoute'), |
| onTap: () => go(context), |
| selected: GoRouter.of(context).location == location, |
| ); |
| } |
| |
| class EnhancedEnumRoute extends GoRouteData { |
| EnhancedEnumRoute({ |
| required this.requiredEnumField, |
| this.enumField, |
| }); |
| |
| final SportDetails requiredEnumField; |
| final SportDetails? enumField; |
| |
| @override |
| Widget build(BuildContext context) => BasePage<SportDetails>( |
| dataTitle: 'EnhancedEnumRoute', |
| param: requiredEnumField, |
| queryParam: enumField, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('EnhancedEnumRoute'), |
| onTap: () => go(context), |
| selected: GoRouter.of(context).location == location, |
| ); |
| } |
| |
| class StringRoute extends GoRouteData { |
| StringRoute({ |
| required this.requiredStringField, |
| this.stringField, |
| }); |
| |
| final String requiredStringField; |
| final String? stringField; |
| |
| @override |
| Widget build(BuildContext context) => BasePage<String>( |
| dataTitle: 'StringRoute', |
| param: requiredStringField, |
| queryParam: stringField, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('StringRoute'), |
| onTap: () => go(context), |
| selected: GoRouter.of(context).location == location, |
| ); |
| } |
| |
| class UriRoute extends GoRouteData { |
| UriRoute({ |
| required this.requiredUriField, |
| this.uriField, |
| }); |
| |
| final Uri requiredUriField; |
| final Uri? uriField; |
| |
| @override |
| Widget build(BuildContext context) => BasePage<Uri>( |
| dataTitle: 'UriRoute', |
| param: requiredUriField, |
| queryParam: uriField, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('UriRoute'), |
| onTap: () => go(context), |
| selected: GoRouter.of(context).location == location, |
| ); |
| } |
| |
| class BasePage<T> extends StatelessWidget { |
| const BasePage({ |
| required this.dataTitle, |
| required this.param, |
| this.queryParam, |
| super.key, |
| }); |
| |
| final String dataTitle; |
| final T param; |
| final T? queryParam; |
| |
| @override |
| Widget build(BuildContext context) => Scaffold( |
| appBar: AppBar( |
| title: const Text('Go router typed routes'), |
| ), |
| drawer: Drawer( |
| child: ListView( |
| children: <Widget>[ |
| BigIntRoute( |
| requiredBigIntField: BigInt.two, |
| bigIntField: BigInt.zero, |
| ).drawerTile(context), |
| BoolRoute( |
| requiredBoolField: true, |
| boolField: false, |
| ).drawerTile(context), |
| DateTimeRoute( |
| requiredDateTimeField: DateTime(1970), |
| dateTimeField: DateTime(0), |
| ).drawerTile(context), |
| DoubleRoute( |
| requiredDoubleField: 3.14, |
| doubleField: -3.14, |
| ).drawerTile(context), |
| IntRoute( |
| requiredIntField: 42, |
| intField: -42, |
| ).drawerTile(context), |
| NumRoute( |
| requiredNumField: 2.71828, |
| numField: -2.71828, |
| ).drawerTile(context), |
| StringRoute( |
| requiredStringField: r'$!/#bob%%20', |
| stringField: r'$!/#bob%%20', |
| ).drawerTile(context), |
| EnumRoute( |
| requiredEnumField: PersonDetails.favoriteSport, |
| enumField: PersonDetails.favoriteFood, |
| ).drawerTile(context), |
| EnhancedEnumRoute( |
| requiredEnumField: SportDetails.football, |
| enumField: SportDetails.volleyball, |
| ).drawerTile(context), |
| UriRoute( |
| requiredUriField: Uri.parse('https://dart.dev'), |
| uriField: Uri.parse('https://dart.dev'), |
| ).drawerTile(context), |
| ], |
| )), |
| body: Center( |
| child: Column( |
| mainAxisSize: MainAxisSize.min, |
| children: <Widget>[ |
| const Text('Built!'), |
| Text(dataTitle), |
| Text('Param: $param'), |
| Text('Query param: $queryParam'), |
| SelectableText(GoRouter.of(context).location), |
| ], |
| ), |
| ), |
| ); |
| } |
| |
| void main() => runApp(AllTypesApp()); |
| |
| class AllTypesApp extends StatelessWidget { |
| AllTypesApp({super.key}); |
| |
| @override |
| Widget build(BuildContext context) => MaterialApp.router( |
| routeInformationParser: _router.routeInformationParser, |
| routerDelegate: _router.routerDelegate, |
| routeInformationProvider: _router.routeInformationProvider, |
| ); |
| |
| late final GoRouter _router = GoRouter( |
| debugLogDiagnostics: true, |
| routes: $appRoutes, |
| initialLocation: const AllTypesBaseRoute().location, |
| ); |
| } |