| // 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'), |
| TypedGoRoute<IterableRoute>(path: 'iterable-route'), |
| TypedGoRoute<IterableRouteWithDefaultValues>( |
| path: 'iterable-route-with-default-values'), |
| ]) |
| @immutable |
| class AllTypesBaseRoute extends GoRouteData { |
| const AllTypesBaseRoute(); |
| |
| @override |
| Widget build(BuildContext context, GoRouterState state) => |
| const BasePage<void>( |
| dataTitle: 'Root', |
| ); |
| } |
| |
| class BigIntRoute extends GoRouteData { |
| BigIntRoute({ |
| required this.requiredBigIntField, |
| this.bigIntField, |
| }); |
| |
| final BigInt requiredBigIntField; |
| final BigInt? bigIntField; |
| |
| @override |
| Widget build(BuildContext context, GoRouterState state) => BasePage<BigInt>( |
| dataTitle: 'BigIntRoute', |
| param: requiredBigIntField, |
| queryParam: bigIntField, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('BigIntRoute'), |
| onTap: () => go(context), |
| selected: GoRouterState.of(context).location == location, |
| ); |
| } |
| |
| class BoolRoute extends GoRouteData { |
| BoolRoute({ |
| required this.requiredBoolField, |
| this.boolField, |
| this.boolFieldWithDefaultValue = true, |
| }); |
| |
| final bool requiredBoolField; |
| final bool? boolField; |
| final bool boolFieldWithDefaultValue; |
| |
| @override |
| Widget build(BuildContext context, GoRouterState state) => BasePage<bool>( |
| dataTitle: 'BoolRoute', |
| param: requiredBoolField, |
| queryParam: boolField, |
| queryParamWithDefaultValue: boolFieldWithDefaultValue, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('BoolRoute'), |
| onTap: () => go(context), |
| selected: GoRouterState.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, GoRouterState state) => BasePage<DateTime>( |
| dataTitle: 'DateTimeRoute', |
| param: requiredDateTimeField, |
| queryParam: dateTimeField, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('DateTimeRoute'), |
| onTap: () => go(context), |
| selected: GoRouterState.of(context).location == location, |
| ); |
| } |
| |
| class DoubleRoute extends GoRouteData { |
| DoubleRoute({ |
| required this.requiredDoubleField, |
| this.doubleField, |
| this.doubleFieldWithDefaultValue = 1.0, |
| }); |
| |
| final double requiredDoubleField; |
| final double? doubleField; |
| final double doubleFieldWithDefaultValue; |
| |
| @override |
| Widget build(BuildContext context, GoRouterState state) => BasePage<double>( |
| dataTitle: 'DoubleRoute', |
| param: requiredDoubleField, |
| queryParam: doubleField, |
| queryParamWithDefaultValue: doubleFieldWithDefaultValue, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('DoubleRoute'), |
| onTap: () => go(context), |
| selected: GoRouterState.of(context).location == location, |
| ); |
| } |
| |
| class IntRoute extends GoRouteData { |
| IntRoute({ |
| required this.requiredIntField, |
| this.intField, |
| this.intFieldWithDefaultValue = 1, |
| }); |
| |
| final int requiredIntField; |
| final int? intField; |
| final int intFieldWithDefaultValue; |
| |
| @override |
| Widget build(BuildContext context, GoRouterState state) => BasePage<int>( |
| dataTitle: 'IntRoute', |
| param: requiredIntField, |
| queryParam: intField, |
| queryParamWithDefaultValue: intFieldWithDefaultValue, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('IntRoute'), |
| onTap: () => go(context), |
| selected: GoRouterState.of(context).location == location, |
| ); |
| } |
| |
| class NumRoute extends GoRouteData { |
| NumRoute({ |
| required this.requiredNumField, |
| this.numField, |
| this.numFieldWithDefaultValue = 1, |
| }); |
| |
| final num requiredNumField; |
| final num? numField; |
| final num numFieldWithDefaultValue; |
| |
| @override |
| Widget build(BuildContext context, GoRouterState state) => BasePage<num>( |
| dataTitle: 'NumRoute', |
| param: requiredNumField, |
| queryParam: numField, |
| queryParamWithDefaultValue: numFieldWithDefaultValue, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('NumRoute'), |
| onTap: () => go(context), |
| selected: GoRouterState.of(context).location == location, |
| ); |
| } |
| |
| class EnumRoute extends GoRouteData { |
| EnumRoute({ |
| required this.requiredEnumField, |
| this.enumField, |
| this.enumFieldWithDefaultValue = PersonDetails.favoriteFood, |
| }); |
| |
| final PersonDetails requiredEnumField; |
| final PersonDetails? enumField; |
| final PersonDetails enumFieldWithDefaultValue; |
| |
| @override |
| Widget build(BuildContext context, GoRouterState state) => |
| BasePage<PersonDetails>( |
| dataTitle: 'EnumRoute', |
| param: requiredEnumField, |
| queryParam: enumField, |
| queryParamWithDefaultValue: enumFieldWithDefaultValue, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('EnumRoute'), |
| onTap: () => go(context), |
| selected: GoRouterState.of(context).location == location, |
| ); |
| } |
| |
| class EnhancedEnumRoute extends GoRouteData { |
| EnhancedEnumRoute({ |
| required this.requiredEnumField, |
| this.enumField, |
| this.enumFieldWithDefaultValue = SportDetails.football, |
| }); |
| |
| final SportDetails requiredEnumField; |
| final SportDetails? enumField; |
| final SportDetails enumFieldWithDefaultValue; |
| |
| @override |
| Widget build(BuildContext context, GoRouterState state) => |
| BasePage<SportDetails>( |
| dataTitle: 'EnhancedEnumRoute', |
| param: requiredEnumField, |
| queryParam: enumField, |
| queryParamWithDefaultValue: enumFieldWithDefaultValue, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('EnhancedEnumRoute'), |
| onTap: () => go(context), |
| selected: GoRouterState.of(context).location == location, |
| ); |
| } |
| |
| class StringRoute extends GoRouteData { |
| StringRoute({ |
| required this.requiredStringField, |
| this.stringField, |
| this.stringFieldWithDefaultValue = 'defaultValue', |
| }); |
| |
| final String requiredStringField; |
| final String? stringField; |
| final String stringFieldWithDefaultValue; |
| |
| @override |
| Widget build(BuildContext context, GoRouterState state) => BasePage<String>( |
| dataTitle: 'StringRoute', |
| param: requiredStringField, |
| queryParam: stringField, |
| queryParamWithDefaultValue: stringFieldWithDefaultValue, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('StringRoute'), |
| onTap: () => go(context), |
| selected: GoRouterState.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, GoRouterState state) => BasePage<Uri>( |
| dataTitle: 'UriRoute', |
| param: requiredUriField, |
| queryParam: uriField, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('UriRoute'), |
| onTap: () => go(context), |
| selected: GoRouterState.of(context).location == location, |
| ); |
| } |
| |
| class IterableRoute extends GoRouteData { |
| IterableRoute({ |
| this.intIterableField, |
| this.doubleIterableField, |
| this.stringIterableField, |
| this.boolIterableField, |
| this.enumIterableField, |
| this.enumOnlyInIterableField, |
| this.intListField, |
| this.doubleListField, |
| this.stringListField, |
| this.boolListField, |
| this.enumListField, |
| this.enumOnlyInListField, |
| this.intSetField, |
| this.doubleSetField, |
| this.stringSetField, |
| this.boolSetField, |
| this.enumSetField, |
| this.enumOnlyInSetField, |
| }); |
| |
| final Iterable<int>? intIterableField; |
| final List<int>? intListField; |
| final Set<int>? intSetField; |
| |
| final Iterable<double>? doubleIterableField; |
| final List<double>? doubleListField; |
| final Set<double>? doubleSetField; |
| |
| final Iterable<String>? stringIterableField; |
| final List<String>? stringListField; |
| final Set<String>? stringSetField; |
| |
| final Iterable<bool>? boolIterableField; |
| final List<bool>? boolListField; |
| final Set<bool>? boolSetField; |
| |
| final Iterable<SportDetails>? enumIterableField; |
| final List<SportDetails>? enumListField; |
| final Set<SportDetails>? enumSetField; |
| |
| final Iterable<CookingRecipe>? enumOnlyInIterableField; |
| final List<CookingRecipe>? enumOnlyInListField; |
| final Set<CookingRecipe>? enumOnlyInSetField; |
| |
| @override |
| Widget build(BuildContext context, GoRouterState state) => IterablePage( |
| dataTitle: 'IterableRoute', |
| intIterableField: intIterableField, |
| doubleIterableField: doubleIterableField, |
| stringIterableField: stringIterableField, |
| boolIterableField: boolIterableField, |
| enumIterableField: enumIterableField, |
| intListField: intListField, |
| doubleListField: doubleListField, |
| stringListField: stringListField, |
| boolListField: boolListField, |
| enumListField: enumListField, |
| intSetField: intSetField, |
| doubleSetField: doubleSetField, |
| stringSetField: stringSetField, |
| boolSetField: boolSetField, |
| enumSetField: enumSetField, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('IterableRoute'), |
| onTap: () => go(context), |
| selected: GoRouterState.of(context).location == location, |
| ); |
| } |
| |
| class IterableRouteWithDefaultValues extends GoRouteData { |
| const IterableRouteWithDefaultValues({ |
| this.intIterableField = const <int>[0], |
| this.doubleIterableField = const <double>[0, 1, 2], |
| this.stringIterableField = const <String>['defaultValue'], |
| this.boolIterableField = const <bool>[false], |
| this.enumIterableField = const <SportDetails>[ |
| SportDetails.tennis, |
| SportDetails.hockey, |
| ], |
| this.intListField = const <int>[0], |
| this.doubleListField = const <double>[1, 2, 3], |
| this.stringListField = const <String>['defaultValue0', 'defaultValue1'], |
| this.boolListField = const <bool>[true], |
| this.enumListField = const <SportDetails>[SportDetails.football], |
| this.intSetField = const <int>{0, 1}, |
| this.doubleSetField = const <double>{}, |
| this.stringSetField = const <String>{'defaultValue'}, |
| this.boolSetField = const <bool>{true, false}, |
| this.enumSetField = const <SportDetails>{SportDetails.hockey}, |
| }); |
| |
| final Iterable<int> intIterableField; |
| final List<int> intListField; |
| final Set<int> intSetField; |
| |
| final Iterable<double> doubleIterableField; |
| final List<double> doubleListField; |
| final Set<double> doubleSetField; |
| |
| final Iterable<String> stringIterableField; |
| final List<String> stringListField; |
| final Set<String> stringSetField; |
| |
| final Iterable<bool> boolIterableField; |
| final List<bool> boolListField; |
| final Set<bool> boolSetField; |
| |
| final Iterable<SportDetails> enumIterableField; |
| final List<SportDetails> enumListField; |
| final Set<SportDetails> enumSetField; |
| |
| @override |
| Widget build(BuildContext context, GoRouterState state) => IterablePage( |
| dataTitle: 'IterableRouteWithDefaultValues', |
| intIterableField: intIterableField, |
| doubleIterableField: doubleIterableField, |
| stringIterableField: stringIterableField, |
| boolIterableField: boolIterableField, |
| enumIterableField: enumIterableField, |
| intListField: intListField, |
| doubleListField: doubleListField, |
| stringListField: stringListField, |
| boolListField: boolListField, |
| enumListField: enumListField, |
| intSetField: intSetField, |
| doubleSetField: doubleSetField, |
| stringSetField: stringSetField, |
| boolSetField: boolSetField, |
| enumSetField: enumSetField, |
| ); |
| |
| Widget drawerTile(BuildContext context) => ListTile( |
| title: const Text('IterableRouteWithDefaultValues'), |
| onTap: () => go(context), |
| selected: GoRouterState.of(context).location == location, |
| ); |
| } |
| |
| class BasePage<T> extends StatelessWidget { |
| const BasePage({ |
| required this.dataTitle, |
| this.param, |
| this.queryParam, |
| this.queryParamWithDefaultValue, |
| super.key, |
| }); |
| |
| final String dataTitle; |
| final T? param; |
| final T? queryParam; |
| final T? queryParamWithDefaultValue; |
| |
| @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), |
| IterableRoute( |
| intIterableField: <int>[1, 2, 3], |
| doubleIterableField: <double>[.3, .4, .5], |
| stringIterableField: <String>['quo usque tandem'], |
| boolIterableField: <bool>[true, false, false], |
| enumIterableField: <SportDetails>[ |
| SportDetails.football, |
| SportDetails.hockey, |
| ], |
| intListField: <int>[1, 2, 3], |
| doubleListField: <double>[.3, .4, .5], |
| stringListField: <String>['quo usque tandem'], |
| boolListField: <bool>[true, false, false], |
| enumListField: <SportDetails>[ |
| SportDetails.football, |
| SportDetails.hockey, |
| ], |
| intSetField: <int>{1, 2, 3}, |
| doubleSetField: <double>{.3, .4, .5}, |
| stringSetField: <String>{'quo usque tandem'}, |
| boolSetField: <bool>{true, false}, |
| enumSetField: <SportDetails>{ |
| SportDetails.football, |
| SportDetails.hockey, |
| }, |
| ).drawerTile(context), |
| const IterableRouteWithDefaultValues().drawerTile(context), |
| ], |
| )), |
| body: Center( |
| child: Column( |
| mainAxisSize: MainAxisSize.min, |
| children: <Widget>[ |
| const Text('Built!'), |
| Text(dataTitle), |
| Text('Param: $param'), |
| Text('Query param: $queryParam'), |
| Text( |
| 'Query param with default value: $queryParamWithDefaultValue', |
| ), |
| SelectableText(GoRouterState.of(context).location), |
| ], |
| ), |
| ), |
| ); |
| } |
| |
| void main() => runApp(AllTypesApp()); |
| |
| class AllTypesApp extends StatelessWidget { |
| AllTypesApp({super.key}); |
| |
| @override |
| Widget build(BuildContext context) => MaterialApp.router( |
| routerConfig: _router, |
| ); |
| |
| late final GoRouter _router = GoRouter( |
| debugLogDiagnostics: true, |
| routes: $appRoutes, |
| initialLocation: const AllTypesBaseRoute().location, |
| ); |
| } |
| |
| class IterablePage extends StatelessWidget { |
| const IterablePage({ |
| required this.dataTitle, |
| this.intIterableField, |
| this.doubleIterableField, |
| this.stringIterableField, |
| this.boolIterableField, |
| this.enumIterableField, |
| this.intListField, |
| this.doubleListField, |
| this.stringListField, |
| this.boolListField, |
| this.enumListField, |
| this.intSetField, |
| this.doubleSetField, |
| this.stringSetField, |
| this.boolSetField, |
| this.enumSetField, |
| super.key, |
| }); |
| |
| final String dataTitle; |
| |
| final Iterable<int>? intIterableField; |
| final List<int>? intListField; |
| final Set<int>? intSetField; |
| |
| final Iterable<double>? doubleIterableField; |
| final List<double>? doubleListField; |
| final Set<double>? doubleSetField; |
| |
| final Iterable<String>? stringIterableField; |
| final List<String>? stringListField; |
| final Set<String>? stringSetField; |
| |
| final Iterable<bool>? boolIterableField; |
| final List<bool>? boolListField; |
| final Set<bool>? boolSetField; |
| |
| final Iterable<SportDetails>? enumIterableField; |
| final List<SportDetails>? enumListField; |
| final Set<SportDetails>? enumSetField; |
| |
| @override |
| Widget build(BuildContext context) { |
| return BasePage<String>( |
| dataTitle: dataTitle, |
| queryParamWithDefaultValue: <String, Iterable<dynamic>?>{ |
| 'intIterableField': intIterableField, |
| 'intListField': intListField, |
| 'intSetField': intSetField, |
| 'doubleIterableField': doubleIterableField, |
| 'doubleListField': doubleListField, |
| 'doubleSetField': doubleSetField, |
| 'stringIterableField': stringIterableField, |
| 'stringListField': stringListField, |
| 'stringSetField': stringSetField, |
| 'boolIterableField': boolIterableField, |
| 'boolListField': boolListField, |
| 'boolSetField': boolSetField, |
| 'enumIterableField': enumIterableField, |
| 'enumListField': enumListField, |
| 'enumSetField': enumSetField, |
| }.toString(), |
| ); |
| } |
| } |