From 6fe228dbfceef4762f3bf906d334e5259f4af843 Mon Sep 17 00:00:00 2001 From: Mirko Mucaria Date: Thu, 28 Jul 2022 19:46:34 +0200 Subject: [PATCH 01/15] fixes broken enhanced enums. [#105876](https://github.com/flutter/flutter/issues/105876) --- packages/go_router_builder/lib/src/route_config.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/go_router_builder/lib/src/route_config.dart b/packages/go_router_builder/lib/src/route_config.dart index 49ebc5d22a36..f058a2cdff6d 100644 --- a/packages/go_router_builder/lib/src/route_config.dart +++ b/packages/go_router_builder/lib/src/route_config.dart @@ -368,7 +368,7 @@ String _enumMapConst(InterfaceType type) { final StringBuffer buffer = StringBuffer('const ${enumMapName(type)} = {'); for (final FieldElement enumField in type.element2.fields - .where((FieldElement element) => !element.isSynthetic)) { + .where((FieldElement element) => element.isEnumConstant)) { buffer.writeln( '$enumName.${enumField.name}: ${escapeDartString(enumField.name.kebab)},', ); From 4f973561ce34fd9218c12a5537431205a0133478 Mon Sep 17 00:00:00 2001 From: Mirko Mucaria Date: Thu, 28 Jul 2022 22:52:03 +0200 Subject: [PATCH 02/15] tests --- .../go_router_builder/test/builder_test.dart | 1 + .../_go_router_builder_test_input.dart | 49 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/packages/go_router_builder/test/builder_test.dart b/packages/go_router_builder/test/builder_test.dart index bcd25d2ba870..147e8251a1fc 100644 --- a/packages/go_router_builder/test/builder_test.dart +++ b/packages/go_router_builder/test/builder_test.dart @@ -31,4 +31,5 @@ const Set _expectedAnnotatedTests = { 'NullableRequiredParam', 'UnsupportedType', 'theAnswer', + 'EnumParam', }; diff --git a/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart b/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart index 03a7dedd350c..1da00a60ff70 100644 --- a/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart +++ b/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart @@ -70,3 +70,52 @@ class MissingPathParam extends GoRouteData { MissingPathParam({required this.id}); final String id; } + +@ShouldGenerate( + ''' +GoRoute get \$enumParam => GoRouteData.\$route( + path: '/:y', + factory: \$EnumParamExtension._fromState, + ); + +extension \$EnumParamExtension on EnumParam { + static EnumParam _fromState(GoRouterState state) => EnumParam( + y: _\$EnumTestEnumMap._\$fromName(state.params['y']!), + ); + + String get location => GoRouteData.\$location( + '/\${Uri.encodeComponent(_\$EnumTestEnumMap[y]!)}', + ); + + void go(BuildContext context) => context.go(location, extra: this); + + void push(BuildContext context) => context.push(location, extra: this); +} + +const _\$EnumTestEnumMap = { + EnumTest.a: 'a', + EnumTest.b: 'b', + EnumTest.c: 'c', +}; + +extension on Map { + T _\$fromName(String value) => + entries.singleWhere((element) => element.value == value).key; +} +''' +) +@TypedGoRoute(path: '/:y') +class EnumParam extends GoRouteData { + EnumParam({required this.y}); + final EnumTest y; +} + +enum EnumTest { + a(1), + b(3), + c(5); + + final int x; + + const EnumTest(this.x); +} \ No newline at end of file From da07ae90eda80359c6b0011aa9d3780ac655cadb Mon Sep 17 00:00:00 2001 From: Mirko Mucaria Date: Thu, 28 Jul 2022 22:53:52 +0200 Subject: [PATCH 03/15] tests --- .../test/test_inputs/_go_router_builder_test_input.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart b/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart index 1da00a60ff70..38a77fc98de6 100644 --- a/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart +++ b/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart @@ -118,4 +118,4 @@ enum EnumTest { final int x; const EnumTest(this.x); -} \ No newline at end of file +} From 6036ff435d9624597b894ca8f815986d1a6e6214 Mon Sep 17 00:00:00 2001 From: Mirko Mucaria Date: Thu, 28 Jul 2022 22:59:27 +0200 Subject: [PATCH 04/15] format --- .../test/test_inputs/_go_router_builder_test_input.dart | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart b/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart index 38a77fc98de6..8fd41b06827c 100644 --- a/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart +++ b/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart @@ -71,8 +71,7 @@ class MissingPathParam extends GoRouteData { final String id; } -@ShouldGenerate( - ''' +@ShouldGenerate(''' GoRoute get \$enumParam => GoRouteData.\$route( path: '/:y', factory: \$EnumParamExtension._fromState, @@ -102,8 +101,7 @@ extension on Map { T _\$fromName(String value) => entries.singleWhere((element) => element.value == value).key; } -''' -) +''') @TypedGoRoute(path: '/:y') class EnumParam extends GoRouteData { EnumParam({required this.y}); From 427f19d1aad568ba976d553d415c2b1a479c7069 Mon Sep 17 00:00:00 2001 From: Mirko Mucaria Date: Thu, 28 Jul 2022 23:07:19 +0200 Subject: [PATCH 05/15] format --- .../_go_router_builder_test_input.dart | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart b/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart index 8fd41b06827c..e7796fc20ae6 100644 --- a/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart +++ b/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart @@ -71,19 +71,19 @@ class MissingPathParam extends GoRouteData { final String id; } -@ShouldGenerate(''' -GoRoute get \$enumParam => GoRouteData.\$route( +@ShouldGenerate(r''' +GoRoute get $enumParam => GoRouteData.$route( path: '/:y', - factory: \$EnumParamExtension._fromState, + factory: $EnumParamExtension._fromState, ); -extension \$EnumParamExtension on EnumParam { +extension $EnumParamExtension on EnumParam { static EnumParam _fromState(GoRouterState state) => EnumParam( - y: _\$EnumTestEnumMap._\$fromName(state.params['y']!), + y: _$EnumTestEnumMap._$fromName(state.params['y']!), ); - String get location => GoRouteData.\$location( - '/\${Uri.encodeComponent(_\$EnumTestEnumMap[y]!)}', + String get location => GoRouteData.$location( + '/${Uri.encodeComponent(_$EnumTestEnumMap[y]!)}', ); void go(BuildContext context) => context.go(location, extra: this); @@ -91,14 +91,14 @@ extension \$EnumParamExtension on EnumParam { void push(BuildContext context) => context.push(location, extra: this); } -const _\$EnumTestEnumMap = { +const _$EnumTestEnumMap = { EnumTest.a: 'a', EnumTest.b: 'b', EnumTest.c: 'c', }; extension on Map { - T _\$fromName(String value) => + T _$fromName(String value) => entries.singleWhere((element) => element.value == value).key; } ''') @@ -112,8 +112,6 @@ enum EnumTest { a(1), b(3), c(5); - - final int x; - const EnumTest(this.x); + final int x; } From 5400a401047ed1117df7c7361601935a7bcb01e3 Mon Sep 17 00:00:00 2001 From: Mirko Mucaria Date: Thu, 28 Jul 2022 23:14:29 +0200 Subject: [PATCH 06/15] format --- .../test/test_inputs/_go_router_builder_test_input.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart b/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart index e7796fc20ae6..ca204efaaf94 100644 --- a/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart +++ b/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart @@ -112,6 +112,7 @@ enum EnumTest { a(1), b(3), c(5); + const EnumTest(this.x); final int x; } From 2b532b8e407ffffffe010d6bcf071c46322a7858 Mon Sep 17 00:00:00 2001 From: Mirko Mucaria Date: Tue, 9 Aug 2022 09:55:10 +0200 Subject: [PATCH 07/15] enhanced enum example and all_types example fix --- .../example/lib/all_types.dart | 31 +++++++++++++- .../example/lib/all_types.g.dart | 17 +++++++- .../example/lib/shared/data.dart | 40 +++++++++++++++++++ .../go_router_builder/example/pubspec.yaml | 2 +- 4 files changed, 86 insertions(+), 4 deletions(-) diff --git a/packages/go_router_builder/example/lib/all_types.dart b/packages/go_router_builder/example/lib/all_types.dart index b9a35f96b178..d4e9436f1eec 100644 --- a/packages/go_router_builder/example/lib/all_types.dart +++ b/packages/go_router_builder/example/lib/all_types.dart @@ -13,7 +13,7 @@ part 'all_types.g.dart'; @TypedGoRoute( path: '/:requiredBigIntField/:requiredBoolField/:requiredDateTimeField' - '/:requiredDoubleField/:requiredEnumField/:requiredIntField' + '/:requiredDoubleField/:requiredEnumField/:requiredEnhancedEnumField/:requiredIntField' '/:requiredNumField/:requiredStringField/:requiredUriField', ) @immutable @@ -26,6 +26,7 @@ class AllTypesRoute extends GoRouteData { required this.requiredEnumField, required this.requiredIntField, required this.requiredNumField, + required this.requiredEnhancedEnumField, required this.requiredStringField, required this.requiredUriField, this.bigIntField, @@ -33,6 +34,7 @@ class AllTypesRoute extends GoRouteData { this.dateTimeField, this.doubleField, this.enumField, + this.enhancedEnumField, this.intField, this.numField, this.stringField, @@ -44,6 +46,7 @@ class AllTypesRoute extends GoRouteData { final DateTime requiredDateTimeField; final double requiredDoubleField; final PersonDetails requiredEnumField; + final SportDetails requiredEnhancedEnumField; final int requiredIntField; final num requiredNumField; final String requiredStringField; @@ -54,6 +57,7 @@ class AllTypesRoute extends GoRouteData { final DateTime? dateTimeField; final double? doubleField; final PersonDetails? enumField; + final SportDetails? enhancedEnumField; final int? intField; final num? numField; final String? stringField; @@ -120,11 +124,34 @@ class AllTypesApp extends StatelessWidget { 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: AllTypesRoute( + requiredBigIntField: BigInt.two, + requiredBoolField: true, + requiredDateTimeField: DateTime.now(), + requiredDoubleField: 3.14, + requiredEnumField: PersonDetails.favoriteSport, + requiredEnhancedEnumField: SportDetails.football, + requiredIntField: -42, + requiredNumField: 3.15, + requiredStringField: r'$!/#bob%%20', + requiredUriField: Uri.parse('https://dart.dev'), + bigIntField: BigInt.zero, + boolField: false, + dateTimeField: DateTime(0), + doubleField: 3.14, + enumField: PersonDetails.favoriteSport, + enhancedEnumField: SportDetails.volleyball, + intField: -42, + numField: 3.15, + stringField: r'$!/#bob%%20', + uriField: Uri.parse('https://dart.dev'), + ).location, // redirect to the login page if the user is not logged in redirect: (GoRouterState state) { @@ -135,6 +162,7 @@ class AllTypesApp extends StatelessWidget { requiredDateTimeField: DateTime.now(), requiredDoubleField: 3.14, requiredEnumField: PersonDetails.favoriteSport, + requiredEnhancedEnumField: SportDetails.football, requiredIntField: -42, requiredNumField: 3.15, requiredStringField: r'$!/#bob%%20', @@ -144,6 +172,7 @@ class AllTypesApp extends StatelessWidget { dateTimeField: DateTime(0), doubleField: 3.14, enumField: PersonDetails.favoriteSport, + enhancedEnumField: SportDetails.volleyball, intField: -42, numField: 3.15, stringField: r'$!/#bob%%20', diff --git a/packages/go_router_builder/example/lib/all_types.g.dart b/packages/go_router_builder/example/lib/all_types.g.dart index 26435376edc6..a63a000be99c 100644 --- a/packages/go_router_builder/example/lib/all_types.g.dart +++ b/packages/go_router_builder/example/lib/all_types.g.dart @@ -14,7 +14,7 @@ List get $appRoutes => [ GoRoute get $allTypesRoute => GoRouteData.$route( path: - '/:requiredBigIntField/:requiredBoolField/:requiredDateTimeField/:requiredDoubleField/:requiredEnumField/:requiredIntField/:requiredNumField/:requiredStringField/:requiredUriField', + '/:requiredBigIntField/:requiredBoolField/:requiredDateTimeField/:requiredDoubleField/:requiredEnumField/:requiredEnhancedEnumField/:requiredIntField/:requiredNumField/:requiredStringField/:requiredUriField', factory: $AllTypesRouteExtension._fromState, ); @@ -29,6 +29,8 @@ extension $AllTypesRouteExtension on AllTypesRoute { ._$fromName(state.params['requiredEnumField']!), requiredIntField: int.parse(state.params['requiredIntField']!), requiredNumField: num.parse(state.params['requiredNumField']!), + requiredEnhancedEnumField: _$SportDetailsEnumMap + ._$fromName(state.params['requiredEnhancedEnumField']!), requiredStringField: state.params['requiredStringField']!, requiredUriField: Uri.parse(state.params['requiredUriField']!), bigIntField: @@ -41,6 +43,8 @@ extension $AllTypesRouteExtension on AllTypesRoute { _$convertMapValue('double-field', state.queryParams, double.parse), enumField: _$convertMapValue( 'enum-field', state.queryParams, _$PersonDetailsEnumMap._$fromName), + enhancedEnumField: _$convertMapValue('enhanced-enum-field', + state.queryParams, _$SportDetailsEnumMap._$fromName), intField: _$convertMapValue('int-field', state.queryParams, int.parse), numField: _$convertMapValue('num-field', state.queryParams, num.parse), stringField: state.queryParams['string-field'], @@ -48,7 +52,7 @@ extension $AllTypesRouteExtension on AllTypesRoute { ); String get location => GoRouteData.$location( - '/${Uri.encodeComponent(requiredBigIntField.toString())}/${Uri.encodeComponent(requiredBoolField.toString())}/${Uri.encodeComponent(requiredDateTimeField.toString())}/${Uri.encodeComponent(requiredDoubleField.toString())}/${Uri.encodeComponent(_$PersonDetailsEnumMap[requiredEnumField]!)}/${Uri.encodeComponent(requiredIntField.toString())}/${Uri.encodeComponent(requiredNumField.toString())}/${Uri.encodeComponent(requiredStringField)}/${Uri.encodeComponent(requiredUriField.toString())}', + '/${Uri.encodeComponent(requiredBigIntField.toString())}/${Uri.encodeComponent(requiredBoolField.toString())}/${Uri.encodeComponent(requiredDateTimeField.toString())}/${Uri.encodeComponent(requiredDoubleField.toString())}/${Uri.encodeComponent(_$PersonDetailsEnumMap[requiredEnumField]!)}/${Uri.encodeComponent(_$SportDetailsEnumMap[requiredEnhancedEnumField]!)}/${Uri.encodeComponent(requiredIntField.toString())}/${Uri.encodeComponent(requiredNumField.toString())}/${Uri.encodeComponent(requiredStringField)}/${Uri.encodeComponent(requiredUriField.toString())}', queryParams: { if (bigIntField != null) 'big-int-field': bigIntField!.toString(), if (boolField != null) 'bool-field': boolField!.toString(), @@ -57,6 +61,8 @@ extension $AllTypesRouteExtension on AllTypesRoute { if (doubleField != null) 'double-field': doubleField!.toString(), if (enumField != null) 'enum-field': _$PersonDetailsEnumMap[enumField!]!, + if (enhancedEnumField != null) + 'enhanced-enum-field': _$SportDetailsEnumMap[enhancedEnumField!]!, if (intField != null) 'int-field': intField!.toString(), if (numField != null) 'num-field': numField!.toString(), if (stringField != null) 'string-field': stringField!, @@ -75,6 +81,13 @@ const _$PersonDetailsEnumMap = { PersonDetails.favoriteSport: 'favorite-sport', }; +const _$SportDetailsEnumMap = { + SportDetails.volleyball: 'volleyball', + SportDetails.football: 'football', + SportDetails.tennis: 'tennis', + SportDetails.hockey: 'hockey', +}; + T? _$convertMapValue( String key, Map map, diff --git a/packages/go_router_builder/example/lib/shared/data.dart b/packages/go_router_builder/example/lib/shared/data.dart index 3f017fc4faa6..871e372342d4 100644 --- a/packages/go_router_builder/example/lib/shared/data.dart +++ b/packages/go_router_builder/example/lib/shared/data.dart @@ -14,6 +14,46 @@ enum PersonDetails { favoriteSport, } +enum SportDetails { + volleyball( + imageUrl: 'https://i.cbc.ca/1.6477752.1654316355!/fileImage/httpImage/image.jpg_gen/derivatives/16x9_940/canada-vs-usa-volleyball.jpg', + playerPerTeam: 6, + accessory: null, + hasNet: true, + ), + football( + imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/b/b9/Football_iu_1996.jpg', + playerPerTeam: 11, + accessory: null, + hasNet: true, + ), + tennis( + imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/9/94/2013_Australian_Open_-_Guillaume_Rufin.jpg', + playerPerTeam: 2, + accessory: 'Rackets', + hasNet: true, + ), + hockey( + imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/3/39/Pittsburgh_Penguins%2C_Washington_Capitals%2C_Bryan_Rust_%2833744033514%29.jpg', + playerPerTeam: 6, + accessory: 'Hockey sticks', + hasNet: true, + ), + ; + + final String imageUrl; + final int playerPerTeam; + final String? accessory; + final bool hasNet; + + const SportDetails({ + required this.accessory, + required this.hasNet, + required this.imageUrl, + required this.playerPerTeam, + }); +} + /// sample Person class class Person { Person({ diff --git a/packages/go_router_builder/example/pubspec.yaml b/packages/go_router_builder/example/pubspec.yaml index 90edafe45ec5..4a4f72f03d31 100644 --- a/packages/go_router_builder/example/pubspec.yaml +++ b/packages/go_router_builder/example/pubspec.yaml @@ -3,7 +3,7 @@ description: go_router_builder examples publish_to: none environment: - sdk: ">=2.14.0 <3.0.0" + sdk: ">=2.17.0 <3.0.0" dependencies: flutter: From 78663d716d55ab6c2ee52f92744c3dbf6d513031 Mon Sep 17 00:00:00 2001 From: Mirko Mucaria Date: Tue, 9 Aug 2022 10:02:36 +0200 Subject: [PATCH 08/15] fix format --- .../example/lib/all_types.dart | 42 +++++++++---------- .../example/lib/shared/data.dart | 12 ++++-- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/packages/go_router_builder/example/lib/all_types.dart b/packages/go_router_builder/example/lib/all_types.dart index d4e9436f1eec..22b37fb2c9f9 100644 --- a/packages/go_router_builder/example/lib/all_types.dart +++ b/packages/go_router_builder/example/lib/all_types.dart @@ -131,27 +131,27 @@ class AllTypesApp extends StatelessWidget { debugLogDiagnostics: true, routes: $appRoutes, initialLocation: AllTypesRoute( - requiredBigIntField: BigInt.two, - requiredBoolField: true, - requiredDateTimeField: DateTime.now(), - requiredDoubleField: 3.14, - requiredEnumField: PersonDetails.favoriteSport, - requiredEnhancedEnumField: SportDetails.football, - requiredIntField: -42, - requiredNumField: 3.15, - requiredStringField: r'$!/#bob%%20', - requiredUriField: Uri.parse('https://dart.dev'), - bigIntField: BigInt.zero, - boolField: false, - dateTimeField: DateTime(0), - doubleField: 3.14, - enumField: PersonDetails.favoriteSport, - enhancedEnumField: SportDetails.volleyball, - intField: -42, - numField: 3.15, - stringField: r'$!/#bob%%20', - uriField: Uri.parse('https://dart.dev'), - ).location, + requiredBigIntField: BigInt.two, + requiredBoolField: true, + requiredDateTimeField: DateTime.now(), + requiredDoubleField: 3.14, + requiredEnumField: PersonDetails.favoriteSport, + requiredEnhancedEnumField: SportDetails.football, + requiredIntField: -42, + requiredNumField: 3.15, + requiredStringField: r'$!/#bob%%20', + requiredUriField: Uri.parse('https://dart.dev'), + bigIntField: BigInt.zero, + boolField: false, + dateTimeField: DateTime(0), + doubleField: 3.14, + enumField: PersonDetails.favoriteSport, + enhancedEnumField: SportDetails.volleyball, + intField: -42, + numField: 3.15, + stringField: r'$!/#bob%%20', + uriField: Uri.parse('https://dart.dev'), + ).location, // redirect to the login page if the user is not logged in redirect: (GoRouterState state) { diff --git a/packages/go_router_builder/example/lib/shared/data.dart b/packages/go_router_builder/example/lib/shared/data.dart index 871e372342d4..cf65acadb583 100644 --- a/packages/go_router_builder/example/lib/shared/data.dart +++ b/packages/go_router_builder/example/lib/shared/data.dart @@ -16,25 +16,29 @@ enum PersonDetails { enum SportDetails { volleyball( - imageUrl: 'https://i.cbc.ca/1.6477752.1654316355!/fileImage/httpImage/image.jpg_gen/derivatives/16x9_940/canada-vs-usa-volleyball.jpg', + imageUrl: + 'https://i.cbc.ca/1.6477752.1654316355!/fileImage/httpImage/image.jpg_gen/derivatives/16x9_940/canada-vs-usa-volleyball.jpg', playerPerTeam: 6, accessory: null, hasNet: true, ), football( - imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/b/b9/Football_iu_1996.jpg', + imageUrl: + 'https://upload.wikimedia.org/wikipedia/commons/b/b9/Football_iu_1996.jpg', playerPerTeam: 11, accessory: null, hasNet: true, ), tennis( - imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/9/94/2013_Australian_Open_-_Guillaume_Rufin.jpg', + imageUrl: + 'https://upload.wikimedia.org/wikipedia/commons/9/94/2013_Australian_Open_-_Guillaume_Rufin.jpg', playerPerTeam: 2, accessory: 'Rackets', hasNet: true, ), hockey( - imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/3/39/Pittsburgh_Penguins%2C_Washington_Capitals%2C_Bryan_Rust_%2833744033514%29.jpg', + imageUrl: + 'https://upload.wikimedia.org/wikipedia/commons/3/39/Pittsburgh_Penguins%2C_Washington_Capitals%2C_Bryan_Rust_%2833744033514%29.jpg', playerPerTeam: 6, accessory: 'Hockey sticks', hasNet: true, From 531e5edd74db13598d757c23119999ba77ae1a07 Mon Sep 17 00:00:00 2001 From: Mirko Mucaria Date: Sat, 10 Sep 2022 15:42:41 +0200 Subject: [PATCH 09/15] all types example app refactory --- .../example/lib/all_types.dart | 442 ++++++++++++------ .../example/lib/all_types.g.dart | 272 +++++++++-- 2 files changed, 541 insertions(+), 173 deletions(-) diff --git a/packages/go_router_builder/example/lib/all_types.dart b/packages/go_router_builder/example/lib/all_types.dart index 22b37fb2c9f9..e313645e1733 100644 --- a/packages/go_router_builder/example/lib/all_types.dart +++ b/packages/go_router_builder/example/lib/all_types.dart @@ -11,108 +11,334 @@ import 'shared/data.dart'; part 'all_types.g.dart'; -@TypedGoRoute( - path: '/:requiredBigIntField/:requiredBoolField/:requiredDateTimeField' - '/:requiredDoubleField/:requiredEnumField/:requiredEnhancedEnumField/:requiredIntField' - '/:requiredNumField/:requiredStringField/:requiredUriField', -) +@TypedGoRoute(path: '/', routes: [ + TypedGoRoute(path: 'big-int-route/:requiredBigIntField'), + TypedGoRoute(path: 'bool-route/:requiredBoolField'), + TypedGoRoute(path: 'date-time-route/:requiredDateTimeField'), + TypedGoRoute(path: 'double-route/:requiredDoubleField'), + TypedGoRoute(path: 'int-route/:requiredIntField'), + TypedGoRoute(path: 'num-route/:requiredNumField'), + TypedGoRoute(path: 'double-route/:requiredDoubleField'), + TypedGoRoute(path: 'enum-route/:requiredEnumFieldField'), + TypedGoRoute(path: 'enhanced-enum-route/:requiredEnumFieldField'), + TypedGoRoute(path: 'string-route/:requiredStringFieldField'), + TypedGoRoute(path: 'uri-route/:requiredUriFieldField'), +]) @immutable -class AllTypesRoute extends GoRouteData { - const AllTypesRoute({ +class AllTypesBaseRoute extends GoRouteData { + const AllTypesBaseRoute(); + + @override + Widget build(BuildContext context) => BasePage( + dataTitle: 'Root', + param: null, + ); +} + +class BigIntRoute extends GoRouteData { + final BigInt requiredBigIntField; + final BigInt? bigIntField; + + BigIntRoute({ required this.requiredBigIntField, - required this.requiredBoolField, - required this.requiredDateTimeField, - required this.requiredDoubleField, - required this.requiredEnumField, - required this.requiredIntField, - required this.requiredNumField, - required this.requiredEnhancedEnumField, - required this.requiredStringField, - required this.requiredUriField, this.bigIntField, - this.boolField, - this.dateTimeField, - this.doubleField, - this.enumField, - this.enhancedEnumField, - this.intField, - this.numField, - this.stringField, - this.uriField, }); - final BigInt requiredBigIntField; - final bool requiredBoolField; - final DateTime requiredDateTimeField; - final double requiredDoubleField; - final PersonDetails requiredEnumField; - final SportDetails requiredEnhancedEnumField; - final int requiredIntField; - final num requiredNumField; - final String requiredStringField; - final Uri requiredUriField; + @override + Widget build(BuildContext context) => BasePage( + dataTitle: 'BigIntRoute', + param: requiredBigIntField, + queryParam: bigIntField, + ); - final BigInt? bigIntField; + Widget drawerTile(BuildContext context) => ListTile( + title: Text('BigIntRoute'), + onTap: () => go(context), + selected: GoRouter.of(context).location == location, + ); +} + +class BoolRoute extends GoRouteData { + final bool requiredBoolField; final bool? boolField; + + BoolRoute({ + required this.requiredBoolField, + this.boolField, + }); + + @override + Widget build(BuildContext context) => BasePage( + dataTitle: 'BoolRoute', + param: requiredBoolField, + queryParam: boolField, + ); + + Widget drawerTile(BuildContext context) => ListTile( + title: Text('BoolRoute'), + onTap: () => go(context), + selected: GoRouter.of(context).location == location, + ); +} + +class DateTimeRoute extends GoRouteData { + final DateTime requiredDateTimeField; final DateTime? dateTimeField; + + DateTimeRoute({ + required this.requiredDateTimeField, + this.dateTimeField, + }); + + @override + Widget build(BuildContext context) => BasePage( + dataTitle: 'DateTimeRoute', + param: requiredDateTimeField, + queryParam: dateTimeField, + ); + + Widget drawerTile(BuildContext context) => ListTile( + title: Text('DateTimeRoute'), + onTap: () => go(context), + selected: GoRouter.of(context).location == location, + ); +} + +class DoubleRoute extends GoRouteData { + final double requiredDoubleField; final double? doubleField; - final PersonDetails? enumField; - final SportDetails? enhancedEnumField; + + DoubleRoute({ + required this.requiredDoubleField, + this.doubleField, + }); + + @override + Widget build(BuildContext context) => BasePage( + dataTitle: 'DoubleRoute', + param: requiredDoubleField, + queryParam: doubleField, + ); + + Widget drawerTile(BuildContext context) => ListTile( + title: Text('DoubleRoute'), + onTap: () => go(context), + selected: GoRouter.of(context).location == location, + ); +} + +class IntRoute extends GoRouteData { + final int requiredIntField; final int? intField; + + IntRoute({ + required this.requiredIntField, + this.intField, + }); + + @override + Widget build(BuildContext context) => BasePage( + dataTitle: 'IntRoute', + param: requiredIntField, + queryParam: intField, + ); + + Widget drawerTile(BuildContext context) => ListTile( + title: Text('IntRoute'), + onTap: () => go(context), + selected: GoRouter.of(context).location == location, + ); +} + +class NumRoute extends GoRouteData { + final num requiredNumField; final num? numField; - final String? stringField; - final Uri? uriField; + + NumRoute({ + required this.requiredNumField, + this.numField, + }); + + @override + Widget build(BuildContext context) => BasePage( + dataTitle: 'NumRoute', + param: requiredNumField, + queryParam: numField, + ); + + Widget drawerTile(BuildContext context) => ListTile( + title: Text('NumRoute'), + onTap: () => go(context), + selected: GoRouter.of(context).location == location, + ); +} + +class EnumRoute extends GoRouteData { + final PersonDetails requiredEnumFieldField; + final PersonDetails? enumFieldField; + + EnumRoute({ + required this.requiredEnumFieldField, + this.enumFieldField, + }); + + @override + Widget build(BuildContext context) => BasePage( + dataTitle: 'EnumRoute', + param: requiredEnumFieldField, + queryParam: enumFieldField, + ); + + Widget drawerTile(BuildContext context) => ListTile( + title: Text('EnumRoute'), + onTap: () => go(context), + selected: GoRouter.of(context).location == location, + ); +} + +class EnhancedEnumRoute extends GoRouteData { + final SportDetails requiredEnumFieldField; + final SportDetails? enumFieldField; + + EnhancedEnumRoute({ + required this.requiredEnumFieldField, + this.enumFieldField, + }); + + @override + Widget build(BuildContext context) => BasePage( + dataTitle: 'EnhancedEnumRoute', + param: requiredEnumFieldField, + queryParam: enumFieldField, + ); + + Widget drawerTile(BuildContext context) => ListTile( + title: Text('EnhancedEnumRoute'), + onTap: () => go(context), + selected: GoRouter.of(context).location == location, + ); +} + +class StringRoute extends GoRouteData { + final String requiredStringFieldField; + final String? stringFieldField; + + StringRoute({ + required this.requiredStringFieldField, + this.stringFieldField, + }); + + @override + Widget build(BuildContext context) => BasePage( + dataTitle: 'StringRoute', + param: requiredStringFieldField, + queryParam: stringFieldField, + ); + + Widget drawerTile(BuildContext context) => ListTile( + title: Text('StringRoute'), + onTap: () => go(context), + selected: GoRouter.of(context).location == location, + ); +} + +class UriRoute extends GoRouteData { + final Uri requiredUriFieldField; + final Uri? uriFieldField; + + UriRoute({ + required this.requiredUriFieldField, + this.uriFieldField, + }); + + @override + Widget build(BuildContext context) => BasePage( + dataTitle: 'UriRoute', + param: requiredUriFieldField, + queryParam: uriFieldField, + ); + + Widget drawerTile(BuildContext context) => ListTile( + title: Text('UriRoute'), + onTap: () => go(context), + selected: GoRouter.of(context).location == location, + ); +} + +class BasePage extends StatelessWidget { + final String dataTitle; + final T param; + final T? queryParam; + + BasePage({ + required this.dataTitle, + required this.param, + this.queryParam, + }); @override Widget build(BuildContext context) => Scaffold( + appBar: AppBar( + title: Text('Go router typed routes'), + ), + drawer: Drawer( + child: ListView( + children: [ + BigIntRoute( + requiredBigIntField: BigInt.two, + bigIntField: BigInt.zero, + ).drawerTile(context), + BoolRoute( + requiredBoolField: true, + boolField: false, + ).drawerTile(context), + DateTimeRoute( + requiredDateTimeField: DateTime(1970, 1, 1), + 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( + requiredStringFieldField:r'$!/#bob%%20', + stringFieldField: r'$!/#bob%%20', + ).drawerTile(context), + EnumRoute( + requiredEnumFieldField: PersonDetails.favoriteSport, + enumFieldField: PersonDetails.favoriteFood, + ).drawerTile(context), + EnhancedEnumRoute( + requiredEnumFieldField: SportDetails.football, + enumFieldField: SportDetails.volleyball, + ).drawerTile(context), + UriRoute( + requiredUriFieldField: Uri.parse('https://dart.dev'), + uriFieldField: Uri.parse('https://dart.dev'), + ).drawerTile(context), + ], + )), body: Center( child: Column( mainAxisSize: MainAxisSize.min, children: [ - const Text('built!'), - SelectableText(location), + const Text('Built!'), + Text(dataTitle), + Text('Param: $param'), + Text('Query param: $queryParam'), + SelectableText(GoRouter.of(context).location), ], ), ), ); - - @override - int get hashCode => Object.hashAll(_items); - - @override - bool operator ==(Object other) { - if (other is AllTypesRoute) { - final List mine = _items; - final List theirs = other._items; - for (int i = 0; i < mine.length; i++) { - if (mine[i] != theirs[i]) { - return false; - } - } - } - return true; - } - - List get _items => [ - requiredBigIntField, - requiredBoolField, - requiredDateTimeField, - requiredDoubleField, - requiredEnumField, - requiredIntField, - requiredNumField, - requiredStringField, - requiredUriField, - bigIntField, - boolField, - dateTimeField, - doubleField, - enumField, - intField, - numField, - stringField, - uriField, - ]; } void main() => runApp(AllTypesApp()); @@ -130,60 +356,6 @@ class AllTypesApp extends StatelessWidget { late final GoRouter _router = GoRouter( debugLogDiagnostics: true, routes: $appRoutes, - initialLocation: AllTypesRoute( - requiredBigIntField: BigInt.two, - requiredBoolField: true, - requiredDateTimeField: DateTime.now(), - requiredDoubleField: 3.14, - requiredEnumField: PersonDetails.favoriteSport, - requiredEnhancedEnumField: SportDetails.football, - requiredIntField: -42, - requiredNumField: 3.15, - requiredStringField: r'$!/#bob%%20', - requiredUriField: Uri.parse('https://dart.dev'), - bigIntField: BigInt.zero, - boolField: false, - dateTimeField: DateTime(0), - doubleField: 3.14, - enumField: PersonDetails.favoriteSport, - enhancedEnumField: SportDetails.volleyball, - intField: -42, - numField: 3.15, - stringField: r'$!/#bob%%20', - uriField: Uri.parse('https://dart.dev'), - ).location, - - // redirect to the login page if the user is not logged in - redirect: (GoRouterState state) { - if (state.location == '/') { - final String location = AllTypesRoute( - requiredBigIntField: BigInt.two, - requiredBoolField: true, - requiredDateTimeField: DateTime.now(), - requiredDoubleField: 3.14, - requiredEnumField: PersonDetails.favoriteSport, - requiredEnhancedEnumField: SportDetails.football, - requiredIntField: -42, - requiredNumField: 3.15, - requiredStringField: r'$!/#bob%%20', - requiredUriField: Uri.parse('https://dart.dev'), - bigIntField: BigInt.zero, - boolField: false, - dateTimeField: DateTime(0), - doubleField: 3.14, - enumField: PersonDetails.favoriteSport, - enhancedEnumField: SportDetails.volleyball, - intField: -42, - numField: 3.15, - stringField: r'$!/#bob%%20', - uriField: Uri.parse('https://dart.dev'), - ).location; - - return location; - } - - // no need to redirect at all - return null; - }, + initialLocation: AllTypesBaseRoute().location, ); } diff --git a/packages/go_router_builder/example/lib/all_types.g.dart b/packages/go_router_builder/example/lib/all_types.g.dart index a63a000be99c..abdd1e6ac3d5 100644 --- a/packages/go_router_builder/example/lib/all_types.g.dart +++ b/packages/go_router_builder/example/lib/all_types.g.dart @@ -9,64 +9,260 @@ part of 'all_types.dart'; // ************************************************************************** List get $appRoutes => [ - $allTypesRoute, + $allTypesBaseRoute, ]; -GoRoute get $allTypesRoute => GoRouteData.$route( - path: - '/:requiredBigIntField/:requiredBoolField/:requiredDateTimeField/:requiredDoubleField/:requiredEnumField/:requiredEnhancedEnumField/:requiredIntField/:requiredNumField/:requiredStringField/:requiredUriField', - factory: $AllTypesRouteExtension._fromState, +GoRoute get $allTypesBaseRoute => GoRouteData.$route( + path: '/', + factory: $AllTypesBaseRouteExtension._fromState, + routes: [ + GoRouteData.$route( + path: 'big-int-route/:requiredBigIntField', + factory: $BigIntRouteExtension._fromState, + ), + GoRouteData.$route( + path: 'bool-route/:requiredBoolField', + factory: $BoolRouteExtension._fromState, + ), + GoRouteData.$route( + path: 'date-time-route/:requiredDateTimeField', + factory: $DateTimeRouteExtension._fromState, + ), + GoRouteData.$route( + path: 'double-route/:requiredDoubleField', + factory: $DoubleRouteExtension._fromState, + ), + GoRouteData.$route( + path: 'int-route/:requiredIntField', + factory: $IntRouteExtension._fromState, + ), + GoRouteData.$route( + path: 'num-route/:requiredNumField', + factory: $NumRouteExtension._fromState, + ), + GoRouteData.$route( + path: 'double-route/:requiredDoubleField', + factory: $DoubleRouteExtension._fromState, + ), + GoRouteData.$route( + path: 'enum-route/:requiredEnumFieldField', + factory: $EnumRouteExtension._fromState, + ), + GoRouteData.$route( + path: 'enhanced-enum-route/:requiredEnumFieldField', + factory: $EnhancedEnumRouteExtension._fromState, + ), + GoRouteData.$route( + path: 'string-route/:requiredStringFieldField', + factory: $StringRouteExtension._fromState, + ), + GoRouteData.$route( + path: 'uri-route/:requiredUriFieldField', + factory: $UriRouteExtension._fromState, + ), + ], ); -extension $AllTypesRouteExtension on AllTypesRoute { - static AllTypesRoute _fromState(GoRouterState state) => AllTypesRoute( +extension $AllTypesBaseRouteExtension on AllTypesBaseRoute { + static AllTypesBaseRoute _fromState(GoRouterState state) => + const AllTypesBaseRoute(); + + String get location => GoRouteData.$location( + '/', + ); + + void go(BuildContext context) => context.go(location, extra: this); + + void push(BuildContext context) => context.push(location, extra: this); +} + +extension $BigIntRouteExtension on BigIntRoute { + static BigIntRoute _fromState(GoRouterState state) => BigIntRoute( requiredBigIntField: BigInt.parse(state.params['requiredBigIntField']!), - requiredBoolField: _$boolConverter(state.params['requiredBoolField']!), - requiredDateTimeField: - DateTime.parse(state.params['requiredDateTimeField']!), - requiredDoubleField: double.parse(state.params['requiredDoubleField']!), - requiredEnumField: _$PersonDetailsEnumMap - ._$fromName(state.params['requiredEnumField']!), - requiredIntField: int.parse(state.params['requiredIntField']!), - requiredNumField: num.parse(state.params['requiredNumField']!), - requiredEnhancedEnumField: _$SportDetailsEnumMap - ._$fromName(state.params['requiredEnhancedEnumField']!), - requiredStringField: state.params['requiredStringField']!, - requiredUriField: Uri.parse(state.params['requiredUriField']!), bigIntField: _$convertMapValue('big-int-field', state.queryParams, BigInt.parse), + ); + + String get location => GoRouteData.$location( + '/big-int-route/${Uri.encodeComponent(requiredBigIntField.toString())}', + queryParams: { + if (bigIntField != null) 'big-int-field': bigIntField!.toString(), + }, + ); + + void go(BuildContext context) => context.go(location, extra: this); + + void push(BuildContext context) => context.push(location, extra: this); +} + +extension $BoolRouteExtension on BoolRoute { + static BoolRoute _fromState(GoRouterState state) => BoolRoute( + requiredBoolField: _$boolConverter(state.params['requiredBoolField']!), boolField: _$convertMapValue('bool-field', state.queryParams, _$boolConverter), + ); + + String get location => GoRouteData.$location( + '/bool-route/${Uri.encodeComponent(requiredBoolField.toString())}', + queryParams: { + if (boolField != null) 'bool-field': boolField!.toString(), + }, + ); + + void go(BuildContext context) => context.go(location, extra: this); + + void push(BuildContext context) => context.push(location, extra: this); +} + +extension $DateTimeRouteExtension on DateTimeRoute { + static DateTimeRoute _fromState(GoRouterState state) => DateTimeRoute( + requiredDateTimeField: + DateTime.parse(state.params['requiredDateTimeField']!), dateTimeField: _$convertMapValue( 'date-time-field', state.queryParams, DateTime.parse), - doubleField: - _$convertMapValue('double-field', state.queryParams, double.parse), - enumField: _$convertMapValue( - 'enum-field', state.queryParams, _$PersonDetailsEnumMap._$fromName), - enhancedEnumField: _$convertMapValue('enhanced-enum-field', - state.queryParams, _$SportDetailsEnumMap._$fromName), - intField: _$convertMapValue('int-field', state.queryParams, int.parse), - numField: _$convertMapValue('num-field', state.queryParams, num.parse), - stringField: state.queryParams['string-field'], - uriField: _$convertMapValue('uri-field', state.queryParams, Uri.parse), ); String get location => GoRouteData.$location( - '/${Uri.encodeComponent(requiredBigIntField.toString())}/${Uri.encodeComponent(requiredBoolField.toString())}/${Uri.encodeComponent(requiredDateTimeField.toString())}/${Uri.encodeComponent(requiredDoubleField.toString())}/${Uri.encodeComponent(_$PersonDetailsEnumMap[requiredEnumField]!)}/${Uri.encodeComponent(_$SportDetailsEnumMap[requiredEnhancedEnumField]!)}/${Uri.encodeComponent(requiredIntField.toString())}/${Uri.encodeComponent(requiredNumField.toString())}/${Uri.encodeComponent(requiredStringField)}/${Uri.encodeComponent(requiredUriField.toString())}', + '/date-time-route/${Uri.encodeComponent(requiredDateTimeField.toString())}', queryParams: { - if (bigIntField != null) 'big-int-field': bigIntField!.toString(), - if (boolField != null) 'bool-field': boolField!.toString(), if (dateTimeField != null) 'date-time-field': dateTimeField!.toString(), + }, + ); + + void go(BuildContext context) => context.go(location, extra: this); + + void push(BuildContext context) => context.push(location, extra: this); +} + +extension $DoubleRouteExtension on DoubleRoute { + static DoubleRoute _fromState(GoRouterState state) => DoubleRoute( + requiredDoubleField: double.parse(state.params['requiredDoubleField']!), + doubleField: + _$convertMapValue('double-field', state.queryParams, double.parse), + ); + + String get location => GoRouteData.$location( + '/double-route/${Uri.encodeComponent(requiredDoubleField.toString())}', + queryParams: { if (doubleField != null) 'double-field': doubleField!.toString(), - if (enumField != null) - 'enum-field': _$PersonDetailsEnumMap[enumField!]!, - if (enhancedEnumField != null) - 'enhanced-enum-field': _$SportDetailsEnumMap[enhancedEnumField!]!, + }, + ); + + void go(BuildContext context) => context.go(location, extra: this); + + void push(BuildContext context) => context.push(location, extra: this); +} + +extension $IntRouteExtension on IntRoute { + static IntRoute _fromState(GoRouterState state) => IntRoute( + requiredIntField: int.parse(state.params['requiredIntField']!), + intField: _$convertMapValue('int-field', state.queryParams, int.parse), + ); + + String get location => GoRouteData.$location( + '/int-route/${Uri.encodeComponent(requiredIntField.toString())}', + queryParams: { if (intField != null) 'int-field': intField!.toString(), + }, + ); + + void go(BuildContext context) => context.go(location, extra: this); + + void push(BuildContext context) => context.push(location, extra: this); +} + +extension $NumRouteExtension on NumRoute { + static NumRoute _fromState(GoRouterState state) => NumRoute( + requiredNumField: num.parse(state.params['requiredNumField']!), + numField: _$convertMapValue('num-field', state.queryParams, num.parse), + ); + + String get location => GoRouteData.$location( + '/num-route/${Uri.encodeComponent(requiredNumField.toString())}', + queryParams: { if (numField != null) 'num-field': numField!.toString(), - if (stringField != null) 'string-field': stringField!, - if (uriField != null) 'uri-field': uriField!.toString(), + }, + ); + + void go(BuildContext context) => context.go(location, extra: this); + + void push(BuildContext context) => context.push(location, extra: this); +} + +extension $EnumRouteExtension on EnumRoute { + static EnumRoute _fromState(GoRouterState state) => EnumRoute( + requiredEnumFieldField: _$PersonDetailsEnumMap + ._$fromName(state.params['requiredEnumFieldField']!), + enumFieldField: _$convertMapValue('enum-field-field', state.queryParams, + _$PersonDetailsEnumMap._$fromName), + ); + + String get location => GoRouteData.$location( + '/enum-route/${Uri.encodeComponent(_$PersonDetailsEnumMap[requiredEnumFieldField]!)}', + queryParams: { + if (enumFieldField != null) + 'enum-field-field': _$PersonDetailsEnumMap[enumFieldField!]!, + }, + ); + + void go(BuildContext context) => context.go(location, extra: this); + + void push(BuildContext context) => context.push(location, extra: this); +} + +extension $EnhancedEnumRouteExtension on EnhancedEnumRoute { + static EnhancedEnumRoute _fromState(GoRouterState state) => EnhancedEnumRoute( + requiredEnumFieldField: _$SportDetailsEnumMap + ._$fromName(state.params['requiredEnumFieldField']!), + enumFieldField: _$convertMapValue('enum-field-field', state.queryParams, + _$SportDetailsEnumMap._$fromName), + ); + + String get location => GoRouteData.$location( + '/enhanced-enum-route/${Uri.encodeComponent(_$SportDetailsEnumMap[requiredEnumFieldField]!)}', + queryParams: { + if (enumFieldField != null) + 'enum-field-field': _$SportDetailsEnumMap[enumFieldField!]!, + }, + ); + + void go(BuildContext context) => context.go(location, extra: this); + + void push(BuildContext context) => context.push(location, extra: this); +} + +extension $StringRouteExtension on StringRoute { + static StringRoute _fromState(GoRouterState state) => StringRoute( + requiredStringFieldField: state.params['requiredStringFieldField']!, + stringFieldField: state.queryParams['string-field-field'], + ); + + String get location => GoRouteData.$location( + '/string-route/${Uri.encodeComponent(requiredStringFieldField)}', + queryParams: { + if (stringFieldField != null) 'string-field-field': stringFieldField!, + }, + ); + + void go(BuildContext context) => context.go(location, extra: this); + + void push(BuildContext context) => context.push(location, extra: this); +} + +extension $UriRouteExtension on UriRoute { + static UriRoute _fromState(GoRouterState state) => UriRoute( + requiredUriFieldField: + Uri.parse(state.params['requiredUriFieldField']!), + uriFieldField: + _$convertMapValue('uri-field-field', state.queryParams, Uri.parse), + ); + + String get location => GoRouteData.$location( + '/uri-route/${Uri.encodeComponent(requiredUriFieldField.toString())}', + queryParams: { + if (uriFieldField != null) + 'uri-field-field': uriFieldField!.toString(), }, ); From 1b462bef430ef10657a4ca886b46eeaa8c882734 Mon Sep 17 00:00:00 2001 From: Mirko Mucaria Date: Sat, 10 Sep 2022 16:54:05 +0200 Subject: [PATCH 10/15] all types test --- .../example/test/all_types_test.dart | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 packages/go_router_builder/example/test/all_types_test.dart diff --git a/packages/go_router_builder/example/test/all_types_test.dart b/packages/go_router_builder/example/test/all_types_test.dart new file mode 100644 index 000000000000..4f2a7191ea6f --- /dev/null +++ b/packages/go_router_builder/example/test/all_types_test.dart @@ -0,0 +1,110 @@ +// 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. + +// import 'package:flutter/material.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:go_router_builder_example/all_types.dart'; +import 'package:go_router_builder_example/shared/data.dart'; + +void main() { + testWidgets('Validate extra logic walkthrough', (WidgetTester tester) async { + await tester.pumpWidget(AllTypesApp()); + + final ScaffoldState scaffoldState = + tester.firstState(find.byType(Scaffold)); + + BigIntRoute( + requiredBigIntField: BigInt.from(4), + bigIntField: BigInt.from(8), + ).go(scaffoldState.context); + await tester.pumpAndSettle(); + expect(find.text('BigIntRoute'), findsOneWidget); + expect(find.text('Param: 4'), findsOneWidget); + expect(find.text('Query param: 8'), findsOneWidget); + + BoolRoute( + requiredBoolField: false, + boolField: true, + ).go(scaffoldState.context); + await tester.pumpAndSettle(); + expect(find.text('BoolRoute'), findsOneWidget); + expect(find.text('Param: false'), findsOneWidget); + expect(find.text('Query param: true'), findsOneWidget); + + final param = DateTime.now(); + final query = DateTime(2017, 9, 7, 17, 30); + DateTimeRoute( + requiredDateTimeField: param, + dateTimeField: query, + ).go(scaffoldState.context); + await tester.pumpAndSettle(); + expect(find.text('DateTimeRoute'), findsOneWidget); + expect(find.text('Param: $param'), findsOneWidget); + expect(find.text('Query param: $query'), findsOneWidget); + + DoubleRoute( + requiredDoubleField: 3.14, + doubleField: -3.14, + ).go(scaffoldState.context); + await tester.pumpAndSettle(); + expect(find.text('DoubleRoute'), findsOneWidget); + expect(find.text('Param: 3.14'), findsOneWidget); + expect(find.text('Query param: -3.14'), findsOneWidget); + + IntRoute( + requiredIntField: 65, + intField: -65, + ).go(scaffoldState.context); + await tester.pumpAndSettle(); + expect(find.text('IntRoute'), findsOneWidget); + expect(find.text('Param: 65'), findsOneWidget); + expect(find.text('Query param: -65'), findsOneWidget); + + NumRoute( + requiredNumField: 987.32, + numField: -987.32, + ).go(scaffoldState.context); + await tester.pumpAndSettle(); + expect(find.text('NumRoute'), findsOneWidget); + expect(find.text('Param: 987.32'), findsOneWidget); + expect(find.text('Query param: -987.32'), findsOneWidget); + + StringRoute( + requiredStringFieldField: r'Tytire tu patulae recubans sub tegmine fagi.', + stringFieldField: r'Tytire tu patulae recubans sub tegmine fagi.', + ).go(scaffoldState.context); + await tester.pumpAndSettle(); + expect(find.text('StringRoute'), findsOneWidget); + expect(find.text('Param: Tytire tu patulae recubans sub tegmine fagi.'), findsOneWidget); + expect(find.text('Query param: Tytire tu patulae recubans sub tegmine fagi.'), findsOneWidget); + + EnumRoute( + requiredEnumFieldField: PersonDetails.favoriteFood, + enumFieldField: PersonDetails.favoriteSport, + ).go(scaffoldState.context); + await tester.pumpAndSettle(); + expect(find.text('EnumRoute'), findsOneWidget); + expect(find.text('Param: PersonDetails.favoriteFood'), findsOneWidget); + expect(find.text('Query param: PersonDetails.favoriteSport'), findsOneWidget); + + EnhancedEnumRoute( + requiredEnumFieldField: SportDetails.football, + enumFieldField: SportDetails.hockey, + ).go(scaffoldState.context); + await tester.pumpAndSettle(); + expect(find.text('EnhancedEnumRoute'), findsOneWidget); + expect(find.text('Param: SportDetails.football'), findsOneWidget); + expect(find.text('Query param: SportDetails.hockey'), findsOneWidget); + + UriRoute( + requiredUriFieldField: Uri.parse('https://dart.dev'), + uriFieldField: Uri.parse('https://dart.dev'), + ).go(scaffoldState.context); + await tester.pumpAndSettle(); + expect(find.text('UriRoute'), findsOneWidget); + expect(find.text('Param: https://dart.dev'), findsOneWidget); + expect(find.text('Query param: https://dart.dev'), findsOneWidget); + }); +} From bdf68b379cc38cce4552c0eba81ca271f2b39754 Mon Sep 17 00:00:00 2001 From: Mirko Mucaria Date: Sat, 10 Sep 2022 17:02:13 +0200 Subject: [PATCH 11/15] format --- .../example/lib/all_types.dart | 97 ++++++++++--------- .../example/test/all_types_test.dart | 10 +- 2 files changed, 56 insertions(+), 51 deletions(-) diff --git a/packages/go_router_builder/example/lib/all_types.dart b/packages/go_router_builder/example/lib/all_types.dart index e313645e1733..e4e1bc729d06 100644 --- a/packages/go_router_builder/example/lib/all_types.dart +++ b/packages/go_router_builder/example/lib/all_types.dart @@ -20,7 +20,8 @@ part 'all_types.g.dart'; TypedGoRoute(path: 'num-route/:requiredNumField'), TypedGoRoute(path: 'double-route/:requiredDoubleField'), TypedGoRoute(path: 'enum-route/:requiredEnumFieldField'), - TypedGoRoute(path: 'enhanced-enum-route/:requiredEnumFieldField'), + TypedGoRoute( + path: 'enhanced-enum-route/:requiredEnumFieldField'), TypedGoRoute(path: 'string-route/:requiredStringFieldField'), TypedGoRoute(path: 'uri-route/:requiredUriFieldField'), ]) @@ -30,9 +31,9 @@ class AllTypesBaseRoute extends GoRouteData { @override Widget build(BuildContext context) => BasePage( - dataTitle: 'Root', - param: null, - ); + dataTitle: 'Root', + param: null, + ); } class BigIntRoute extends GoRouteData { @@ -46,10 +47,10 @@ class BigIntRoute extends GoRouteData { @override Widget build(BuildContext context) => BasePage( - dataTitle: 'BigIntRoute', - param: requiredBigIntField, - queryParam: bigIntField, - ); + dataTitle: 'BigIntRoute', + param: requiredBigIntField, + queryParam: bigIntField, + ); Widget drawerTile(BuildContext context) => ListTile( title: Text('BigIntRoute'), @@ -69,10 +70,10 @@ class BoolRoute extends GoRouteData { @override Widget build(BuildContext context) => BasePage( - dataTitle: 'BoolRoute', - param: requiredBoolField, - queryParam: boolField, - ); + dataTitle: 'BoolRoute', + param: requiredBoolField, + queryParam: boolField, + ); Widget drawerTile(BuildContext context) => ListTile( title: Text('BoolRoute'), @@ -92,10 +93,10 @@ class DateTimeRoute extends GoRouteData { @override Widget build(BuildContext context) => BasePage( - dataTitle: 'DateTimeRoute', - param: requiredDateTimeField, - queryParam: dateTimeField, - ); + dataTitle: 'DateTimeRoute', + param: requiredDateTimeField, + queryParam: dateTimeField, + ); Widget drawerTile(BuildContext context) => ListTile( title: Text('DateTimeRoute'), @@ -115,10 +116,10 @@ class DoubleRoute extends GoRouteData { @override Widget build(BuildContext context) => BasePage( - dataTitle: 'DoubleRoute', - param: requiredDoubleField, - queryParam: doubleField, - ); + dataTitle: 'DoubleRoute', + param: requiredDoubleField, + queryParam: doubleField, + ); Widget drawerTile(BuildContext context) => ListTile( title: Text('DoubleRoute'), @@ -138,10 +139,10 @@ class IntRoute extends GoRouteData { @override Widget build(BuildContext context) => BasePage( - dataTitle: 'IntRoute', - param: requiredIntField, - queryParam: intField, - ); + dataTitle: 'IntRoute', + param: requiredIntField, + queryParam: intField, + ); Widget drawerTile(BuildContext context) => ListTile( title: Text('IntRoute'), @@ -161,10 +162,10 @@ class NumRoute extends GoRouteData { @override Widget build(BuildContext context) => BasePage( - dataTitle: 'NumRoute', - param: requiredNumField, - queryParam: numField, - ); + dataTitle: 'NumRoute', + param: requiredNumField, + queryParam: numField, + ); Widget drawerTile(BuildContext context) => ListTile( title: Text('NumRoute'), @@ -184,10 +185,10 @@ class EnumRoute extends GoRouteData { @override Widget build(BuildContext context) => BasePage( - dataTitle: 'EnumRoute', - param: requiredEnumFieldField, - queryParam: enumFieldField, - ); + dataTitle: 'EnumRoute', + param: requiredEnumFieldField, + queryParam: enumFieldField, + ); Widget drawerTile(BuildContext context) => ListTile( title: Text('EnumRoute'), @@ -207,10 +208,10 @@ class EnhancedEnumRoute extends GoRouteData { @override Widget build(BuildContext context) => BasePage( - dataTitle: 'EnhancedEnumRoute', - param: requiredEnumFieldField, - queryParam: enumFieldField, - ); + dataTitle: 'EnhancedEnumRoute', + param: requiredEnumFieldField, + queryParam: enumFieldField, + ); Widget drawerTile(BuildContext context) => ListTile( title: Text('EnhancedEnumRoute'), @@ -230,10 +231,10 @@ class StringRoute extends GoRouteData { @override Widget build(BuildContext context) => BasePage( - dataTitle: 'StringRoute', - param: requiredStringFieldField, - queryParam: stringFieldField, - ); + dataTitle: 'StringRoute', + param: requiredStringFieldField, + queryParam: stringFieldField, + ); Widget drawerTile(BuildContext context) => ListTile( title: Text('StringRoute'), @@ -253,10 +254,10 @@ class UriRoute extends GoRouteData { @override Widget build(BuildContext context) => BasePage( - dataTitle: 'UriRoute', - param: requiredUriFieldField, - queryParam: uriFieldField, - ); + dataTitle: 'UriRoute', + param: requiredUriFieldField, + queryParam: uriFieldField, + ); Widget drawerTile(BuildContext context) => ListTile( title: Text('UriRoute'), @@ -278,9 +279,9 @@ class BasePage extends StatelessWidget { @override Widget build(BuildContext context) => Scaffold( - appBar: AppBar( - title: Text('Go router typed routes'), - ), + appBar: AppBar( + title: Text('Go router typed routes'), + ), drawer: Drawer( child: ListView( children: [ @@ -309,7 +310,7 @@ class BasePage extends StatelessWidget { numField: -2.71828, ).drawerTile(context), StringRoute( - requiredStringFieldField:r'$!/#bob%%20', + requiredStringFieldField: r'$!/#bob%%20', stringFieldField: r'$!/#bob%%20', ).drawerTile(context), EnumRoute( diff --git a/packages/go_router_builder/example/test/all_types_test.dart b/packages/go_router_builder/example/test/all_types_test.dart index 4f2a7191ea6f..c0a9d0ed6924 100644 --- a/packages/go_router_builder/example/test/all_types_test.dart +++ b/packages/go_router_builder/example/test/all_types_test.dart @@ -77,8 +77,11 @@ void main() { ).go(scaffoldState.context); await tester.pumpAndSettle(); expect(find.text('StringRoute'), findsOneWidget); - expect(find.text('Param: Tytire tu patulae recubans sub tegmine fagi.'), findsOneWidget); - expect(find.text('Query param: Tytire tu patulae recubans sub tegmine fagi.'), findsOneWidget); + expect(find.text('Param: Tytire tu patulae recubans sub tegmine fagi.'), + findsOneWidget); + expect( + find.text('Query param: Tytire tu patulae recubans sub tegmine fagi.'), + findsOneWidget); EnumRoute( requiredEnumFieldField: PersonDetails.favoriteFood, @@ -87,7 +90,8 @@ void main() { await tester.pumpAndSettle(); expect(find.text('EnumRoute'), findsOneWidget); expect(find.text('Param: PersonDetails.favoriteFood'), findsOneWidget); - expect(find.text('Query param: PersonDetails.favoriteSport'), findsOneWidget); + expect( + find.text('Query param: PersonDetails.favoriteSport'), findsOneWidget); EnhancedEnumRoute( requiredEnumFieldField: SportDetails.football, From da7ecc2c4f7eea70f296757844e357a9c08e1579 Mon Sep 17 00:00:00 2001 From: Mirko Mucaria Date: Sat, 10 Sep 2022 17:03:00 +0200 Subject: [PATCH 12/15] rename typed route test --- packages/go_router_builder/example/test/all_types_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/go_router_builder/example/test/all_types_test.dart b/packages/go_router_builder/example/test/all_types_test.dart index c0a9d0ed6924..92b1b472b093 100644 --- a/packages/go_router_builder/example/test/all_types_test.dart +++ b/packages/go_router_builder/example/test/all_types_test.dart @@ -9,7 +9,7 @@ import 'package:go_router_builder_example/all_types.dart'; import 'package:go_router_builder_example/shared/data.dart'; void main() { - testWidgets('Validate extra logic walkthrough', (WidgetTester tester) async { + testWidgets('Test typed route navigation', (WidgetTester tester) async { await tester.pumpWidget(AllTypesApp()); final ScaffoldState scaffoldState = From 564b0753b87fa09b2a44ec792cbdfc5a46ec9041 Mon Sep 17 00:00:00 2001 From: Mirko Mucaria Date: Thu, 15 Sep 2022 18:36:54 +0200 Subject: [PATCH 13/15] analyser fixes --- .../example/lib/all_types.dart | 105 +++++++++--------- .../go_router_builder/example/lib/main.dart | 15 ++- .../example/lib/shared/data.dart | 10 +- .../example/lib/simple_example.dart | 6 +- .../example/test/all_types_test.dart | 4 +- 5 files changed, 70 insertions(+), 70 deletions(-) diff --git a/packages/go_router_builder/example/lib/all_types.dart b/packages/go_router_builder/example/lib/all_types.dart index e4e1bc729d06..39f049de19c0 100644 --- a/packages/go_router_builder/example/lib/all_types.dart +++ b/packages/go_router_builder/example/lib/all_types.dart @@ -11,7 +11,7 @@ import 'shared/data.dart'; part 'all_types.g.dart'; -@TypedGoRoute(path: '/', routes: [ +@TypedGoRoute(path: '/', routes: >[ TypedGoRoute(path: 'big-int-route/:requiredBigIntField'), TypedGoRoute(path: 'bool-route/:requiredBoolField'), TypedGoRoute(path: 'date-time-route/:requiredDateTimeField'), @@ -30,21 +30,21 @@ class AllTypesBaseRoute extends GoRouteData { const AllTypesBaseRoute(); @override - Widget build(BuildContext context) => BasePage( + Widget build(BuildContext context) => const BasePage( dataTitle: 'Root', param: null, ); } class BigIntRoute extends GoRouteData { - final BigInt requiredBigIntField; - final BigInt? bigIntField; - BigIntRoute({ required this.requiredBigIntField, this.bigIntField, }); + final BigInt requiredBigIntField; + final BigInt? bigIntField; + @override Widget build(BuildContext context) => BasePage( dataTitle: 'BigIntRoute', @@ -53,21 +53,21 @@ class BigIntRoute extends GoRouteData { ); Widget drawerTile(BuildContext context) => ListTile( - title: Text('BigIntRoute'), + title: const Text('BigIntRoute'), onTap: () => go(context), selected: GoRouter.of(context).location == location, ); } class BoolRoute extends GoRouteData { - final bool requiredBoolField; - final bool? boolField; - BoolRoute({ required this.requiredBoolField, this.boolField, }); + final bool requiredBoolField; + final bool? boolField; + @override Widget build(BuildContext context) => BasePage( dataTitle: 'BoolRoute', @@ -76,21 +76,21 @@ class BoolRoute extends GoRouteData { ); Widget drawerTile(BuildContext context) => ListTile( - title: Text('BoolRoute'), + title: const Text('BoolRoute'), onTap: () => go(context), selected: GoRouter.of(context).location == location, ); } class DateTimeRoute extends GoRouteData { - final DateTime requiredDateTimeField; - final DateTime? dateTimeField; - DateTimeRoute({ required this.requiredDateTimeField, this.dateTimeField, }); + final DateTime requiredDateTimeField; + final DateTime? dateTimeField; + @override Widget build(BuildContext context) => BasePage( dataTitle: 'DateTimeRoute', @@ -99,21 +99,21 @@ class DateTimeRoute extends GoRouteData { ); Widget drawerTile(BuildContext context) => ListTile( - title: Text('DateTimeRoute'), + title: const Text('DateTimeRoute'), onTap: () => go(context), selected: GoRouter.of(context).location == location, ); } class DoubleRoute extends GoRouteData { - final double requiredDoubleField; - final double? doubleField; - DoubleRoute({ required this.requiredDoubleField, this.doubleField, }); + final double requiredDoubleField; + final double? doubleField; + @override Widget build(BuildContext context) => BasePage( dataTitle: 'DoubleRoute', @@ -122,21 +122,21 @@ class DoubleRoute extends GoRouteData { ); Widget drawerTile(BuildContext context) => ListTile( - title: Text('DoubleRoute'), + title: const Text('DoubleRoute'), onTap: () => go(context), selected: GoRouter.of(context).location == location, ); } class IntRoute extends GoRouteData { - final int requiredIntField; - final int? intField; - IntRoute({ required this.requiredIntField, this.intField, }); + final int requiredIntField; + final int? intField; + @override Widget build(BuildContext context) => BasePage( dataTitle: 'IntRoute', @@ -145,21 +145,21 @@ class IntRoute extends GoRouteData { ); Widget drawerTile(BuildContext context) => ListTile( - title: Text('IntRoute'), + title: const Text('IntRoute'), onTap: () => go(context), selected: GoRouter.of(context).location == location, ); } class NumRoute extends GoRouteData { - final num requiredNumField; - final num? numField; - NumRoute({ required this.requiredNumField, this.numField, }); + final num requiredNumField; + final num? numField; + @override Widget build(BuildContext context) => BasePage( dataTitle: 'NumRoute', @@ -168,21 +168,21 @@ class NumRoute extends GoRouteData { ); Widget drawerTile(BuildContext context) => ListTile( - title: Text('NumRoute'), + title: const Text('NumRoute'), onTap: () => go(context), selected: GoRouter.of(context).location == location, ); } class EnumRoute extends GoRouteData { - final PersonDetails requiredEnumFieldField; - final PersonDetails? enumFieldField; - EnumRoute({ required this.requiredEnumFieldField, this.enumFieldField, }); + final PersonDetails requiredEnumFieldField; + final PersonDetails? enumFieldField; + @override Widget build(BuildContext context) => BasePage( dataTitle: 'EnumRoute', @@ -191,21 +191,21 @@ class EnumRoute extends GoRouteData { ); Widget drawerTile(BuildContext context) => ListTile( - title: Text('EnumRoute'), + title: const Text('EnumRoute'), onTap: () => go(context), selected: GoRouter.of(context).location == location, ); } class EnhancedEnumRoute extends GoRouteData { - final SportDetails requiredEnumFieldField; - final SportDetails? enumFieldField; - EnhancedEnumRoute({ required this.requiredEnumFieldField, this.enumFieldField, }); + final SportDetails requiredEnumFieldField; + final SportDetails? enumFieldField; + @override Widget build(BuildContext context) => BasePage( dataTitle: 'EnhancedEnumRoute', @@ -214,21 +214,21 @@ class EnhancedEnumRoute extends GoRouteData { ); Widget drawerTile(BuildContext context) => ListTile( - title: Text('EnhancedEnumRoute'), + title: const Text('EnhancedEnumRoute'), onTap: () => go(context), selected: GoRouter.of(context).location == location, ); } class StringRoute extends GoRouteData { - final String requiredStringFieldField; - final String? stringFieldField; - StringRoute({ required this.requiredStringFieldField, this.stringFieldField, }); + final String requiredStringFieldField; + final String? stringFieldField; + @override Widget build(BuildContext context) => BasePage( dataTitle: 'StringRoute', @@ -237,21 +237,21 @@ class StringRoute extends GoRouteData { ); Widget drawerTile(BuildContext context) => ListTile( - title: Text('StringRoute'), + title: const Text('StringRoute'), onTap: () => go(context), selected: GoRouter.of(context).location == location, ); } class UriRoute extends GoRouteData { - final Uri requiredUriFieldField; - final Uri? uriFieldField; - UriRoute({ required this.requiredUriFieldField, this.uriFieldField, }); + final Uri requiredUriFieldField; + final Uri? uriFieldField; + @override Widget build(BuildContext context) => BasePage( dataTitle: 'UriRoute', @@ -260,31 +260,32 @@ class UriRoute extends GoRouteData { ); Widget drawerTile(BuildContext context) => ListTile( - title: Text('UriRoute'), + title: const Text('UriRoute'), onTap: () => go(context), selected: GoRouter.of(context).location == location, ); } class BasePage extends StatelessWidget { - final String dataTitle; - final T param; - final T? queryParam; - - BasePage({ + 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: Text('Go router typed routes'), + title: const Text('Go router typed routes'), ), drawer: Drawer( child: ListView( - children: [ + children: [ BigIntRoute( requiredBigIntField: BigInt.two, bigIntField: BigInt.zero, @@ -294,7 +295,7 @@ class BasePage extends StatelessWidget { boolField: false, ).drawerTile(context), DateTimeRoute( - requiredDateTimeField: DateTime(1970, 1, 1), + requiredDateTimeField: DateTime(1970), dateTimeField: DateTime(0), ).drawerTile(context), DoubleRoute( @@ -345,7 +346,7 @@ class BasePage extends StatelessWidget { void main() => runApp(AllTypesApp()); class AllTypesApp extends StatelessWidget { - AllTypesApp({Key? key}) : super(key: key); + AllTypesApp({super.key}); @override Widget build(BuildContext context) => MaterialApp.router( @@ -357,6 +358,6 @@ class AllTypesApp extends StatelessWidget { late final GoRouter _router = GoRouter( debugLogDiagnostics: true, routes: $appRoutes, - initialLocation: AllTypesBaseRoute().location, + initialLocation: const AllTypesBaseRoute().location, ); } diff --git a/packages/go_router_builder/example/lib/main.dart b/packages/go_router_builder/example/lib/main.dart index e58a5ace09de..1023f8c31758 100644 --- a/packages/go_router_builder/example/lib/main.dart +++ b/packages/go_router_builder/example/lib/main.dart @@ -15,7 +15,7 @@ part 'main.g.dart'; void main() => runApp(App()); class App extends StatelessWidget { - App({Key? key}) : super(key: key); + App({super.key}); final LoginInfo loginInfo = LoginInfo(); static const String title = 'GoRouter Example: Named Routes'; @@ -148,7 +148,7 @@ class PersonDetailsRoute extends GoRouteData { } class HomeScreen extends StatelessWidget { - const HomeScreen({Key? key}) : super(key: key); + const HomeScreen({super.key}); @override Widget build(BuildContext context) { @@ -184,7 +184,7 @@ class HomeScreen extends StatelessWidget { } class FamilyScreen extends StatelessWidget { - const FamilyScreen({required this.family, Key? key}) : super(key: key); + const FamilyScreen({required this.family, super.key}); final Family family; @override @@ -203,8 +203,7 @@ class FamilyScreen extends StatelessWidget { } class PersonScreen extends StatelessWidget { - const PersonScreen({required this.family, required this.person, Key? key}) - : super(key: key); + const PersonScreen({required this.family, required this.person, super.key}); final Family family; final Person person; @@ -250,8 +249,8 @@ class PersonDetailsPage extends StatelessWidget { required this.person, required this.detailsKey, this.extra, - Key? key, - }) : super(key: key); + super.key, + }); final Family family; final Person person; @@ -278,7 +277,7 @@ class PersonDetailsPage extends StatelessWidget { } class LoginScreen extends StatelessWidget { - const LoginScreen({this.from, Key? key}) : super(key: key); + const LoginScreen({this.from, super.key}); final String? from; @override diff --git a/packages/go_router_builder/example/lib/shared/data.dart b/packages/go_router_builder/example/lib/shared/data.dart index cf65acadb583..8f9d0e4527dc 100644 --- a/packages/go_router_builder/example/lib/shared/data.dart +++ b/packages/go_router_builder/example/lib/shared/data.dart @@ -45,17 +45,17 @@ enum SportDetails { ), ; - final String imageUrl; - final int playerPerTeam; - final String? accessory; - final bool hasNet; - const SportDetails({ required this.accessory, required this.hasNet, required this.imageUrl, required this.playerPerTeam, }); + + final String imageUrl; + final int playerPerTeam; + final String? accessory; + final bool hasNet; } /// sample Person class diff --git a/packages/go_router_builder/example/lib/simple_example.dart b/packages/go_router_builder/example/lib/simple_example.dart index 1597104ffc09..965747579579 100644 --- a/packages/go_router_builder/example/lib/simple_example.dart +++ b/packages/go_router_builder/example/lib/simple_example.dart @@ -14,7 +14,7 @@ part 'simple_example.g.dart'; void main() => runApp(App()); class App extends StatelessWidget { - App({Key? key}) : super(key: key); + App({super.key}); @override Widget build(BuildContext context) => MaterialApp.router( @@ -50,7 +50,7 @@ class FamilyRoute extends GoRouteData { } class HomeScreen extends StatelessWidget { - const HomeScreen({Key? key}) : super(key: key); + const HomeScreen({super.key}); @override Widget build(BuildContext context) => Scaffold( @@ -68,7 +68,7 @@ class HomeScreen extends StatelessWidget { } class FamilyScreen extends StatelessWidget { - const FamilyScreen({required this.family, Key? key}) : super(key: key); + const FamilyScreen({required this.family, super.key}); final Family family; @override diff --git a/packages/go_router_builder/example/test/all_types_test.dart b/packages/go_router_builder/example/test/all_types_test.dart index 92b1b472b093..d28f3c457921 100644 --- a/packages/go_router_builder/example/test/all_types_test.dart +++ b/packages/go_router_builder/example/test/all_types_test.dart @@ -33,8 +33,8 @@ void main() { expect(find.text('Param: false'), findsOneWidget); expect(find.text('Query param: true'), findsOneWidget); - final param = DateTime.now(); - final query = DateTime(2017, 9, 7, 17, 30); + final DateTime param = DateTime.now(); + final DateTime query = DateTime(2017, 9, 7, 17, 30); DateTimeRoute( requiredDateTimeField: param, dateTimeField: query, From 85c199890472fe5b7e001b9215652cbcf392bd10 Mon Sep 17 00:00:00 2001 From: Mirko Mucaria Date: Fri, 16 Sep 2022 09:47:31 +0200 Subject: [PATCH 14/15] merge conflicts and code fixes --- packages/go_router_builder/CHANGELOG.md | 4 ++ .../example/lib/all_types.dart | 72 +++++++++---------- .../example/lib/shared/data.dart | 12 ++-- .../example/test/all_types_test.dart | 16 ++--- packages/go_router_builder/pubspec.yaml | 2 +- 5 files changed, 53 insertions(+), 53 deletions(-) diff --git a/packages/go_router_builder/CHANGELOG.md b/packages/go_router_builder/CHANGELOG.md index b04d17ce59a1..2ab60143fd82 100644 --- a/packages/go_router_builder/CHANGELOG.md +++ b/packages/go_router_builder/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.12 + +* Adds support for enhanced enums. [#105876](https://github.com/flutter/flutter/issues/105876). + ## 1.0.11 * Replaces mentions of the deprecated `GoRouteData.buildPage` with `GoRouteData.buildPageWithState`. diff --git a/packages/go_router_builder/example/lib/all_types.dart b/packages/go_router_builder/example/lib/all_types.dart index 39f049de19c0..8197697511a0 100644 --- a/packages/go_router_builder/example/lib/all_types.dart +++ b/packages/go_router_builder/example/lib/all_types.dart @@ -19,11 +19,11 @@ part 'all_types.g.dart'; TypedGoRoute(path: 'int-route/:requiredIntField'), TypedGoRoute(path: 'num-route/:requiredNumField'), TypedGoRoute(path: 'double-route/:requiredDoubleField'), - TypedGoRoute(path: 'enum-route/:requiredEnumFieldField'), + TypedGoRoute(path: 'enum-route/:requiredEnumField'), TypedGoRoute( - path: 'enhanced-enum-route/:requiredEnumFieldField'), - TypedGoRoute(path: 'string-route/:requiredStringFieldField'), - TypedGoRoute(path: 'uri-route/:requiredUriFieldField'), + path: 'enhanced-enum-route/:requiredEnumField'), + TypedGoRoute(path: 'string-route/:requiredStringField'), + TypedGoRoute(path: 'uri-route/:requiredUriField'), ]) @immutable class AllTypesBaseRoute extends GoRouteData { @@ -176,18 +176,18 @@ class NumRoute extends GoRouteData { class EnumRoute extends GoRouteData { EnumRoute({ - required this.requiredEnumFieldField, - this.enumFieldField, + required this.requiredEnumField, + this.enumField, }); - final PersonDetails requiredEnumFieldField; - final PersonDetails? enumFieldField; + final PersonDetails requiredEnumField; + final PersonDetails? enumField; @override Widget build(BuildContext context) => BasePage( dataTitle: 'EnumRoute', - param: requiredEnumFieldField, - queryParam: enumFieldField, + param: requiredEnumField, + queryParam: enumField, ); Widget drawerTile(BuildContext context) => ListTile( @@ -199,18 +199,18 @@ class EnumRoute extends GoRouteData { class EnhancedEnumRoute extends GoRouteData { EnhancedEnumRoute({ - required this.requiredEnumFieldField, - this.enumFieldField, + required this.requiredEnumField, + this.enumField, }); - final SportDetails requiredEnumFieldField; - final SportDetails? enumFieldField; + final SportDetails requiredEnumField; + final SportDetails? enumField; @override Widget build(BuildContext context) => BasePage( dataTitle: 'EnhancedEnumRoute', - param: requiredEnumFieldField, - queryParam: enumFieldField, + param: requiredEnumField, + queryParam: enumField, ); Widget drawerTile(BuildContext context) => ListTile( @@ -222,18 +222,18 @@ class EnhancedEnumRoute extends GoRouteData { class StringRoute extends GoRouteData { StringRoute({ - required this.requiredStringFieldField, - this.stringFieldField, + required this.requiredStringField, + this.stringField, }); - final String requiredStringFieldField; - final String? stringFieldField; + final String requiredStringField; + final String? stringField; @override Widget build(BuildContext context) => BasePage( dataTitle: 'StringRoute', - param: requiredStringFieldField, - queryParam: stringFieldField, + param: requiredStringField, + queryParam: stringField, ); Widget drawerTile(BuildContext context) => ListTile( @@ -245,18 +245,18 @@ class StringRoute extends GoRouteData { class UriRoute extends GoRouteData { UriRoute({ - required this.requiredUriFieldField, - this.uriFieldField, + required this.requiredUriField, + this.uriField, }); - final Uri requiredUriFieldField; - final Uri? uriFieldField; + final Uri requiredUriField; + final Uri? uriField; @override Widget build(BuildContext context) => BasePage( dataTitle: 'UriRoute', - param: requiredUriFieldField, - queryParam: uriFieldField, + param: requiredUriField, + queryParam: uriField, ); Widget drawerTile(BuildContext context) => ListTile( @@ -311,20 +311,20 @@ class BasePage extends StatelessWidget { numField: -2.71828, ).drawerTile(context), StringRoute( - requiredStringFieldField: r'$!/#bob%%20', - stringFieldField: r'$!/#bob%%20', + requiredStringField: r'$!/#bob%%20', + stringField: r'$!/#bob%%20', ).drawerTile(context), EnumRoute( - requiredEnumFieldField: PersonDetails.favoriteSport, - enumFieldField: PersonDetails.favoriteFood, + requiredEnumField: PersonDetails.favoriteSport, + enumField: PersonDetails.favoriteFood, ).drawerTile(context), EnhancedEnumRoute( - requiredEnumFieldField: SportDetails.football, - enumFieldField: SportDetails.volleyball, + requiredEnumField: SportDetails.football, + enumField: SportDetails.volleyball, ).drawerTile(context), UriRoute( - requiredUriFieldField: Uri.parse('https://dart.dev'), - uriFieldField: Uri.parse('https://dart.dev'), + requiredUriField: Uri.parse('https://dart.dev'), + uriField: Uri.parse('https://dart.dev'), ).drawerTile(context), ], )), diff --git a/packages/go_router_builder/example/lib/shared/data.dart b/packages/go_router_builder/example/lib/shared/data.dart index 8f9d0e4527dc..edc3f205eb41 100644 --- a/packages/go_router_builder/example/lib/shared/data.dart +++ b/packages/go_router_builder/example/lib/shared/data.dart @@ -16,29 +16,25 @@ enum PersonDetails { enum SportDetails { volleyball( - imageUrl: - 'https://i.cbc.ca/1.6477752.1654316355!/fileImage/httpImage/image.jpg_gen/derivatives/16x9_940/canada-vs-usa-volleyball.jpg', + imageUrl: '/sportdetails/url/volleyball.jpg', playerPerTeam: 6, accessory: null, hasNet: true, ), football( - imageUrl: - 'https://upload.wikimedia.org/wikipedia/commons/b/b9/Football_iu_1996.jpg', + imageUrl: '/sportdetails/url/Football.jpg', playerPerTeam: 11, accessory: null, hasNet: true, ), tennis( - imageUrl: - 'https://upload.wikimedia.org/wikipedia/commons/9/94/2013_Australian_Open_-_Guillaume_Rufin.jpg', + imageUrl: '/sportdetails/url/tennis.jpg', playerPerTeam: 2, accessory: 'Rackets', hasNet: true, ), hockey( - imageUrl: - 'https://upload.wikimedia.org/wikipedia/commons/3/39/Pittsburgh_Penguins%2C_Washington_Capitals%2C_Bryan_Rust_%2833744033514%29.jpg', + imageUrl: '/sportdetails/url/hockey.jpg', playerPerTeam: 6, accessory: 'Hockey sticks', hasNet: true, diff --git a/packages/go_router_builder/example/test/all_types_test.dart b/packages/go_router_builder/example/test/all_types_test.dart index d28f3c457921..4a0cac663d8f 100644 --- a/packages/go_router_builder/example/test/all_types_test.dart +++ b/packages/go_router_builder/example/test/all_types_test.dart @@ -72,8 +72,8 @@ void main() { expect(find.text('Query param: -987.32'), findsOneWidget); StringRoute( - requiredStringFieldField: r'Tytire tu patulae recubans sub tegmine fagi.', - stringFieldField: r'Tytire tu patulae recubans sub tegmine fagi.', + requiredStringField: r'Tytire tu patulae recubans sub tegmine fagi.', + stringField: r'Tytire tu patulae recubans sub tegmine fagi.', ).go(scaffoldState.context); await tester.pumpAndSettle(); expect(find.text('StringRoute'), findsOneWidget); @@ -84,8 +84,8 @@ void main() { findsOneWidget); EnumRoute( - requiredEnumFieldField: PersonDetails.favoriteFood, - enumFieldField: PersonDetails.favoriteSport, + requiredEnumField: PersonDetails.favoriteFood, + enumField: PersonDetails.favoriteSport, ).go(scaffoldState.context); await tester.pumpAndSettle(); expect(find.text('EnumRoute'), findsOneWidget); @@ -94,8 +94,8 @@ void main() { find.text('Query param: PersonDetails.favoriteSport'), findsOneWidget); EnhancedEnumRoute( - requiredEnumFieldField: SportDetails.football, - enumFieldField: SportDetails.hockey, + requiredEnumField: SportDetails.football, + enumField: SportDetails.hockey, ).go(scaffoldState.context); await tester.pumpAndSettle(); expect(find.text('EnhancedEnumRoute'), findsOneWidget); @@ -103,8 +103,8 @@ void main() { expect(find.text('Query param: SportDetails.hockey'), findsOneWidget); UriRoute( - requiredUriFieldField: Uri.parse('https://dart.dev'), - uriFieldField: Uri.parse('https://dart.dev'), + requiredUriField: Uri.parse('https://dart.dev'), + uriField: Uri.parse('https://dart.dev'), ).go(scaffoldState.context); await tester.pumpAndSettle(); expect(find.text('UriRoute'), findsOneWidget); diff --git a/packages/go_router_builder/pubspec.yaml b/packages/go_router_builder/pubspec.yaml index ac221eac3a7a..81781eb8d634 100644 --- a/packages/go_router_builder/pubspec.yaml +++ b/packages/go_router_builder/pubspec.yaml @@ -2,7 +2,7 @@ name: go_router_builder description: >- A builder that supports generated strongly-typed route helpers for package:go_router -version: 1.0.11 +version: 1.0.12 repository: https://github.com/flutter/packages/tree/main/packages/go_router_builder issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+go_router_builder%22 From d090223ae9bbb7714517bf53557d3814807e76b5 Mon Sep 17 00:00:00 2001 From: Mirko Mucaria Date: Fri, 16 Sep 2022 10:01:01 +0200 Subject: [PATCH 15/15] rigenerated all_types.g.dart --- .../example/lib/all_types.g.dart | 55 +++++++++---------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/packages/go_router_builder/example/lib/all_types.g.dart b/packages/go_router_builder/example/lib/all_types.g.dart index abdd1e6ac3d5..4aeb4173f408 100644 --- a/packages/go_router_builder/example/lib/all_types.g.dart +++ b/packages/go_router_builder/example/lib/all_types.g.dart @@ -45,19 +45,19 @@ GoRoute get $allTypesBaseRoute => GoRouteData.$route( factory: $DoubleRouteExtension._fromState, ), GoRouteData.$route( - path: 'enum-route/:requiredEnumFieldField', + path: 'enum-route/:requiredEnumField', factory: $EnumRouteExtension._fromState, ), GoRouteData.$route( - path: 'enhanced-enum-route/:requiredEnumFieldField', + path: 'enhanced-enum-route/:requiredEnumField', factory: $EnhancedEnumRouteExtension._fromState, ), GoRouteData.$route( - path: 'string-route/:requiredStringFieldField', + path: 'string-route/:requiredStringField', factory: $StringRouteExtension._fromState, ), GoRouteData.$route( - path: 'uri-route/:requiredUriFieldField', + path: 'uri-route/:requiredUriField', factory: $UriRouteExtension._fromState, ), ], @@ -192,17 +192,17 @@ extension $NumRouteExtension on NumRoute { extension $EnumRouteExtension on EnumRoute { static EnumRoute _fromState(GoRouterState state) => EnumRoute( - requiredEnumFieldField: _$PersonDetailsEnumMap - ._$fromName(state.params['requiredEnumFieldField']!), - enumFieldField: _$convertMapValue('enum-field-field', state.queryParams, - _$PersonDetailsEnumMap._$fromName), + requiredEnumField: _$PersonDetailsEnumMap + ._$fromName(state.params['requiredEnumField']!), + enumField: _$convertMapValue( + 'enum-field', state.queryParams, _$PersonDetailsEnumMap._$fromName), ); String get location => GoRouteData.$location( - '/enum-route/${Uri.encodeComponent(_$PersonDetailsEnumMap[requiredEnumFieldField]!)}', + '/enum-route/${Uri.encodeComponent(_$PersonDetailsEnumMap[requiredEnumField]!)}', queryParams: { - if (enumFieldField != null) - 'enum-field-field': _$PersonDetailsEnumMap[enumFieldField!]!, + if (enumField != null) + 'enum-field': _$PersonDetailsEnumMap[enumField!]!, }, ); @@ -213,17 +213,17 @@ extension $EnumRouteExtension on EnumRoute { extension $EnhancedEnumRouteExtension on EnhancedEnumRoute { static EnhancedEnumRoute _fromState(GoRouterState state) => EnhancedEnumRoute( - requiredEnumFieldField: _$SportDetailsEnumMap - ._$fromName(state.params['requiredEnumFieldField']!), - enumFieldField: _$convertMapValue('enum-field-field', state.queryParams, - _$SportDetailsEnumMap._$fromName), + requiredEnumField: _$SportDetailsEnumMap + ._$fromName(state.params['requiredEnumField']!), + enumField: _$convertMapValue( + 'enum-field', state.queryParams, _$SportDetailsEnumMap._$fromName), ); String get location => GoRouteData.$location( - '/enhanced-enum-route/${Uri.encodeComponent(_$SportDetailsEnumMap[requiredEnumFieldField]!)}', + '/enhanced-enum-route/${Uri.encodeComponent(_$SportDetailsEnumMap[requiredEnumField]!)}', queryParams: { - if (enumFieldField != null) - 'enum-field-field': _$SportDetailsEnumMap[enumFieldField!]!, + if (enumField != null) + 'enum-field': _$SportDetailsEnumMap[enumField!]!, }, ); @@ -234,14 +234,14 @@ extension $EnhancedEnumRouteExtension on EnhancedEnumRoute { extension $StringRouteExtension on StringRoute { static StringRoute _fromState(GoRouterState state) => StringRoute( - requiredStringFieldField: state.params['requiredStringFieldField']!, - stringFieldField: state.queryParams['string-field-field'], + requiredStringField: state.params['requiredStringField']!, + stringField: state.queryParams['string-field'], ); String get location => GoRouteData.$location( - '/string-route/${Uri.encodeComponent(requiredStringFieldField)}', + '/string-route/${Uri.encodeComponent(requiredStringField)}', queryParams: { - if (stringFieldField != null) 'string-field-field': stringFieldField!, + if (stringField != null) 'string-field': stringField!, }, ); @@ -252,17 +252,14 @@ extension $StringRouteExtension on StringRoute { extension $UriRouteExtension on UriRoute { static UriRoute _fromState(GoRouterState state) => UriRoute( - requiredUriFieldField: - Uri.parse(state.params['requiredUriFieldField']!), - uriFieldField: - _$convertMapValue('uri-field-field', state.queryParams, Uri.parse), + requiredUriField: Uri.parse(state.params['requiredUriField']!), + uriField: _$convertMapValue('uri-field', state.queryParams, Uri.parse), ); String get location => GoRouteData.$location( - '/uri-route/${Uri.encodeComponent(requiredUriFieldField.toString())}', + '/uri-route/${Uri.encodeComponent(requiredUriField.toString())}', queryParams: { - if (uriFieldField != null) - 'uri-field-field': uriFieldField!.toString(), + if (uriField != null) 'uri-field': uriField!.toString(), }, );