From 4494420bcc9b71f788d4cd33491a49794898a70c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cao=20Gia=20Hie=CC=82=CC=81u?= Date: Fri, 10 Jan 2025 10:50:43 +0700 Subject: [PATCH 01/15] fix: Fix handle invaild params --- .../example/lib/all_types.g.dart | 291 +++++++++++------- .../go_router_builder/example/lib/main.g.dart | 13 +- .../example/lib/readme_excerpts.g.dart | 4 +- .../lib/shell_route_with_keys_example.g.dart | 2 +- .../shell_route_with_observers_example.g.dart | 2 +- .../example/lib/simple_example.dart | 5 +- ...hell_route_initial_location_example.g.dart | 6 +- .../lib/src/route_config.dart | 6 +- .../lib/src/type_helpers.dart | 77 ++++- 9 files changed, 262 insertions(+), 144 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 cb672ab6c8b..5d2442cd677 100644 --- a/packages/go_router_builder/example/lib/all_types.g.dart +++ b/packages/go_router_builder/example/lib/all_types.g.dart @@ -91,10 +91,10 @@ extension $AllTypesBaseRouteExtension on AllTypesBaseRoute { extension $BigIntRouteExtension on BigIntRoute { static BigIntRoute _fromState(GoRouterState state) => BigIntRoute( - requiredBigIntField: - BigInt.parse(state.pathParameters['requiredBigIntField']!), + requiredBigIntField: BigInt.parse( + state.pathParameters['requiredBigIntField']!.toString())!, bigIntField: _$convertMapValue( - 'big-int-field', state.uri.queryParameters, BigInt.parse), + 'big-int-field', state.uri.queryParameters, BigInt.tryParse), ); String get location => GoRouteData.$location( @@ -116,8 +116,8 @@ extension $BigIntRouteExtension on BigIntRoute { extension $BoolRouteExtension on BoolRoute { static BoolRoute _fromState(GoRouterState state) => BoolRoute( - requiredBoolField: - _$boolConverter(state.pathParameters['requiredBoolField']!), + requiredBoolField: _$boolConverter( + state.pathParameters['requiredBoolField']!.toString())!, boolField: _$convertMapValue( 'bool-field', state.uri.queryParameters, _$boolConverter), boolFieldWithDefaultValue: _$convertMapValue( @@ -149,10 +149,10 @@ extension $BoolRouteExtension on BoolRoute { extension $DateTimeRouteExtension on DateTimeRoute { static DateTimeRoute _fromState(GoRouterState state) => DateTimeRoute( - requiredDateTimeField: - DateTime.parse(state.pathParameters['requiredDateTimeField']!), + requiredDateTimeField: DateTime.parse( + state.pathParameters['requiredDateTimeField']!.toString())!, dateTimeField: _$convertMapValue( - 'date-time-field', state.uri.queryParameters, DateTime.parse), + 'date-time-field', state.uri.queryParameters, DateTime.tryParse), ); String get location => GoRouteData.$location( @@ -175,10 +175,10 @@ extension $DateTimeRouteExtension on DateTimeRoute { extension $DoubleRouteExtension on DoubleRoute { static DoubleRoute _fromState(GoRouterState state) => DoubleRoute( - requiredDoubleField: - double.parse(state.pathParameters['requiredDoubleField']!), + requiredDoubleField: double.parse( + state.pathParameters['requiredDoubleField']!.toString())!, doubleField: _$convertMapValue( - 'double-field', state.uri.queryParameters, double.parse), + 'double-field', state.uri.queryParameters, double.tryParse), doubleFieldWithDefaultValue: _$convertMapValue( 'double-field-with-default-value', state.uri.queryParameters, @@ -208,9 +208,10 @@ extension $DoubleRouteExtension on DoubleRoute { extension $IntRouteExtension on IntRoute { static IntRoute _fromState(GoRouterState state) => IntRoute( - requiredIntField: int.parse(state.pathParameters['requiredIntField']!), + requiredIntField: + int.parse(state.pathParameters['requiredIntField']!.toString())!, intField: _$convertMapValue( - 'int-field', state.uri.queryParameters, int.parse), + 'int-field', state.uri.queryParameters, int.tryParse), intFieldWithDefaultValue: _$convertMapValue( 'int-field-with-default-value', state.uri.queryParameters, @@ -239,9 +240,10 @@ extension $IntRouteExtension on IntRoute { extension $NumRouteExtension on NumRoute { static NumRoute _fromState(GoRouterState state) => NumRoute( - requiredNumField: num.parse(state.pathParameters['requiredNumField']!), + requiredNumField: + num.parse(state.pathParameters['requiredNumField']!.toString())!, numField: _$convertMapValue( - 'num-field', state.uri.queryParameters, num.parse), + 'num-field', state.uri.queryParameters, num.tryParse), numFieldWithDefaultValue: _$convertMapValue( 'num-field-with-default-value', state.uri.queryParameters, @@ -271,7 +273,7 @@ extension $NumRouteExtension on NumRoute { extension $EnumRouteExtension on EnumRoute { static EnumRoute _fromState(GoRouterState state) => EnumRoute( requiredEnumField: _$PersonDetailsEnumMap - ._$fromName(state.pathParameters['requiredEnumField']!), + ._$fromName(state.pathParameters['requiredEnumField']!.toString())!, enumField: _$convertMapValue('enum-field', state.uri.queryParameters, _$PersonDetailsEnumMap._$fromName), enumFieldWithDefaultValue: _$convertMapValue( @@ -311,7 +313,7 @@ const _$PersonDetailsEnumMap = { extension $EnhancedEnumRouteExtension on EnhancedEnumRoute { static EnhancedEnumRoute _fromState(GoRouterState state) => EnhancedEnumRoute( requiredEnumField: _$SportDetailsEnumMap - ._$fromName(state.pathParameters['requiredEnumField']!), + ._$fromName(state.pathParameters['requiredEnumField']!.toString())!, enumField: _$convertMapValue('enum-field', state.uri.queryParameters, _$SportDetailsEnumMap._$fromName), enumFieldWithDefaultValue: _$convertMapValue( @@ -379,9 +381,10 @@ extension $StringRouteExtension on StringRoute { extension $UriRouteExtension on UriRoute { static UriRoute _fromState(GoRouterState state) => UriRoute( - requiredUriField: Uri.parse(state.pathParameters['requiredUriField']!), + requiredUriField: + Uri.parse(state.pathParameters['requiredUriField']!.toString())!, uriField: _$convertMapValue( - 'uri-field', state.uri.queryParameters, Uri.parse), + 'uri-field', state.uri.queryParameters, Uri.tryParse), ); String get location => GoRouteData.$location( @@ -403,59 +406,97 @@ extension $UriRouteExtension on UriRoute { extension $IterableRouteExtension on IterableRoute { static IterableRoute _fromState(GoRouterState state) => IterableRoute( - intIterableField: - state.uri.queryParametersAll['int-iterable-field']?.map(int.parse), - doubleIterableField: state - .uri.queryParametersAll['double-iterable-field'] - ?.map(double.parse), - stringIterableField: state - .uri.queryParametersAll['string-iterable-field'] - ?.map((e) => e), - boolIterableField: state.uri.queryParametersAll['bool-iterable-field'] - ?.map(_$boolConverter), - enumIterableField: state.uri.queryParametersAll['enum-iterable-field'] - ?.map(_$SportDetailsEnumMap._$fromName), - enumOnlyInIterableField: state - .uri.queryParametersAll['enum-only-in-iterable-field'] - ?.map(_$CookingRecipeEnumMap._$fromName), - intListField: state.uri.queryParametersAll['int-list-field'] - ?.map(int.parse) - .toList(), - doubleListField: state.uri.queryParametersAll['double-list-field'] - ?.map(double.parse) - .toList(), - stringListField: state.uri.queryParametersAll['string-list-field'] - ?.map((e) => e) - .toList(), - boolListField: state.uri.queryParametersAll['bool-list-field'] - ?.map(_$boolConverter) - .toList(), - enumListField: state.uri.queryParametersAll['enum-list-field'] - ?.map(_$SportDetailsEnumMap._$fromName) - .toList(), - enumOnlyInListField: state - .uri.queryParametersAll['enum-only-in-list-field'] - ?.map(_$CookingRecipeEnumMap._$fromName) - .toList(), - intSetField: state.uri.queryParametersAll['int-set-field'] + intIterableField: (state.uri.queryParametersAll['int-iterable-field'] ?.map(int.parse) - .toSet(), - doubleSetField: state.uri.queryParametersAll['double-set-field'] + ?.where((e) => e != null) + ?.cast() as Iterable?), + doubleIterableField: (state + .uri.queryParametersAll['double-iterable-field'] ?.map(double.parse) - .toSet(), - stringSetField: state.uri.queryParametersAll['string-set-field'] - ?.map((e) => e) - .toSet(), - boolSetField: state.uri.queryParametersAll['bool-set-field'] + ?.where((e) => e != null) + ?.cast() as Iterable?), + stringIterableField: (state + .uri.queryParametersAll['string-iterable-field'] + ?.map((e) => e)), + boolIterableField: (state.uri.queryParametersAll['bool-iterable-field'] ?.map(_$boolConverter) - .toSet(), - enumSetField: state.uri.queryParametersAll['enum-set-field'] + ?.where((e) => e != null) + ?.cast() as Iterable?), + enumIterableField: (state.uri.queryParametersAll['enum-iterable-field'] ?.map(_$SportDetailsEnumMap._$fromName) - .toSet(), - enumOnlyInSetField: state - .uri.queryParametersAll['enum-only-in-set-field'] + ?.where((e) => e != null) + ?.cast() as Iterable?), + enumOnlyInIterableField: (state + .uri.queryParametersAll['enum-only-in-iterable-field'] ?.map(_$CookingRecipeEnumMap._$fromName) - .toSet(), + ?.where((e) => e != null) + ?.cast() as Iterable?), + intListField: (state.uri.queryParametersAll['int-list-field'] + ?.map(int.parse) + ?.where((e) => e != null) + ?.cast() + ?.toList() as List?) + ?.toList(), + doubleListField: (state.uri.queryParametersAll['double-list-field'] + ?.map(double.parse) + ?.where((e) => e != null) + ?.cast() + ?.toList() as List?) + ?.toList(), + stringListField: (state.uri.queryParametersAll['string-list-field'] + ?.map((e) => e))?.toList(), + boolListField: (state.uri.queryParametersAll['bool-list-field'] + ?.map(_$boolConverter) + ?.where((e) => e != null) + ?.cast() + ?.toList() as List?) + ?.toList(), + enumListField: (state.uri.queryParametersAll['enum-list-field'] + ?.map(_$SportDetailsEnumMap._$fromName) + ?.where((e) => e != null) + ?.cast() + ?.toList() as List?) + ?.toList(), + enumOnlyInListField: (state + .uri.queryParametersAll['enum-only-in-list-field'] + ?.map(_$CookingRecipeEnumMap._$fromName) + ?.where((e) => e != null) + ?.cast() + ?.toList() as List?) + ?.toList(), + intSetField: (state.uri.queryParametersAll['int-set-field'] + ?.map(int.parse) + ?.where((e) => e != null) + ?.cast() + ?.toSet() as Set?) + ?.toSet(), + doubleSetField: (state.uri.queryParametersAll['double-set-field'] + ?.map(double.parse) + ?.where((e) => e != null) + ?.cast() + ?.toSet() as Set?) + ?.toSet(), + stringSetField: (state.uri.queryParametersAll['string-set-field'] + ?.map((e) => e))?.toSet(), + boolSetField: (state.uri.queryParametersAll['bool-set-field'] + ?.map(_$boolConverter) + ?.where((e) => e != null) + ?.cast() + ?.toSet() as Set?) + ?.toSet(), + enumSetField: (state.uri.queryParametersAll['enum-set-field'] + ?.map(_$SportDetailsEnumMap._$fromName) + ?.where((e) => e != null) + ?.cast() + ?.toSet() as Set?) + ?.toSet(), + enumOnlyInSetField: (state + .uri.queryParametersAll['enum-only-in-set-field'] + ?.map(_$CookingRecipeEnumMap._$fromName) + ?.where((e) => e != null) + ?.cast() + ?.toSet() as Set?) + ?.toSet(), ); String get location => GoRouteData.$location( @@ -536,62 +577,92 @@ extension $IterableRouteWithDefaultValuesExtension on IterableRouteWithDefaultValues { static IterableRouteWithDefaultValues _fromState(GoRouterState state) => IterableRouteWithDefaultValues( - intIterableField: state.uri.queryParametersAll['int-iterable-field'] - ?.map(int.parse) ?? + intIterableField: (state.uri.queryParametersAll['int-iterable-field'] + ?.map(int.parse) + ?.where((e) => e != null) + ?.cast() as Iterable?) ?? const [0], - doubleIterableField: state + doubleIterableField: (state .uri.queryParametersAll['double-iterable-field'] - ?.map(double.parse) ?? + ?.map(double.parse) + ?.where((e) => e != null) + ?.cast() as Iterable?) ?? const [0, 1, 2], - stringIterableField: state + stringIterableField: (state .uri.queryParametersAll['string-iterable-field'] - ?.map((e) => e) ?? + ?.map((e) => e)) ?? const ['defaultValue'], - boolIterableField: state.uri.queryParametersAll['bool-iterable-field'] - ?.map(_$boolConverter) ?? + boolIterableField: (state.uri.queryParametersAll['bool-iterable-field'] + ?.map(_$boolConverter) + ?.where((e) => e != null) + ?.cast() as Iterable?) ?? const [false], - enumIterableField: state.uri.queryParametersAll['enum-iterable-field'] - ?.map(_$SportDetailsEnumMap._$fromName) ?? + enumIterableField: (state.uri.queryParametersAll['enum-iterable-field'] + ?.map(_$SportDetailsEnumMap._$fromName) + ?.where((e) => e != null) + ?.cast() as Iterable?) ?? const [SportDetails.tennis, SportDetails.hockey], - intListField: state.uri.queryParametersAll['int-list-field'] - ?.map(int.parse) - .toList() ?? + intListField: (state.uri.queryParametersAll['int-list-field'] + ?.map(int.parse) + ?.where((e) => e != null) + ?.cast() + ?.toList() as List?) + ?.toList() ?? const [0], - doubleListField: state.uri.queryParametersAll['double-list-field'] - ?.map(double.parse) - .toList() ?? + doubleListField: (state.uri.queryParametersAll['double-list-field'] + ?.map(double.parse) + ?.where((e) => e != null) + ?.cast() + ?.toList() as List?) + ?.toList() ?? const [1, 2, 3], - stringListField: state.uri.queryParametersAll['string-list-field'] - ?.map((e) => e) - .toList() ?? + stringListField: (state.uri.queryParametersAll['string-list-field'] + ?.map((e) => e))?.toList() ?? const ['defaultValue0', 'defaultValue1'], - boolListField: state.uri.queryParametersAll['bool-list-field'] - ?.map(_$boolConverter) - .toList() ?? + boolListField: (state.uri.queryParametersAll['bool-list-field'] + ?.map(_$boolConverter) + ?.where((e) => e != null) + ?.cast() + ?.toList() as List?) + ?.toList() ?? const [true], - enumListField: state.uri.queryParametersAll['enum-list-field'] - ?.map(_$SportDetailsEnumMap._$fromName) - .toList() ?? + enumListField: (state.uri.queryParametersAll['enum-list-field'] + ?.map(_$SportDetailsEnumMap._$fromName) + ?.where((e) => e != null) + ?.cast() + ?.toList() as List?) + ?.toList() ?? const [SportDetails.football], - intSetField: state.uri.queryParametersAll['int-set-field'] - ?.map(int.parse) - .toSet() ?? + intSetField: (state.uri.queryParametersAll['int-set-field'] + ?.map(int.parse) + ?.where((e) => e != null) + ?.cast() + ?.toSet() as Set?) + ?.toSet() ?? const {0, 1}, - doubleSetField: state.uri.queryParametersAll['double-set-field'] - ?.map(double.parse) - .toSet() ?? + doubleSetField: (state.uri.queryParametersAll['double-set-field'] + ?.map(double.parse) + ?.where((e) => e != null) + ?.cast() + ?.toSet() as Set?) + ?.toSet() ?? const {}, - stringSetField: state.uri.queryParametersAll['string-set-field'] - ?.map((e) => e) - .toSet() ?? + stringSetField: (state.uri.queryParametersAll['string-set-field'] + ?.map((e) => e))?.toSet() ?? const {'defaultValue'}, - boolSetField: state.uri.queryParametersAll['bool-set-field'] - ?.map(_$boolConverter) - .toSet() ?? + boolSetField: (state.uri.queryParametersAll['bool-set-field'] + ?.map(_$boolConverter) + ?.where((e) => e != null) + ?.cast() + ?.toSet() as Set?) + ?.toSet() ?? const {true, false}, - enumSetField: state.uri.queryParametersAll['enum-set-field'] - ?.map(_$SportDetailsEnumMap._$fromName) - .toSet() ?? + enumSetField: (state.uri.queryParametersAll['enum-set-field'] + ?.map(_$SportDetailsEnumMap._$fromName) + ?.where((e) => e != null) + ?.cast() + ?.toSet() as Set?) + ?.toSet() ?? const {SportDetails.hockey}, ); @@ -654,7 +725,7 @@ extension $IterableRouteWithDefaultValuesExtension T? _$convertMapValue( String key, Map map, - T Function(String) converter, + T? Function(String) converter, ) { final value = map[key]; return value == null ? null : converter(value); @@ -672,6 +743,6 @@ bool _$boolConverter(String value) { } extension on Map { - T _$fromName(String value) => - entries.singleWhere((element) => element.value == value).key; + T? _$fromName(String value) => + entries.where((element) => element.value == value).firstOrNull?.key; } diff --git a/packages/go_router_builder/example/lib/main.g.dart b/packages/go_router_builder/example/lib/main.g.dart index 88c4f0ac84f..4301e41ebea 100644 --- a/packages/go_router_builder/example/lib/main.g.dart +++ b/packages/go_router_builder/example/lib/main.g.dart @@ -79,7 +79,7 @@ extension $FamilyRouteExtension on FamilyRoute { extension $PersonRouteExtension on PersonRoute { static PersonRoute _fromState(GoRouterState state) => PersonRoute( state.pathParameters['fid']!, - int.parse(state.pathParameters['pid']!), + int.parse(state.pathParameters['pid']!.toString())!, ); String get location => GoRouteData.$location( @@ -100,8 +100,9 @@ extension $PersonDetailsRouteExtension on PersonDetailsRoute { static PersonDetailsRoute _fromState(GoRouterState state) => PersonDetailsRoute( state.pathParameters['fid']!, - int.parse(state.pathParameters['pid']!), - _$PersonDetailsEnumMap._$fromName(state.pathParameters['details']!), + int.parse(state.pathParameters['pid']!.toString())!, + _$PersonDetailsEnumMap + ._$fromName(state.pathParameters['details']!.toString())!, $extra: state.extra as int?, ); @@ -129,7 +130,7 @@ const _$PersonDetailsEnumMap = { extension $FamilyCountRouteExtension on FamilyCountRoute { static FamilyCountRoute _fromState(GoRouterState state) => FamilyCountRoute( - int.parse(state.pathParameters['count']!), + int.parse(state.pathParameters['count']!.toString())!, ); String get location => GoRouteData.$location( @@ -147,8 +148,8 @@ extension $FamilyCountRouteExtension on FamilyCountRoute { } extension on Map { - T _$fromName(String value) => - entries.singleWhere((element) => element.value == value).key; + T? _$fromName(String value) => + entries.where((element) => element.value == value).firstOrNull?.key; } RouteBase get $loginRoute => GoRouteData.$route( diff --git a/packages/go_router_builder/example/lib/readme_excerpts.g.dart b/packages/go_router_builder/example/lib/readme_excerpts.g.dart index f6ec99f9d2c..db7577b38f3 100644 --- a/packages/go_router_builder/example/lib/readme_excerpts.g.dart +++ b/packages/go_router_builder/example/lib/readme_excerpts.g.dart @@ -46,7 +46,7 @@ extension $HomeRouteExtension on HomeRoute { extension $FamilyRouteExtension on FamilyRoute { static FamilyRoute _fromState(GoRouterState state) => FamilyRoute( - fid: state.pathParameters['fid']!, + fid: state.pathParameters['fid'], ); String get location => GoRouteData.$location( @@ -154,7 +154,7 @@ RouteBase get $hotdogRouteWithEverything => GoRouteData.$route( extension $HotdogRouteWithEverythingExtension on HotdogRouteWithEverything { static HotdogRouteWithEverything _fromState(GoRouterState state) => HotdogRouteWithEverything( - _$boolConverter(state.pathParameters['ketchup']!), + _$boolConverter(state.pathParameters['ketchup']!.toString())!, state.uri.queryParameters['mustard'], state.extra as Sauce, ); diff --git a/packages/go_router_builder/example/lib/shell_route_with_keys_example.g.dart b/packages/go_router_builder/example/lib/shell_route_with_keys_example.g.dart index 6151889582d..f055dfb8be9 100644 --- a/packages/go_router_builder/example/lib/shell_route_with_keys_example.g.dart +++ b/packages/go_router_builder/example/lib/shell_route_with_keys_example.g.dart @@ -76,7 +76,7 @@ extension $UsersRouteDataExtension on UsersRouteData { extension $UserRouteDataExtension on UserRouteData { static UserRouteData _fromState(GoRouterState state) => UserRouteData( - id: int.parse(state.pathParameters['id']!), + id: int.parse(state.pathParameters['id']!.toString())!, ); String get location => GoRouteData.$location( diff --git a/packages/go_router_builder/example/lib/shell_route_with_observers_example.g.dart b/packages/go_router_builder/example/lib/shell_route_with_observers_example.g.dart index 5737eb472a3..46f2cf1b04c 100644 --- a/packages/go_router_builder/example/lib/shell_route_with_observers_example.g.dart +++ b/packages/go_router_builder/example/lib/shell_route_with_observers_example.g.dart @@ -75,7 +75,7 @@ extension $UsersRouteDataExtension on UsersRouteData { extension $UserRouteDataExtension on UserRouteData { static UserRouteData _fromState(GoRouterState state) => UserRouteData( - id: int.parse(state.pathParameters['id']!), + id: int.parse(state.pathParameters['id']!.toString())!, ); String get location => GoRouteData.$location( diff --git a/packages/go_router_builder/example/lib/simple_example.dart b/packages/go_router_builder/example/lib/simple_example.dart index b977a296cb4..bfef272b186 100644 --- a/packages/go_router_builder/example/lib/simple_example.dart +++ b/packages/go_router_builder/example/lib/simple_example.dart @@ -45,8 +45,9 @@ class FamilyRoute extends GoRouteData { final String familyId; @override - Widget build(BuildContext context, GoRouterState state) => - FamilyScreen(family: familyById(familyId)); + Widget build(BuildContext context, GoRouterState state) { + return FamilyScreen(family: familyById(familyId)); + } } class HomeScreen extends StatelessWidget { diff --git a/packages/go_router_builder/example/lib/stateful_shell_route_initial_location_example.g.dart b/packages/go_router_builder/example/lib/stateful_shell_route_initial_location_example.g.dart index 5b398e07990..fa2581be3d9 100644 --- a/packages/go_router_builder/example/lib/stateful_shell_route_initial_location_example.g.dart +++ b/packages/go_router_builder/example/lib/stateful_shell_route_initial_location_example.g.dart @@ -69,7 +69,7 @@ extension $NotificationsRouteDataExtension on NotificationsRouteData { static NotificationsRouteData _fromState(GoRouterState state) => NotificationsRouteData( section: _$NotificationsPageSectionEnumMap - ._$fromName(state.pathParameters['section']!), + ._$fromName(state.pathParameters['section']!.toString())!, ); String get location => GoRouteData.$location( @@ -111,6 +111,6 @@ extension $OrdersRouteDataExtension on OrdersRouteData { } extension on Map { - T _$fromName(String value) => - entries.singleWhere((element) => element.value == value).key; + T? _$fromName(String value) => + entries.where((element) => element.value == value).firstOrNull?.key; } diff --git a/packages/go_router_builder/lib/src/route_config.dart b/packages/go_router_builder/lib/src/route_config.dart index 0cfa7a3928c..532fdb5f255 100644 --- a/packages/go_router_builder/lib/src/route_config.dart +++ b/packages/go_router_builder/lib/src/route_config.dart @@ -740,7 +740,7 @@ const String _convertMapValueHelper = ''' T? $convertMapValueHelperName( String key, Map map, - T Function(String) converter, + T? Function(String) converter, ) { final value = map[key]; return value == null ? null : converter(value); @@ -762,6 +762,6 @@ bool $boolConverterHelperName(String value) { const String _enumConverterHelper = ''' extension on Map { - T $enumExtensionHelperName(String value) => - entries.singleWhere((element) => element.value == value).key; + T? $enumExtensionHelperName(String value) => + entries.where((element) => element.value == value).firstOrNull?.key; }'''; diff --git a/packages/go_router_builder/lib/src/type_helpers.dart b/packages/go_router_builder/lib/src/type_helpers.dart index d375c013e20..23ca101fb87 100644 --- a/packages/go_router_builder/lib/src/type_helpers.dart +++ b/packages/go_router_builder/lib/src/type_helpers.dart @@ -97,14 +97,11 @@ String _stateValueAccess(ParameterElement element, Set pathParameters) { late String access; if (pathParameters.contains(element.name)) { - access = 'pathParameters[${escapeDartString(element.name)}]'; + access = + 'pathParameters[${escapeDartString(element.name)}]${element.isRequired ? '!' : ''}'; } else { access = 'uri.queryParameters[${escapeDartString(element.name.kebab)}]'; } - if (pathParameters.contains(element.name) || - (!element.type.isNullableType && !element.hasDefaultValue)) { - access += '!'; - } return access; } @@ -125,7 +122,12 @@ class _TypeHelperBigInt extends _TypeHelperWithHelper { const _TypeHelperBigInt(); @override - String helperName(DartType paramType) => 'BigInt.parse'; + String helperName(DartType paramType) { + if (paramType.isNullableType) { + return 'BigInt.tryParse'; + } + return 'BigInt.parse'; + } @override String _encode(String fieldName, DartType type) => @@ -154,7 +156,12 @@ class _TypeHelperDateTime extends _TypeHelperWithHelper { const _TypeHelperDateTime(); @override - String helperName(DartType paramType) => 'DateTime.parse'; + String helperName(DartType paramType) { + if (paramType.isNullableType) { + return 'DateTime.tryParse'; + } + return 'DateTime.parse'; + } @override String _encode(String fieldName, DartType type) => @@ -169,7 +176,12 @@ class _TypeHelperDouble extends _TypeHelperWithHelper { const _TypeHelperDouble(); @override - String helperName(DartType paramType) => 'double.parse'; + String helperName(DartType paramType) { + if (paramType.isNullableType) { + return 'double.tryParse'; + } + return 'double.parse'; + } @override String _encode(String fieldName, DartType type) => @@ -198,7 +210,12 @@ class _TypeHelperInt extends _TypeHelperWithHelper { const _TypeHelperInt(); @override - String helperName(DartType paramType) => 'int.parse'; + String helperName(DartType paramType) { + if (paramType.isNullableType) { + return 'int.tryParse'; + } + return 'int.parse'; + } @override String _encode(String fieldName, DartType type) => @@ -212,7 +229,12 @@ class _TypeHelperNum extends _TypeHelperWithHelper { const _TypeHelperNum(); @override - String helperName(DartType paramType) => 'num.parse'; + String helperName(DartType paramType) { + if (paramType.isNullableType) { + return 'num.tryParse'; + } + return 'num.parse'; + } @override String _encode(String fieldName, DartType type) => @@ -241,7 +263,12 @@ class _TypeHelperUri extends _TypeHelperWithHelper { const _TypeHelperUri(); @override - String helperName(DartType paramType) => 'Uri.parse'; + String helperName(DartType paramType) { + if (paramType.isNullableType) { + return 'Uri.tryParse'; + } + return 'Uri.parse'; + } @override String _encode(String fieldName, DartType type) => @@ -264,9 +291,26 @@ class _TypeHelperIterable extends _TypeHelper { // get a type converter for values in iterable String entriesTypeDecoder = '(e) => e'; + String convertToNotNull = ''; + String formatIterableType = ''; + String asParameterType = ' as ${parameterElement.type}'; + + if (parameterElement.hasDefaultValue) { + asParameterType += '?'; + } + for (final _TypeHelper helper in _helpers) { if (helper._matchesType(iterableType) && helper is _TypeHelperWithHelper) { + if (!iterableType.isNullableType) { + if (parameterElement.type.isDartCoreList) { + formatIterableType = '?.toList()'; + } else if (parameterElement.type.isDartCoreSet) { + formatIterableType = '?.toSet()'; + } + convertToNotNull = + '?.where((e) => e != null)?.cast<$iterableType>()$formatIterableType${asParameterType}'; + } entriesTypeDecoder = helper.helperName(iterableType); } } @@ -274,16 +318,17 @@ class _TypeHelperIterable extends _TypeHelper { // get correct type for iterable String iterableCaster = ''; String fallBack = ''; + if (const TypeChecker.fromRuntime(List) .isAssignableFromType(parameterElement.type)) { - iterableCaster = '.toList()'; + iterableCaster += '?.toList()'; if (!parameterElement.type.isNullableType && !parameterElement.hasDefaultValue) { fallBack = '?? const []'; } } else if (const TypeChecker.fromRuntime(Set) .isAssignableFromType(parameterElement.type)) { - iterableCaster = '.toSet()'; + iterableCaster += '?.toSet()'; if (!parameterElement.type.isNullableType && !parameterElement.hasDefaultValue) { fallBack = '?? const {}'; @@ -291,9 +336,9 @@ class _TypeHelperIterable extends _TypeHelper { } return ''' -state.uri.queryParametersAll[ +(state.uri.queryParametersAll[ ${escapeDartString(parameterElement.name.kebab)}] - ?.map($entriesTypeDecoder)$iterableCaster$fallBack'''; + ?.map($entriesTypeDecoder)$convertToNotNull)$iterableCaster$fallBack'''; } return ''' state.uri.queryParametersAll[${escapeDartString(parameterElement.name.kebab)}]'''; @@ -345,7 +390,7 @@ abstract class _TypeHelperWithHelper extends _TypeHelper { '${helperName(paramType)})'; } return '${helperName(paramType)}' - '(state.${_stateValueAccess(parameterElement, pathParameters)})'; + '(state.${_stateValueAccess(parameterElement, pathParameters)}.toString())!'; } } From 7ac9c4750789a43a1c4fe802c3c7e1a9b9eb72bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cao=20Gia=20Hie=CC=82=CC=81u?= Date: Fri, 10 Jan 2025 11:41:53 +0700 Subject: [PATCH 02/15] feat: add test case --- .../example/lib/all_types.dart | 36 ++++++++++ .../example/lib/all_types.g.dart | 21 ++++++ .../example/test/all_types_test.dart | 71 +++++++++++++++++++ 3 files changed, 128 insertions(+) diff --git a/packages/go_router_builder/example/lib/all_types.dart b/packages/go_router_builder/example/lib/all_types.dart index 63d73caa4c0..72212b71d9c 100644 --- a/packages/go_router_builder/example/lib/all_types.dart +++ b/packages/go_router_builder/example/lib/all_types.dart @@ -12,6 +12,7 @@ import 'shared/data.dart'; part 'all_types.g.dart'; @TypedGoRoute(path: '/', routes: >[ + TypedGoRoute(path: 'invalid-page'), TypedGoRoute(path: 'big-int-route/:requiredBigIntField'), TypedGoRoute(path: 'bool-route/:requiredBoolField'), TypedGoRoute(path: 'date-time-route/:requiredDateTimeField'), @@ -39,6 +40,22 @@ class AllTypesBaseRoute extends GoRouteData { ); } +class InvalidPageRoute extends GoRouteData { + InvalidPageRoute(); + + @override + Widget build(BuildContext context, GoRouterState state) => InvalidPage( + dataTitle: 'InvalidPage', + queryParamWithDefaultValue: state.uri.queryParameters, + ); + + Widget drawerTile(BuildContext context) => ListTile( + title: const Text('InvalidPage'), + onTap: () => go(context), + selected: GoRouterState.of(context).uri.path == location, + ); +} + class BigIntRoute extends GoRouteData { BigIntRoute({ required this.requiredBigIntField, @@ -629,3 +646,22 @@ class IterablePage extends StatelessWidget { ); } } + +class InvalidPage extends StatelessWidget { + const InvalidPage({ + super.key, + required this.dataTitle, + this.queryParamWithDefaultValue, + }); + + final String dataTitle; + final Map? queryParamWithDefaultValue; + + @override + Widget build(BuildContext context) { + return BasePage( + dataTitle: dataTitle, + queryParamWithDefaultValue: queryParamWithDefaultValue.toString(), + ); + } +} 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 5d2442cd677..d2c5381a912 100644 --- a/packages/go_router_builder/example/lib/all_types.g.dart +++ b/packages/go_router_builder/example/lib/all_types.g.dart @@ -16,6 +16,10 @@ RouteBase get $allTypesBaseRoute => GoRouteData.$route( path: '/', factory: $AllTypesBaseRouteExtension._fromState, routes: [ + GoRouteData.$route( + path: 'invalid-page', + factory: $InvalidPageRouteExtension._fromState, + ), GoRouteData.$route( path: 'big-int-route/:requiredBigIntField', factory: $BigIntRouteExtension._fromState, @@ -89,6 +93,23 @@ extension $AllTypesBaseRouteExtension on AllTypesBaseRoute { void replace(BuildContext context) => context.replace(location); } +extension $InvalidPageRouteExtension on InvalidPageRoute { + static InvalidPageRoute _fromState(GoRouterState state) => InvalidPageRoute(); + + String get location => GoRouteData.$location( + '/invalid-page', + ); + + void go(BuildContext context) => context.go(location); + + Future push(BuildContext context) => context.push(location); + + void pushReplacement(BuildContext context) => + context.pushReplacement(location); + + void replace(BuildContext context) => context.replace(location); +} + extension $BigIntRouteExtension on BigIntRoute { static BigIntRoute _fromState(GoRouterState state) => BigIntRoute( requiredBigIntField: BigInt.parse( 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 eafcdeefda0..89774f7f623 100644 --- a/packages/go_router_builder/example/test/all_types_test.dart +++ b/packages/go_router_builder/example/test/all_types_test.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:go_router/go_router.dart'; import 'package:go_router_builder_example/all_types.dart'; import 'package:go_router_builder_example/shared/data.dart'; @@ -221,4 +222,74 @@ void main() { ); expect(find.text('/iterable-route-with-default-values'), findsOneWidget); }); + + testWidgets( + 'Test navigation with invalid query and path parameters using Uri.parse', + (WidgetTester tester) async { + await tester.pumpWidget(AllTypesApp()); + + final ScaffoldState scaffoldState = + tester.firstState(find.byType(Scaffold)); + + // Test invalid BigInt parameter + scaffoldState.context + .go(Uri.parse('/big-int-route/4?bigIntField=invalid').toString()); + await tester.pumpAndSettle(); + expect(find.text('BigIntRoute'), findsOneWidget); + expect(find.text('Param: 4'), findsOneWidget); + expect(find.text('Query param: null'), findsOneWidget); + + // Test invalid DateTime parameter + scaffoldState.context.go(Uri.parse( + '/date-time-route/2021-01-01T00:00:00.000?dateTimeField=invalid-date') + .toString()); + await tester.pumpAndSettle(); + expect(find.text('DateTimeRoute'), findsOneWidget); + expect(find.text('Param: 2021-01-01 00:00:00.000'), findsOneWidget); + expect(find.text('Query param: null'), findsOneWidget); + + // Test invalid Double parameter + scaffoldState.context + .go(Uri.parse('/double-route/3.14?doubleField=invalid').toString()); + await tester.pumpAndSettle(); + expect(find.text('DoubleRoute'), findsOneWidget); + expect(find.text('Param: 3.14'), findsOneWidget); + expect(find.text('Query param: null'), findsOneWidget); + expect(find.text('Query param with default value: 1.0'), findsOneWidget); + + // Test invalid Int parameter + scaffoldState.context + .go(Uri.parse('/int-route/65?intField=invalid').toString()); + await tester.pumpAndSettle(); + expect(find.text('IntRoute'), findsOneWidget); + expect(find.text('Param: 65'), findsOneWidget); + expect(find.text('Query param: null'), findsOneWidget); + expect(find.text('Query param with default value: 1'), findsOneWidget); + + // Test invalid Uri parameter + scaffoldState.context.go( + Uri.parse('/uri-route/https%3A%2F%2Fdart.dev?uriField=invalid-uri') + .toString()); + await tester.pumpAndSettle(); + expect(find.text('UriRoute'), findsOneWidget); + expect(find.text('Param: https://dart.dev'), findsOneWidget); + expect(find.text('Query param: null'), findsOneWidget); + + // Test invalid Enum parameter + scaffoldState.context.go( + Uri.parse('/enum-route/favorite-food?enum-field=invalid').toString()); + await tester.pumpAndSettle(); + expect(find.text('EnumRoute'), findsOneWidget); + expect(find.text('Query param: null'), findsOneWidget); + expect( + find.text('Query param with default value: PersonDetails.favoriteFood'), + findsOneWidget); + + // Test invalid Iterable parameter + scaffoldState.context + .go(Uri.parse('/iterable-route?intListField=invalid').toString()); + await tester.pumpAndSettle(); + expect(find.text('IterableRoute'), findsOneWidget); + expect(find.text('/iterable-route'), findsOneWidget); + }); } From d9fbb304620c88856db910548c25e0dc967b0774 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cao=20Gia=20Hie=CC=82=CC=81u?= Date: Fri, 10 Jan 2025 13:15:41 +0700 Subject: [PATCH 03/15] fix: Fix lint --- packages/go_router_builder/lib/src/type_helpers.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/go_router_builder/lib/src/type_helpers.dart b/packages/go_router_builder/lib/src/type_helpers.dart index 23ca101fb87..cb9f2aa184d 100644 --- a/packages/go_router_builder/lib/src/type_helpers.dart +++ b/packages/go_router_builder/lib/src/type_helpers.dart @@ -309,7 +309,7 @@ class _TypeHelperIterable extends _TypeHelper { formatIterableType = '?.toSet()'; } convertToNotNull = - '?.where((e) => e != null)?.cast<$iterableType>()$formatIterableType${asParameterType}'; + '?.where((e) => e != null)?.cast<$iterableType>()$formatIterableType$asParameterType'; } entriesTypeDecoder = helper.helperName(iterableType); } From f22f8994d9a5d8fb10fba64739de5b13dcf6e116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cao=20Gia=20Hie=CC=82=CC=81u?= Date: Fri, 10 Jan 2025 13:33:25 +0700 Subject: [PATCH 04/15] bump --- packages/go_router_builder/CHANGELOG.md | 3 +++ packages/go_router_builder/pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/go_router_builder/CHANGELOG.md b/packages/go_router_builder/CHANGELOG.md index 687d9210f05..1c01903170f 100644 --- a/packages/go_router_builder/CHANGELOG.md +++ b/packages/go_router_builder/CHANGELOG.md @@ -1,3 +1,6 @@ +## 2.7.4 + +- Fixes an issue when navigate to router with invalid params ## 2.7.3 diff --git a/packages/go_router_builder/pubspec.yaml b/packages/go_router_builder/pubspec.yaml index 692b81f0796..1f4e9da1504 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: 2.7.3 +version: 2.7.4 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 288e154c0ff561622f6266cbc78e055c2bec8064 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cao=20Gia=20Hie=CC=82=CC=81u?= Date: Fri, 10 Jan 2025 15:01:42 +0700 Subject: [PATCH 05/15] refactor: remove breakout line --- packages/go_router_builder/lib/src/type_helpers.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/go_router_builder/lib/src/type_helpers.dart b/packages/go_router_builder/lib/src/type_helpers.dart index cb9f2aa184d..37f68b03d1d 100644 --- a/packages/go_router_builder/lib/src/type_helpers.dart +++ b/packages/go_router_builder/lib/src/type_helpers.dart @@ -318,7 +318,6 @@ class _TypeHelperIterable extends _TypeHelper { // get correct type for iterable String iterableCaster = ''; String fallBack = ''; - if (const TypeChecker.fromRuntime(List) .isAssignableFromType(parameterElement.type)) { iterableCaster += '?.toList()'; From 6773bc2edb3c81af2e3f22463e6240528c24db0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cao=20Gia=20Hie=CC=82=CC=81u?= Date: Fri, 10 Jan 2025 15:17:10 +0700 Subject: [PATCH 06/15] fix: update test_inputs --- .../test_inputs/default_value.dart.expect | 4 +-- .../test_inputs/enum_parameter.dart.expect | 8 +++--- .../test_inputs/extra_value.dart.expect | 4 +-- .../iterable_with_default_value.dart.expect | 7 +++-- .../iterable_with_enum.dart.expect | 13 +++++---- .../test_inputs/list.dart.expect | 27 +++++++++++++------ ...meters_not_in_path_can_be_null.dart.expect | 6 ++--- .../required_query_parameter.dart.expect | 4 +-- .../test_inputs/set.dart.expect | 27 +++++++++++++------ 9 files changed, 64 insertions(+), 36 deletions(-) diff --git a/packages/go_router_builder/test_inputs/default_value.dart.expect b/packages/go_router_builder/test_inputs/default_value.dart.expect index af5ce08b341..9c1d1b4f324 100644 --- a/packages/go_router_builder/test_inputs/default_value.dart.expect +++ b/packages/go_router_builder/test_inputs/default_value.dart.expect @@ -30,8 +30,8 @@ extension $DefaultValueRouteExtension on DefaultValueRoute { T? _$convertMapValue( String key, Map map, - T Function(String) converter, + T? Function(String) converter, ) { final value = map[key]; return value == null ? null : converter(value); -} +} \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/enum_parameter.dart.expect b/packages/go_router_builder/test_inputs/enum_parameter.dart.expect index c7dcba7146d..f8320ea4b4e 100644 --- a/packages/go_router_builder/test_inputs/enum_parameter.dart.expect +++ b/packages/go_router_builder/test_inputs/enum_parameter.dart.expect @@ -5,7 +5,7 @@ RouteBase get $enumParam => GoRouteData.$route( extension $EnumParamExtension on EnumParam { static EnumParam _fromState(GoRouterState state) => EnumParam( - y: _$EnumTestEnumMap._$fromName(state.pathParameters['y']!), + y: _$EnumTestEnumMap._$fromName(state.pathParameters['y']!.toString())!, ); String get location => GoRouteData.$location( @@ -29,6 +29,6 @@ const _$EnumTestEnumMap = { }; extension on Map { - T _$fromName(String value) => - entries.singleWhere((element) => element.value == value).key; -} + T? _$fromName(String value) => + entries.where((element) => element.value == value).firstOrNull?.key; +} \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/extra_value.dart.expect b/packages/go_router_builder/test_inputs/extra_value.dart.expect index a3c02e4cbf9..2c49af7adff 100644 --- a/packages/go_router_builder/test_inputs/extra_value.dart.expect +++ b/packages/go_router_builder/test_inputs/extra_value.dart.expect @@ -33,8 +33,8 @@ extension $ExtraValueRouteExtension on ExtraValueRoute { T? _$convertMapValue( String key, Map map, - T Function(String) converter, + T? Function(String) converter, ) { final value = map[key]; return value == null ? null : converter(value); -} +} \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/iterable_with_default_value.dart.expect b/packages/go_router_builder/test_inputs/iterable_with_default_value.dart.expect index 0b53e45b02d..30472c469c5 100644 --- a/packages/go_router_builder/test_inputs/iterable_with_default_value.dart.expect +++ b/packages/go_router_builder/test_inputs/iterable_with_default_value.dart.expect @@ -6,7 +6,10 @@ RouteBase get $iterableDefaultValueRoute => GoRouteData.$route( extension $IterableDefaultValueRouteExtension on IterableDefaultValueRoute { static IterableDefaultValueRoute _fromState(GoRouterState state) => IterableDefaultValueRoute( - param: state.uri.queryParametersAll['param']?.map(int.parse) ?? + param: (state.uri.queryParametersAll['param'] + ?.map(int.parse) + ?.where((e) => e != null) + ?.cast() as Iterable?) ?? const [0], ); @@ -26,4 +29,4 @@ extension $IterableDefaultValueRouteExtension on IterableDefaultValueRoute { context.pushReplacement(location); void replace(BuildContext context) => context.replace(location); -} +} \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/iterable_with_enum.dart.expect b/packages/go_router_builder/test_inputs/iterable_with_enum.dart.expect index 048909fbff1..3e52cad9e9a 100644 --- a/packages/go_router_builder/test_inputs/iterable_with_enum.dart.expect +++ b/packages/go_router_builder/test_inputs/iterable_with_enum.dart.expect @@ -6,8 +6,11 @@ RouteBase get $iterableWithEnumRoute => GoRouteData.$route( extension $IterableWithEnumRouteExtension on IterableWithEnumRoute { static IterableWithEnumRoute _fromState(GoRouterState state) => IterableWithEnumRoute( - param: state.uri.queryParametersAll['param'] - ?.map(_$EnumOnlyUsedInIterableEnumMap._$fromName), + param: (state.uri.queryParametersAll['param'] + ?.map(_$EnumOnlyUsedInIterableEnumMap._$fromName) + ?.where((e) => e != null) + ?.cast() + as Iterable?), ); String get location => GoRouteData.$location( @@ -36,6 +39,6 @@ const _$EnumOnlyUsedInIterableEnumMap = { }; extension on Map { - T _$fromName(String value) => - entries.singleWhere((element) => element.value == value).key; -} + T? _$fromName(String value) => + entries.where((element) => element.value == value).firstOrNull?.key; +} \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/list.dart.expect b/packages/go_router_builder/test_inputs/list.dart.expect index 2fbf6eef07b..d5e4e9a7129 100644 --- a/packages/go_router_builder/test_inputs/list.dart.expect +++ b/packages/go_router_builder/test_inputs/list.dart.expect @@ -5,15 +5,26 @@ RouteBase get $listRoute => GoRouteData.$route( extension $ListRouteExtension on ListRoute { static ListRoute _fromState(GoRouterState state) => ListRoute( - ids: state.uri.queryParametersAll['ids']?.map(int.parse).toList() ?? + ids: (state.uri.queryParametersAll['ids'] + ?.map(int.parse) + ?.where((e) => e != null) + ?.cast() + ?.toList() as List) + ?.toList() ?? const [], - nullableIds: state.uri.queryParametersAll['nullable-ids'] - ?.map(int.parse) - .toList(), - idsWithDefaultValue: state - .uri.queryParametersAll['ids-with-default-value'] + nullableIds: (state.uri.queryParametersAll['nullable-ids'] ?.map(int.parse) - .toList() ?? + ?.where((e) => e != null) + ?.cast() + ?.toList() as List?) + ?.toList(), + idsWithDefaultValue: (state + .uri.queryParametersAll['ids-with-default-value'] + ?.map(int.parse) + ?.where((e) => e != null) + ?.cast() + ?.toList() as List?) + ?.toList() ?? const [0], ); @@ -37,4 +48,4 @@ extension $ListRouteExtension on ListRoute { context.pushReplacement(location); void replace(BuildContext context) => context.replace(location); -} +} \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/required_parameters_not_in_path_can_be_null.dart.expect b/packages/go_router_builder/test_inputs/required_parameters_not_in_path_can_be_null.dart.expect index 0e27dc9e5ff..edb2cbe29b9 100644 --- a/packages/go_router_builder/test_inputs/required_parameters_not_in_path_can_be_null.dart.expect +++ b/packages/go_router_builder/test_inputs/required_parameters_not_in_path_can_be_null.dart.expect @@ -7,7 +7,7 @@ extension $NullableRequiredParamNotInPathExtension on NullableRequiredParamNotInPath { static NullableRequiredParamNotInPath _fromState(GoRouterState state) => NullableRequiredParamNotInPath( - id: _$convertMapValue('id', state.uri.queryParameters, int.parse), + id: _$convertMapValue('id', state.uri.queryParameters, int.tryParse), ); String get location => GoRouteData.$location( @@ -30,8 +30,8 @@ extension $NullableRequiredParamNotInPathExtension T? _$convertMapValue( String key, Map map, - T Function(String) converter, + T? Function(String) converter, ) { final value = map[key]; return value == null ? null : converter(value); -} +} \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/required_query_parameter.dart.expect b/packages/go_router_builder/test_inputs/required_query_parameter.dart.expect index 09d957cb075..1853fdfa44c 100644 --- a/packages/go_router_builder/test_inputs/required_query_parameter.dart.expect +++ b/packages/go_router_builder/test_inputs/required_query_parameter.dart.expect @@ -7,7 +7,7 @@ extension $NonNullableRequiredParamNotInPathExtension on NonNullableRequiredParamNotInPath { static NonNullableRequiredParamNotInPath _fromState(GoRouterState state) => NonNullableRequiredParamNotInPath( - id: int.parse(state.uri.queryParameters['id']!), + id: int.parse(state.uri.queryParameters['id'].toString())!, ); String get location => GoRouteData.$location( @@ -25,4 +25,4 @@ extension $NonNullableRequiredParamNotInPathExtension context.pushReplacement(location); void replace(BuildContext context) => context.replace(location); -} +} \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/set.dart.expect b/packages/go_router_builder/test_inputs/set.dart.expect index 6a8c150b54c..e3eb6e753b6 100644 --- a/packages/go_router_builder/test_inputs/set.dart.expect +++ b/packages/go_router_builder/test_inputs/set.dart.expect @@ -5,15 +5,26 @@ RouteBase get $setRoute => GoRouteData.$route( extension $SetRouteExtension on SetRoute { static SetRoute _fromState(GoRouterState state) => SetRoute( - ids: state.uri.queryParametersAll['ids']?.map(int.parse).toSet() ?? + ids: (state.uri.queryParametersAll['ids'] + ?.map(int.parse) + ?.where((e) => e != null) + ?.cast() + ?.toSet() as Set) + ?.toSet() ?? const {}, - nullableIds: state.uri.queryParametersAll['nullable-ids'] - ?.map(int.parse) - .toSet(), - idsWithDefaultValue: state - .uri.queryParametersAll['ids-with-default-value'] + nullableIds: (state.uri.queryParametersAll['nullable-ids'] ?.map(int.parse) - .toSet() ?? + ?.where((e) => e != null) + ?.cast() + ?.toSet() as Set?) + ?.toSet(), + idsWithDefaultValue: (state + .uri.queryParametersAll['ids-with-default-value'] + ?.map(int.parse) + ?.where((e) => e != null) + ?.cast() + ?.toSet() as Set?) + ?.toSet() ?? const {0}, ); @@ -37,4 +48,4 @@ extension $SetRouteExtension on SetRoute { context.pushReplacement(location); void replace(BuildContext context) => context.replace(location); -} +} \ No newline at end of file From ad7a00ea35acb3f1086d06383c97a3f9018a2181 Mon Sep 17 00:00:00 2001 From: CaoGiaHieu-dev Date: Sat, 11 Jan 2025 12:44:35 +0700 Subject: [PATCH 07/15] update --- .../example/lib/all_types.dart | 36 ------------------- .../example/lib/all_types.g.dart | 21 ----------- 2 files changed, 57 deletions(-) diff --git a/packages/go_router_builder/example/lib/all_types.dart b/packages/go_router_builder/example/lib/all_types.dart index 72212b71d9c..63d73caa4c0 100644 --- a/packages/go_router_builder/example/lib/all_types.dart +++ b/packages/go_router_builder/example/lib/all_types.dart @@ -12,7 +12,6 @@ import 'shared/data.dart'; part 'all_types.g.dart'; @TypedGoRoute(path: '/', routes: >[ - TypedGoRoute(path: 'invalid-page'), TypedGoRoute(path: 'big-int-route/:requiredBigIntField'), TypedGoRoute(path: 'bool-route/:requiredBoolField'), TypedGoRoute(path: 'date-time-route/:requiredDateTimeField'), @@ -40,22 +39,6 @@ class AllTypesBaseRoute extends GoRouteData { ); } -class InvalidPageRoute extends GoRouteData { - InvalidPageRoute(); - - @override - Widget build(BuildContext context, GoRouterState state) => InvalidPage( - dataTitle: 'InvalidPage', - queryParamWithDefaultValue: state.uri.queryParameters, - ); - - Widget drawerTile(BuildContext context) => ListTile( - title: const Text('InvalidPage'), - onTap: () => go(context), - selected: GoRouterState.of(context).uri.path == location, - ); -} - class BigIntRoute extends GoRouteData { BigIntRoute({ required this.requiredBigIntField, @@ -646,22 +629,3 @@ class IterablePage extends StatelessWidget { ); } } - -class InvalidPage extends StatelessWidget { - const InvalidPage({ - super.key, - required this.dataTitle, - this.queryParamWithDefaultValue, - }); - - final String dataTitle; - final Map? queryParamWithDefaultValue; - - @override - Widget build(BuildContext context) { - return BasePage( - dataTitle: dataTitle, - queryParamWithDefaultValue: queryParamWithDefaultValue.toString(), - ); - } -} 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 d2c5381a912..5d2442cd677 100644 --- a/packages/go_router_builder/example/lib/all_types.g.dart +++ b/packages/go_router_builder/example/lib/all_types.g.dart @@ -16,10 +16,6 @@ RouteBase get $allTypesBaseRoute => GoRouteData.$route( path: '/', factory: $AllTypesBaseRouteExtension._fromState, routes: [ - GoRouteData.$route( - path: 'invalid-page', - factory: $InvalidPageRouteExtension._fromState, - ), GoRouteData.$route( path: 'big-int-route/:requiredBigIntField', factory: $BigIntRouteExtension._fromState, @@ -93,23 +89,6 @@ extension $AllTypesBaseRouteExtension on AllTypesBaseRoute { void replace(BuildContext context) => context.replace(location); } -extension $InvalidPageRouteExtension on InvalidPageRoute { - static InvalidPageRoute _fromState(GoRouterState state) => InvalidPageRoute(); - - String get location => GoRouteData.$location( - '/invalid-page', - ); - - void go(BuildContext context) => context.go(location); - - Future push(BuildContext context) => context.push(location); - - void pushReplacement(BuildContext context) => - context.pushReplacement(location); - - void replace(BuildContext context) => context.replace(location); -} - extension $BigIntRouteExtension on BigIntRoute { static BigIntRoute _fromState(GoRouterState state) => BigIntRoute( requiredBigIntField: BigInt.parse( From 4361bb2b9e7071eaa0d1062c8405f02706e914af Mon Sep 17 00:00:00 2001 From: CaoGiaHieu-dev Date: Sat, 11 Jan 2025 12:45:42 +0700 Subject: [PATCH 08/15] update --- .../go_router_builder/test_inputs/bad_path_pattern.dart.expect | 2 +- .../test_inputs/missing_type_annotation.dart.expect | 2 +- .../test_inputs/named_escaped_route.dart.expect | 2 +- packages/go_router_builder/test_inputs/named_route.dart.expect | 2 +- .../test_inputs/nullable_default_value.dart.expect | 2 +- .../test_inputs/required_extra_value.dart.expect | 2 +- .../required_nullable_type_arguments_extra_value.dart.expect | 2 +- .../required_parameters_in_path_cannnot_be_null.dart.expect | 2 +- .../shell_route_data_without_unnamed_constructor.dart.expect | 2 +- .../test_inputs/statefull_shell_branch_data.dart.expect | 2 +- .../statefull_shell_branch_with_observers_data.dart.expect | 2 +- .../go_router_builder/test_inputs/unsupported_type.dart.expect | 2 +- .../go_router_builder/test_inputs/wrong_class_type.dart.expect | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/go_router_builder/test_inputs/bad_path_pattern.dart.expect b/packages/go_router_builder/test_inputs/bad_path_pattern.dart.expect index 2dc7bdc16e8..aa4badd315a 100644 --- a/packages/go_router_builder/test_inputs/bad_path_pattern.dart.expect +++ b/packages/go_router_builder/test_inputs/bad_path_pattern.dart.expect @@ -1 +1 @@ -Could not find a field for the path parameter "id". +Could not find a field for the path parameter "id". \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/missing_type_annotation.dart.expect b/packages/go_router_builder/test_inputs/missing_type_annotation.dart.expect index d82af829f66..66a8f6c9291 100644 --- a/packages/go_router_builder/test_inputs/missing_type_annotation.dart.expect +++ b/packages/go_router_builder/test_inputs/missing_type_annotation.dart.expect @@ -1 +1 @@ -The @TypedGoRoute annotation must have a type parameter that matches the annotated element. +The @TypedGoRoute annotation must have a type parameter that matches the annotated element. \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/named_escaped_route.dart.expect b/packages/go_router_builder/test_inputs/named_escaped_route.dart.expect index e4d75ec8163..11cfb88d794 100644 --- a/packages/go_router_builder/test_inputs/named_escaped_route.dart.expect +++ b/packages/go_router_builder/test_inputs/named_escaped_route.dart.expect @@ -20,4 +20,4 @@ extension $NamedEscapedRouteExtension on NamedEscapedRoute { context.pushReplacement(location); void replace(BuildContext context) => context.replace(location); -} +} \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/named_route.dart.expect b/packages/go_router_builder/test_inputs/named_route.dart.expect index 9d4b705530c..caf08d36886 100644 --- a/packages/go_router_builder/test_inputs/named_route.dart.expect +++ b/packages/go_router_builder/test_inputs/named_route.dart.expect @@ -19,4 +19,4 @@ extension $NamedRouteExtension on NamedRoute { context.pushReplacement(location); void replace(BuildContext context) => context.replace(location); -} +} \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/nullable_default_value.dart.expect b/packages/go_router_builder/test_inputs/nullable_default_value.dart.expect index 46215c7a4b9..d3ff3c34a84 100644 --- a/packages/go_router_builder/test_inputs/nullable_default_value.dart.expect +++ b/packages/go_router_builder/test_inputs/nullable_default_value.dart.expect @@ -1 +1 @@ -Default value used with a nullable type. Only non-nullable type can have a default value. +Default value used with a nullable type. Only non-nullable type can have a default value. \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/required_extra_value.dart.expect b/packages/go_router_builder/test_inputs/required_extra_value.dart.expect index 108cb124458..83596274861 100644 --- a/packages/go_router_builder/test_inputs/required_extra_value.dart.expect +++ b/packages/go_router_builder/test_inputs/required_extra_value.dart.expect @@ -23,4 +23,4 @@ extension $RequiredExtraValueRouteExtension on RequiredExtraValueRoute { void replace(BuildContext context) => context.replace(location, extra: $extra); -} +} \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/required_nullable_type_arguments_extra_value.dart.expect b/packages/go_router_builder/test_inputs/required_nullable_type_arguments_extra_value.dart.expect index 9877d353f4d..246debc7857 100644 --- a/packages/go_router_builder/test_inputs/required_nullable_type_arguments_extra_value.dart.expect +++ b/packages/go_router_builder/test_inputs/required_nullable_type_arguments_extra_value.dart.expect @@ -27,4 +27,4 @@ extension $RequiredNullableTypeArgumentsExtraValueRouteExtension void replace(BuildContext context) => context.replace(location, extra: $extra); -} +} \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/required_parameters_in_path_cannnot_be_null.dart.expect b/packages/go_router_builder/test_inputs/required_parameters_in_path_cannnot_be_null.dart.expect index 933e5310dfd..92c0cc835dc 100644 --- a/packages/go_router_builder/test_inputs/required_parameters_in_path_cannnot_be_null.dart.expect +++ b/packages/go_router_builder/test_inputs/required_parameters_in_path_cannnot_be_null.dart.expect @@ -1 +1 @@ -Required parameters in the path cannot be nullable. +Required parameters in the path cannot be nullable. \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/shell_route_data_without_unnamed_constructor.dart.expect b/packages/go_router_builder/test_inputs/shell_route_data_without_unnamed_constructor.dart.expect index c3d6e57e861..c6ce3388d0d 100644 --- a/packages/go_router_builder/test_inputs/shell_route_data_without_unnamed_constructor.dart.expect +++ b/packages/go_router_builder/test_inputs/shell_route_data_without_unnamed_constructor.dart.expect @@ -1 +1 @@ -The ShellRouteData "ShellRouteWithoutUnnamedConstructor" class must have an unnamed constructor. +The ShellRouteData "ShellRouteWithoutUnnamedConstructor" class must have an unnamed constructor. \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/statefull_shell_branch_data.dart.expect b/packages/go_router_builder/test_inputs/statefull_shell_branch_data.dart.expect index 07b95b1deeb..a1c77bf4c55 100644 --- a/packages/go_router_builder/test_inputs/statefull_shell_branch_data.dart.expect +++ b/packages/go_router_builder/test_inputs/statefull_shell_branch_data.dart.expect @@ -1,3 +1,3 @@ RouteBase get $shellRouteBranchData => StatefulShellBranchData.$branch( initialLocation: ShellRouteBranchData.$initialLocation, - ); + ); \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/statefull_shell_branch_with_observers_data.dart.expect b/packages/go_router_builder/test_inputs/statefull_shell_branch_with_observers_data.dart.expect index d851a3f1ffb..e65a88b4efc 100644 --- a/packages/go_router_builder/test_inputs/statefull_shell_branch_with_observers_data.dart.expect +++ b/packages/go_router_builder/test_inputs/statefull_shell_branch_with_observers_data.dart.expect @@ -2,4 +2,4 @@ RouteBase get $statefulShellBranchWithObserversData => StatefulShellBranchData.$branch( initialLocation: StatefulShellBranchWithObserversData.$initialLocation, observers: StatefulShellBranchWithObserversData.$observers, - ); + ); \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/unsupported_type.dart.expect b/packages/go_router_builder/test_inputs/unsupported_type.dart.expect index c53b98f0b5a..6f005b338dc 100644 --- a/packages/go_router_builder/test_inputs/unsupported_type.dart.expect +++ b/packages/go_router_builder/test_inputs/unsupported_type.dart.expect @@ -1 +1 @@ -The parameter type `Stopwatch` is not supported. +The parameter type `Stopwatch` is not supported. \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/wrong_class_type.dart.expect b/packages/go_router_builder/test_inputs/wrong_class_type.dart.expect index 50c40bd6c5f..d445b86664a 100644 --- a/packages/go_router_builder/test_inputs/wrong_class_type.dart.expect +++ b/packages/go_router_builder/test_inputs/wrong_class_type.dart.expect @@ -1 +1 @@ -The @TypedGoRoute annotation can only be applied to classes that extend or implement `GoRouteData`. +The @TypedGoRoute annotation can only be applied to classes that extend or implement `GoRouteData`. \ No newline at end of file From 9eafec12332ee71c2cbe142452d9c2546d023668 Mon Sep 17 00:00:00 2001 From: CaoGiaHieu-dev Date: Sat, 11 Jan 2025 12:50:01 +0700 Subject: [PATCH 09/15] update --- .../go_router_builder/test_inputs/bad_path_pattern.dart.expect | 2 +- .../go_router_builder/test_inputs/default_value.dart.expect | 2 +- .../go_router_builder/test_inputs/enum_parameter.dart.expect | 2 +- packages/go_router_builder/test_inputs/extra_value.dart.expect | 2 +- .../test_inputs/iterable_with_default_value.dart.expect | 2 +- .../test_inputs/iterable_with_enum.dart.expect | 2 +- packages/go_router_builder/test_inputs/list.dart.expect | 2 +- .../test_inputs/missing_type_annotation.dart.expect | 2 +- .../test_inputs/named_escaped_route.dart.expect | 2 +- packages/go_router_builder/test_inputs/named_route.dart.expect | 2 +- .../test_inputs/nullable_default_value.dart.expect | 2 +- .../test_inputs/required_extra_value.dart.expect | 2 +- .../required_nullable_type_arguments_extra_value.dart.expect | 2 +- .../required_parameters_in_path_cannnot_be_null.dart.expect | 2 +- .../required_parameters_not_in_path_can_be_null.dart.expect | 2 +- .../test_inputs/required_query_parameter.dart.expect | 2 +- packages/go_router_builder/test_inputs/set.dart.expect | 2 +- .../go_router_builder/test_inputs/shell_route_data.dart.expect | 2 +- .../shell_route_data_without_unnamed_constructor.dart.expect | 2 +- .../test_inputs/statefull_shell_branch_data.dart.expect | 3 ++- .../statefull_shell_branch_with_observers_data.dart.expect | 3 ++- .../go_router_builder/test_inputs/unsupported_type.dart.expect | 2 +- .../go_router_builder/test_inputs/wrong_class_type.dart.expect | 2 +- 23 files changed, 25 insertions(+), 23 deletions(-) diff --git a/packages/go_router_builder/test_inputs/bad_path_pattern.dart.expect b/packages/go_router_builder/test_inputs/bad_path_pattern.dart.expect index aa4badd315a..2dc7bdc16e8 100644 --- a/packages/go_router_builder/test_inputs/bad_path_pattern.dart.expect +++ b/packages/go_router_builder/test_inputs/bad_path_pattern.dart.expect @@ -1 +1 @@ -Could not find a field for the path parameter "id". \ No newline at end of file +Could not find a field for the path parameter "id". diff --git a/packages/go_router_builder/test_inputs/default_value.dart.expect b/packages/go_router_builder/test_inputs/default_value.dart.expect index 9c1d1b4f324..9d9d5e8ec83 100644 --- a/packages/go_router_builder/test_inputs/default_value.dart.expect +++ b/packages/go_router_builder/test_inputs/default_value.dart.expect @@ -34,4 +34,4 @@ T? _$convertMapValue( ) { final value = map[key]; return value == null ? null : converter(value); -} \ No newline at end of file +} diff --git a/packages/go_router_builder/test_inputs/enum_parameter.dart.expect b/packages/go_router_builder/test_inputs/enum_parameter.dart.expect index f8320ea4b4e..c169e2a790f 100644 --- a/packages/go_router_builder/test_inputs/enum_parameter.dart.expect +++ b/packages/go_router_builder/test_inputs/enum_parameter.dart.expect @@ -31,4 +31,4 @@ const _$EnumTestEnumMap = { extension on Map { T? _$fromName(String value) => entries.where((element) => element.value == value).firstOrNull?.key; -} \ No newline at end of file +} diff --git a/packages/go_router_builder/test_inputs/extra_value.dart.expect b/packages/go_router_builder/test_inputs/extra_value.dart.expect index 2c49af7adff..fccced1ce01 100644 --- a/packages/go_router_builder/test_inputs/extra_value.dart.expect +++ b/packages/go_router_builder/test_inputs/extra_value.dart.expect @@ -37,4 +37,4 @@ T? _$convertMapValue( ) { final value = map[key]; return value == null ? null : converter(value); -} \ No newline at end of file +} diff --git a/packages/go_router_builder/test_inputs/iterable_with_default_value.dart.expect b/packages/go_router_builder/test_inputs/iterable_with_default_value.dart.expect index 30472c469c5..5c276dc7f15 100644 --- a/packages/go_router_builder/test_inputs/iterable_with_default_value.dart.expect +++ b/packages/go_router_builder/test_inputs/iterable_with_default_value.dart.expect @@ -29,4 +29,4 @@ extension $IterableDefaultValueRouteExtension on IterableDefaultValueRoute { context.pushReplacement(location); void replace(BuildContext context) => context.replace(location); -} \ No newline at end of file +} diff --git a/packages/go_router_builder/test_inputs/iterable_with_enum.dart.expect b/packages/go_router_builder/test_inputs/iterable_with_enum.dart.expect index 3e52cad9e9a..f2eb0851479 100644 --- a/packages/go_router_builder/test_inputs/iterable_with_enum.dart.expect +++ b/packages/go_router_builder/test_inputs/iterable_with_enum.dart.expect @@ -41,4 +41,4 @@ const _$EnumOnlyUsedInIterableEnumMap = { extension on Map { T? _$fromName(String value) => entries.where((element) => element.value == value).firstOrNull?.key; -} \ No newline at end of file +} diff --git a/packages/go_router_builder/test_inputs/list.dart.expect b/packages/go_router_builder/test_inputs/list.dart.expect index d5e4e9a7129..736a625dbb0 100644 --- a/packages/go_router_builder/test_inputs/list.dart.expect +++ b/packages/go_router_builder/test_inputs/list.dart.expect @@ -48,4 +48,4 @@ extension $ListRouteExtension on ListRoute { context.pushReplacement(location); void replace(BuildContext context) => context.replace(location); -} \ No newline at end of file +} diff --git a/packages/go_router_builder/test_inputs/missing_type_annotation.dart.expect b/packages/go_router_builder/test_inputs/missing_type_annotation.dart.expect index 66a8f6c9291..d82af829f66 100644 --- a/packages/go_router_builder/test_inputs/missing_type_annotation.dart.expect +++ b/packages/go_router_builder/test_inputs/missing_type_annotation.dart.expect @@ -1 +1 @@ -The @TypedGoRoute annotation must have a type parameter that matches the annotated element. \ No newline at end of file +The @TypedGoRoute annotation must have a type parameter that matches the annotated element. diff --git a/packages/go_router_builder/test_inputs/named_escaped_route.dart.expect b/packages/go_router_builder/test_inputs/named_escaped_route.dart.expect index 11cfb88d794..e4d75ec8163 100644 --- a/packages/go_router_builder/test_inputs/named_escaped_route.dart.expect +++ b/packages/go_router_builder/test_inputs/named_escaped_route.dart.expect @@ -20,4 +20,4 @@ extension $NamedEscapedRouteExtension on NamedEscapedRoute { context.pushReplacement(location); void replace(BuildContext context) => context.replace(location); -} \ No newline at end of file +} diff --git a/packages/go_router_builder/test_inputs/named_route.dart.expect b/packages/go_router_builder/test_inputs/named_route.dart.expect index caf08d36886..9d4b705530c 100644 --- a/packages/go_router_builder/test_inputs/named_route.dart.expect +++ b/packages/go_router_builder/test_inputs/named_route.dart.expect @@ -19,4 +19,4 @@ extension $NamedRouteExtension on NamedRoute { context.pushReplacement(location); void replace(BuildContext context) => context.replace(location); -} \ No newline at end of file +} diff --git a/packages/go_router_builder/test_inputs/nullable_default_value.dart.expect b/packages/go_router_builder/test_inputs/nullable_default_value.dart.expect index d3ff3c34a84..46215c7a4b9 100644 --- a/packages/go_router_builder/test_inputs/nullable_default_value.dart.expect +++ b/packages/go_router_builder/test_inputs/nullable_default_value.dart.expect @@ -1 +1 @@ -Default value used with a nullable type. Only non-nullable type can have a default value. \ No newline at end of file +Default value used with a nullable type. Only non-nullable type can have a default value. diff --git a/packages/go_router_builder/test_inputs/required_extra_value.dart.expect b/packages/go_router_builder/test_inputs/required_extra_value.dart.expect index 83596274861..108cb124458 100644 --- a/packages/go_router_builder/test_inputs/required_extra_value.dart.expect +++ b/packages/go_router_builder/test_inputs/required_extra_value.dart.expect @@ -23,4 +23,4 @@ extension $RequiredExtraValueRouteExtension on RequiredExtraValueRoute { void replace(BuildContext context) => context.replace(location, extra: $extra); -} \ No newline at end of file +} diff --git a/packages/go_router_builder/test_inputs/required_nullable_type_arguments_extra_value.dart.expect b/packages/go_router_builder/test_inputs/required_nullable_type_arguments_extra_value.dart.expect index 246debc7857..9877d353f4d 100644 --- a/packages/go_router_builder/test_inputs/required_nullable_type_arguments_extra_value.dart.expect +++ b/packages/go_router_builder/test_inputs/required_nullable_type_arguments_extra_value.dart.expect @@ -27,4 +27,4 @@ extension $RequiredNullableTypeArgumentsExtraValueRouteExtension void replace(BuildContext context) => context.replace(location, extra: $extra); -} \ No newline at end of file +} diff --git a/packages/go_router_builder/test_inputs/required_parameters_in_path_cannnot_be_null.dart.expect b/packages/go_router_builder/test_inputs/required_parameters_in_path_cannnot_be_null.dart.expect index 92c0cc835dc..933e5310dfd 100644 --- a/packages/go_router_builder/test_inputs/required_parameters_in_path_cannnot_be_null.dart.expect +++ b/packages/go_router_builder/test_inputs/required_parameters_in_path_cannnot_be_null.dart.expect @@ -1 +1 @@ -Required parameters in the path cannot be nullable. \ No newline at end of file +Required parameters in the path cannot be nullable. diff --git a/packages/go_router_builder/test_inputs/required_parameters_not_in_path_can_be_null.dart.expect b/packages/go_router_builder/test_inputs/required_parameters_not_in_path_can_be_null.dart.expect index edb2cbe29b9..26ab06e90c2 100644 --- a/packages/go_router_builder/test_inputs/required_parameters_not_in_path_can_be_null.dart.expect +++ b/packages/go_router_builder/test_inputs/required_parameters_not_in_path_can_be_null.dart.expect @@ -34,4 +34,4 @@ T? _$convertMapValue( ) { final value = map[key]; return value == null ? null : converter(value); -} \ No newline at end of file +} diff --git a/packages/go_router_builder/test_inputs/required_query_parameter.dart.expect b/packages/go_router_builder/test_inputs/required_query_parameter.dart.expect index 1853fdfa44c..8f021a85cbc 100644 --- a/packages/go_router_builder/test_inputs/required_query_parameter.dart.expect +++ b/packages/go_router_builder/test_inputs/required_query_parameter.dart.expect @@ -25,4 +25,4 @@ extension $NonNullableRequiredParamNotInPathExtension context.pushReplacement(location); void replace(BuildContext context) => context.replace(location); -} \ No newline at end of file +} diff --git a/packages/go_router_builder/test_inputs/set.dart.expect b/packages/go_router_builder/test_inputs/set.dart.expect index e3eb6e753b6..616150d0cb6 100644 --- a/packages/go_router_builder/test_inputs/set.dart.expect +++ b/packages/go_router_builder/test_inputs/set.dart.expect @@ -48,4 +48,4 @@ extension $SetRouteExtension on SetRoute { context.pushReplacement(location); void replace(BuildContext context) => context.replace(location); -} \ No newline at end of file +} diff --git a/packages/go_router_builder/test_inputs/shell_route_data.dart.expect b/packages/go_router_builder/test_inputs/shell_route_data.dart.expect index a5778302090..106211100ed 100644 --- a/packages/go_router_builder/test_inputs/shell_route_data.dart.expect +++ b/packages/go_router_builder/test_inputs/shell_route_data.dart.expect @@ -27,4 +27,4 @@ extension $ShellRouteWithRestorationScopeIdExtension on ShellRouteWithRestorationScopeId { static ShellRouteWithRestorationScopeId _fromState(GoRouterState state) => const ShellRouteWithRestorationScopeId(); -} \ No newline at end of file +} diff --git a/packages/go_router_builder/test_inputs/shell_route_data_without_unnamed_constructor.dart.expect b/packages/go_router_builder/test_inputs/shell_route_data_without_unnamed_constructor.dart.expect index c6ce3388d0d..c3d6e57e861 100644 --- a/packages/go_router_builder/test_inputs/shell_route_data_without_unnamed_constructor.dart.expect +++ b/packages/go_router_builder/test_inputs/shell_route_data_without_unnamed_constructor.dart.expect @@ -1 +1 @@ -The ShellRouteData "ShellRouteWithoutUnnamedConstructor" class must have an unnamed constructor. \ No newline at end of file +The ShellRouteData "ShellRouteWithoutUnnamedConstructor" class must have an unnamed constructor. diff --git a/packages/go_router_builder/test_inputs/statefull_shell_branch_data.dart.expect b/packages/go_router_builder/test_inputs/statefull_shell_branch_data.dart.expect index a1c77bf4c55..9a47d03deff 100644 --- a/packages/go_router_builder/test_inputs/statefull_shell_branch_data.dart.expect +++ b/packages/go_router_builder/test_inputs/statefull_shell_branch_data.dart.expect @@ -1,3 +1,4 @@ RouteBase get $shellRouteBranchData => StatefulShellBranchData.$branch( initialLocation: ShellRouteBranchData.$initialLocation, - ); \ No newline at end of file + ); + \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/statefull_shell_branch_with_observers_data.dart.expect b/packages/go_router_builder/test_inputs/statefull_shell_branch_with_observers_data.dart.expect index e65a88b4efc..c7dc5242942 100644 --- a/packages/go_router_builder/test_inputs/statefull_shell_branch_with_observers_data.dart.expect +++ b/packages/go_router_builder/test_inputs/statefull_shell_branch_with_observers_data.dart.expect @@ -2,4 +2,5 @@ RouteBase get $statefulShellBranchWithObserversData => StatefulShellBranchData.$branch( initialLocation: StatefulShellBranchWithObserversData.$initialLocation, observers: StatefulShellBranchWithObserversData.$observers, - ); \ No newline at end of file + ); + \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/unsupported_type.dart.expect b/packages/go_router_builder/test_inputs/unsupported_type.dart.expect index 6f005b338dc..c53b98f0b5a 100644 --- a/packages/go_router_builder/test_inputs/unsupported_type.dart.expect +++ b/packages/go_router_builder/test_inputs/unsupported_type.dart.expect @@ -1 +1 @@ -The parameter type `Stopwatch` is not supported. \ No newline at end of file +The parameter type `Stopwatch` is not supported. diff --git a/packages/go_router_builder/test_inputs/wrong_class_type.dart.expect b/packages/go_router_builder/test_inputs/wrong_class_type.dart.expect index d445b86664a..50c40bd6c5f 100644 --- a/packages/go_router_builder/test_inputs/wrong_class_type.dart.expect +++ b/packages/go_router_builder/test_inputs/wrong_class_type.dart.expect @@ -1 +1 @@ -The @TypedGoRoute annotation can only be applied to classes that extend or implement `GoRouteData`. \ No newline at end of file +The @TypedGoRoute annotation can only be applied to classes that extend or implement `GoRouteData`. From 2cf2f91c498fafa36dcd7d125f60029b17f1dc4a Mon Sep 17 00:00:00 2001 From: CaoGiaHieu-dev Date: Sat, 11 Jan 2025 12:52:49 +0700 Subject: [PATCH 10/15] update --- .../test_inputs/statefull_shell_branch_data.dart.expect | 1 - .../statefull_shell_branch_with_observers_data.dart.expect | 1 - 2 files changed, 2 deletions(-) diff --git a/packages/go_router_builder/test_inputs/statefull_shell_branch_data.dart.expect b/packages/go_router_builder/test_inputs/statefull_shell_branch_data.dart.expect index 9a47d03deff..07b95b1deeb 100644 --- a/packages/go_router_builder/test_inputs/statefull_shell_branch_data.dart.expect +++ b/packages/go_router_builder/test_inputs/statefull_shell_branch_data.dart.expect @@ -1,4 +1,3 @@ RouteBase get $shellRouteBranchData => StatefulShellBranchData.$branch( initialLocation: ShellRouteBranchData.$initialLocation, ); - \ No newline at end of file diff --git a/packages/go_router_builder/test_inputs/statefull_shell_branch_with_observers_data.dart.expect b/packages/go_router_builder/test_inputs/statefull_shell_branch_with_observers_data.dart.expect index c7dc5242942..d851a3f1ffb 100644 --- a/packages/go_router_builder/test_inputs/statefull_shell_branch_with_observers_data.dart.expect +++ b/packages/go_router_builder/test_inputs/statefull_shell_branch_with_observers_data.dart.expect @@ -3,4 +3,3 @@ RouteBase get $statefulShellBranchWithObserversData => initialLocation: StatefulShellBranchWithObserversData.$initialLocation, observers: StatefulShellBranchWithObserversData.$observers, ); - \ No newline at end of file From 61a97c89cf845d41620e2ce9428113755f1d6ae2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cao=20Gia=20Hie=CC=82=CC=81u?= Date: Mon, 10 Feb 2025 08:02:11 +0700 Subject: [PATCH 11/15] fix comment --- .../example/lib/all_types.g.dart | 29 +++++++++---------- .../go_router_builder/example/lib/main.g.dart | 9 +++--- .../example/lib/readme_excerpts.g.dart | 2 +- .../lib/shell_route_with_keys_example.g.dart | 2 +- .../shell_route_with_observers_example.g.dart | 2 +- ...hell_route_initial_location_example.g.dart | 2 +- .../lib/src/type_helpers.dart | 2 +- .../test_inputs/enum_parameter.dart.expect | 2 +- 8 files changed, 23 insertions(+), 27 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 5d2442cd677..6f371fed296 100644 --- a/packages/go_router_builder/example/lib/all_types.g.dart +++ b/packages/go_router_builder/example/lib/all_types.g.dart @@ -91,8 +91,8 @@ extension $AllTypesBaseRouteExtension on AllTypesBaseRoute { extension $BigIntRouteExtension on BigIntRoute { static BigIntRoute _fromState(GoRouterState state) => BigIntRoute( - requiredBigIntField: BigInt.parse( - state.pathParameters['requiredBigIntField']!.toString())!, + requiredBigIntField: + BigInt.parse(state.pathParameters['requiredBigIntField']!)!, bigIntField: _$convertMapValue( 'big-int-field', state.uri.queryParameters, BigInt.tryParse), ); @@ -116,8 +116,8 @@ extension $BigIntRouteExtension on BigIntRoute { extension $BoolRouteExtension on BoolRoute { static BoolRoute _fromState(GoRouterState state) => BoolRoute( - requiredBoolField: _$boolConverter( - state.pathParameters['requiredBoolField']!.toString())!, + requiredBoolField: + _$boolConverter(state.pathParameters['requiredBoolField']!)!, boolField: _$convertMapValue( 'bool-field', state.uri.queryParameters, _$boolConverter), boolFieldWithDefaultValue: _$convertMapValue( @@ -149,8 +149,8 @@ extension $BoolRouteExtension on BoolRoute { extension $DateTimeRouteExtension on DateTimeRoute { static DateTimeRoute _fromState(GoRouterState state) => DateTimeRoute( - requiredDateTimeField: DateTime.parse( - state.pathParameters['requiredDateTimeField']!.toString())!, + requiredDateTimeField: + DateTime.parse(state.pathParameters['requiredDateTimeField']!)!, dateTimeField: _$convertMapValue( 'date-time-field', state.uri.queryParameters, DateTime.tryParse), ); @@ -175,8 +175,8 @@ extension $DateTimeRouteExtension on DateTimeRoute { extension $DoubleRouteExtension on DoubleRoute { static DoubleRoute _fromState(GoRouterState state) => DoubleRoute( - requiredDoubleField: double.parse( - state.pathParameters['requiredDoubleField']!.toString())!, + requiredDoubleField: + double.parse(state.pathParameters['requiredDoubleField']!)!, doubleField: _$convertMapValue( 'double-field', state.uri.queryParameters, double.tryParse), doubleFieldWithDefaultValue: _$convertMapValue( @@ -208,8 +208,7 @@ extension $DoubleRouteExtension on DoubleRoute { extension $IntRouteExtension on IntRoute { static IntRoute _fromState(GoRouterState state) => IntRoute( - requiredIntField: - int.parse(state.pathParameters['requiredIntField']!.toString())!, + requiredIntField: int.parse(state.pathParameters['requiredIntField']!)!, intField: _$convertMapValue( 'int-field', state.uri.queryParameters, int.tryParse), intFieldWithDefaultValue: _$convertMapValue( @@ -240,8 +239,7 @@ extension $IntRouteExtension on IntRoute { extension $NumRouteExtension on NumRoute { static NumRoute _fromState(GoRouterState state) => NumRoute( - requiredNumField: - num.parse(state.pathParameters['requiredNumField']!.toString())!, + requiredNumField: num.parse(state.pathParameters['requiredNumField']!)!, numField: _$convertMapValue( 'num-field', state.uri.queryParameters, num.tryParse), numFieldWithDefaultValue: _$convertMapValue( @@ -273,7 +271,7 @@ extension $NumRouteExtension on NumRoute { extension $EnumRouteExtension on EnumRoute { static EnumRoute _fromState(GoRouterState state) => EnumRoute( requiredEnumField: _$PersonDetailsEnumMap - ._$fromName(state.pathParameters['requiredEnumField']!.toString())!, + ._$fromName(state.pathParameters['requiredEnumField']!)!, enumField: _$convertMapValue('enum-field', state.uri.queryParameters, _$PersonDetailsEnumMap._$fromName), enumFieldWithDefaultValue: _$convertMapValue( @@ -313,7 +311,7 @@ const _$PersonDetailsEnumMap = { extension $EnhancedEnumRouteExtension on EnhancedEnumRoute { static EnhancedEnumRoute _fromState(GoRouterState state) => EnhancedEnumRoute( requiredEnumField: _$SportDetailsEnumMap - ._$fromName(state.pathParameters['requiredEnumField']!.toString())!, + ._$fromName(state.pathParameters['requiredEnumField']!)!, enumField: _$convertMapValue('enum-field', state.uri.queryParameters, _$SportDetailsEnumMap._$fromName), enumFieldWithDefaultValue: _$convertMapValue( @@ -381,8 +379,7 @@ extension $StringRouteExtension on StringRoute { extension $UriRouteExtension on UriRoute { static UriRoute _fromState(GoRouterState state) => UriRoute( - requiredUriField: - Uri.parse(state.pathParameters['requiredUriField']!.toString())!, + requiredUriField: Uri.parse(state.pathParameters['requiredUriField']!)!, uriField: _$convertMapValue( 'uri-field', state.uri.queryParameters, Uri.tryParse), ); diff --git a/packages/go_router_builder/example/lib/main.g.dart b/packages/go_router_builder/example/lib/main.g.dart index 4301e41ebea..e489f48ad7d 100644 --- a/packages/go_router_builder/example/lib/main.g.dart +++ b/packages/go_router_builder/example/lib/main.g.dart @@ -79,7 +79,7 @@ extension $FamilyRouteExtension on FamilyRoute { extension $PersonRouteExtension on PersonRoute { static PersonRoute _fromState(GoRouterState state) => PersonRoute( state.pathParameters['fid']!, - int.parse(state.pathParameters['pid']!.toString())!, + int.parse(state.pathParameters['pid']!)!, ); String get location => GoRouteData.$location( @@ -100,9 +100,8 @@ extension $PersonDetailsRouteExtension on PersonDetailsRoute { static PersonDetailsRoute _fromState(GoRouterState state) => PersonDetailsRoute( state.pathParameters['fid']!, - int.parse(state.pathParameters['pid']!.toString())!, - _$PersonDetailsEnumMap - ._$fromName(state.pathParameters['details']!.toString())!, + int.parse(state.pathParameters['pid']!)!, + _$PersonDetailsEnumMap._$fromName(state.pathParameters['details']!)!, $extra: state.extra as int?, ); @@ -130,7 +129,7 @@ const _$PersonDetailsEnumMap = { extension $FamilyCountRouteExtension on FamilyCountRoute { static FamilyCountRoute _fromState(GoRouterState state) => FamilyCountRoute( - int.parse(state.pathParameters['count']!.toString())!, + int.parse(state.pathParameters['count']!)!, ); String get location => GoRouteData.$location( diff --git a/packages/go_router_builder/example/lib/readme_excerpts.g.dart b/packages/go_router_builder/example/lib/readme_excerpts.g.dart index db7577b38f3..8a26a6ac0fc 100644 --- a/packages/go_router_builder/example/lib/readme_excerpts.g.dart +++ b/packages/go_router_builder/example/lib/readme_excerpts.g.dart @@ -154,7 +154,7 @@ RouteBase get $hotdogRouteWithEverything => GoRouteData.$route( extension $HotdogRouteWithEverythingExtension on HotdogRouteWithEverything { static HotdogRouteWithEverything _fromState(GoRouterState state) => HotdogRouteWithEverything( - _$boolConverter(state.pathParameters['ketchup']!.toString())!, + _$boolConverter(state.pathParameters['ketchup']!)!, state.uri.queryParameters['mustard'], state.extra as Sauce, ); diff --git a/packages/go_router_builder/example/lib/shell_route_with_keys_example.g.dart b/packages/go_router_builder/example/lib/shell_route_with_keys_example.g.dart index f055dfb8be9..4a4cb4ff9a2 100644 --- a/packages/go_router_builder/example/lib/shell_route_with_keys_example.g.dart +++ b/packages/go_router_builder/example/lib/shell_route_with_keys_example.g.dart @@ -76,7 +76,7 @@ extension $UsersRouteDataExtension on UsersRouteData { extension $UserRouteDataExtension on UserRouteData { static UserRouteData _fromState(GoRouterState state) => UserRouteData( - id: int.parse(state.pathParameters['id']!.toString())!, + id: int.parse(state.pathParameters['id']!)!, ); String get location => GoRouteData.$location( diff --git a/packages/go_router_builder/example/lib/shell_route_with_observers_example.g.dart b/packages/go_router_builder/example/lib/shell_route_with_observers_example.g.dart index 46f2cf1b04c..52d3c58f1cb 100644 --- a/packages/go_router_builder/example/lib/shell_route_with_observers_example.g.dart +++ b/packages/go_router_builder/example/lib/shell_route_with_observers_example.g.dart @@ -75,7 +75,7 @@ extension $UsersRouteDataExtension on UsersRouteData { extension $UserRouteDataExtension on UserRouteData { static UserRouteData _fromState(GoRouterState state) => UserRouteData( - id: int.parse(state.pathParameters['id']!.toString())!, + id: int.parse(state.pathParameters['id']!)!, ); String get location => GoRouteData.$location( diff --git a/packages/go_router_builder/example/lib/stateful_shell_route_initial_location_example.g.dart b/packages/go_router_builder/example/lib/stateful_shell_route_initial_location_example.g.dart index fa2581be3d9..11aa3efae3c 100644 --- a/packages/go_router_builder/example/lib/stateful_shell_route_initial_location_example.g.dart +++ b/packages/go_router_builder/example/lib/stateful_shell_route_initial_location_example.g.dart @@ -69,7 +69,7 @@ extension $NotificationsRouteDataExtension on NotificationsRouteData { static NotificationsRouteData _fromState(GoRouterState state) => NotificationsRouteData( section: _$NotificationsPageSectionEnumMap - ._$fromName(state.pathParameters['section']!.toString())!, + ._$fromName(state.pathParameters['section']!)!, ); String get location => GoRouteData.$location( diff --git a/packages/go_router_builder/lib/src/type_helpers.dart b/packages/go_router_builder/lib/src/type_helpers.dart index 37f68b03d1d..2f3dddc3a37 100644 --- a/packages/go_router_builder/lib/src/type_helpers.dart +++ b/packages/go_router_builder/lib/src/type_helpers.dart @@ -389,7 +389,7 @@ abstract class _TypeHelperWithHelper extends _TypeHelper { '${helperName(paramType)})'; } return '${helperName(paramType)}' - '(state.${_stateValueAccess(parameterElement, pathParameters)}.toString())!'; + '(state.${_stateValueAccess(parameterElement, pathParameters)} ${!parameterElement.isRequired ? " ?? '' " : ''})!'; } } diff --git a/packages/go_router_builder/test_inputs/enum_parameter.dart.expect b/packages/go_router_builder/test_inputs/enum_parameter.dart.expect index c169e2a790f..2ac9799b5a0 100644 --- a/packages/go_router_builder/test_inputs/enum_parameter.dart.expect +++ b/packages/go_router_builder/test_inputs/enum_parameter.dart.expect @@ -5,7 +5,7 @@ RouteBase get $enumParam => GoRouteData.$route( extension $EnumParamExtension on EnumParam { static EnumParam _fromState(GoRouterState state) => EnumParam( - y: _$EnumTestEnumMap._$fromName(state.pathParameters['y']!.toString())!, + y: _$EnumTestEnumMap._$fromName(state.pathParameters['y'] ?? '')!, ); String get location => GoRouteData.$location( From c93256bfa1f11152536fb726171d146f26f44b8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cao=20Gia=20Hie=CC=82=CC=81u?= Date: Mon, 10 Feb 2025 08:20:49 +0700 Subject: [PATCH 12/15] update .expect --- .../go_router_builder/test_inputs/enum_parameter.dart.expect | 2 +- .../test_inputs/required_query_parameter.dart.expect | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/go_router_builder/test_inputs/enum_parameter.dart.expect b/packages/go_router_builder/test_inputs/enum_parameter.dart.expect index 2ac9799b5a0..97c63224b35 100644 --- a/packages/go_router_builder/test_inputs/enum_parameter.dart.expect +++ b/packages/go_router_builder/test_inputs/enum_parameter.dart.expect @@ -5,7 +5,7 @@ RouteBase get $enumParam => GoRouteData.$route( extension $EnumParamExtension on EnumParam { static EnumParam _fromState(GoRouterState state) => EnumParam( - y: _$EnumTestEnumMap._$fromName(state.pathParameters['y'] ?? '')!, + y: _$EnumTestEnumMap._$fromName(state.pathParameters['y']!)!, ); String get location => GoRouteData.$location( diff --git a/packages/go_router_builder/test_inputs/required_query_parameter.dart.expect b/packages/go_router_builder/test_inputs/required_query_parameter.dart.expect index 8f021a85cbc..1b62bee0e52 100644 --- a/packages/go_router_builder/test_inputs/required_query_parameter.dart.expect +++ b/packages/go_router_builder/test_inputs/required_query_parameter.dart.expect @@ -7,7 +7,7 @@ extension $NonNullableRequiredParamNotInPathExtension on NonNullableRequiredParamNotInPath { static NonNullableRequiredParamNotInPath _fromState(GoRouterState state) => NonNullableRequiredParamNotInPath( - id: int.parse(state.uri.queryParameters['id'].toString())!, + id: int.parse(state.uri.queryParameters['id'])!, ); String get location => GoRouteData.$location( From c21b6d5c646c16a62e242276f30e9f3e7e4661bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cao=20Gia=20Hie=CC=82=CC=81u?= Date: Thu, 20 Feb 2025 11:25:31 +0700 Subject: [PATCH 13/15] remove unnecessary ?. chainning --- .../example/lib/all_types.g.dart | 81 +++++++------------ .../lib/src/type_helpers.dart | 2 +- .../iterable_with_default_value.dart.expect | 3 +- .../iterable_with_enum.dart.expect | 3 +- .../test_inputs/list.dart.expect | 9 +-- .../test_inputs/set.dart.expect | 9 +-- 6 files changed, 36 insertions(+), 71 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 3e9c53ac5ae..a30f03f62c6 100644 --- a/packages/go_router_builder/example/lib/all_types.g.dart +++ b/packages/go_router_builder/example/lib/all_types.g.dart @@ -405,93 +405,78 @@ extension $IterableRouteExtension on IterableRoute { static IterableRoute _fromState(GoRouterState state) => IterableRoute( intIterableField: (state.uri.queryParametersAll['int-iterable-field'] ?.map(int.parse) - ?.where((e) => e != null) - ?.cast() as Iterable?), + .cast() as Iterable?), doubleIterableField: (state .uri.queryParametersAll['double-iterable-field'] ?.map(double.parse) - ?.where((e) => e != null) - ?.cast() as Iterable?), + .cast() as Iterable?), stringIterableField: (state .uri.queryParametersAll['string-iterable-field'] ?.map((e) => e)), boolIterableField: (state.uri.queryParametersAll['bool-iterable-field'] ?.map(_$boolConverter) - ?.where((e) => e != null) - ?.cast() as Iterable?), + .cast() as Iterable?), enumIterableField: (state.uri.queryParametersAll['enum-iterable-field'] ?.map(_$SportDetailsEnumMap._$fromName) - ?.where((e) => e != null) - ?.cast() as Iterable?), + .cast() as Iterable?), enumOnlyInIterableField: (state .uri.queryParametersAll['enum-only-in-iterable-field'] ?.map(_$CookingRecipeEnumMap._$fromName) - ?.where((e) => e != null) - ?.cast() as Iterable?), + .cast() as Iterable?), intListField: (state.uri.queryParametersAll['int-list-field'] ?.map(int.parse) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toList() as List?) ?.toList(), doubleListField: (state.uri.queryParametersAll['double-list-field'] ?.map(double.parse) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toList() as List?) ?.toList(), stringListField: (state.uri.queryParametersAll['string-list-field'] ?.map((e) => e))?.toList(), boolListField: (state.uri.queryParametersAll['bool-list-field'] ?.map(_$boolConverter) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toList() as List?) ?.toList(), enumListField: (state.uri.queryParametersAll['enum-list-field'] ?.map(_$SportDetailsEnumMap._$fromName) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toList() as List?) ?.toList(), enumOnlyInListField: (state .uri.queryParametersAll['enum-only-in-list-field'] ?.map(_$CookingRecipeEnumMap._$fromName) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toList() as List?) ?.toList(), intSetField: (state.uri.queryParametersAll['int-set-field'] ?.map(int.parse) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toSet() as Set?) ?.toSet(), doubleSetField: (state.uri.queryParametersAll['double-set-field'] ?.map(double.parse) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toSet() as Set?) ?.toSet(), stringSetField: (state.uri.queryParametersAll['string-set-field'] ?.map((e) => e))?.toSet(), boolSetField: (state.uri.queryParametersAll['bool-set-field'] ?.map(_$boolConverter) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toSet() as Set?) ?.toSet(), enumSetField: (state.uri.queryParametersAll['enum-set-field'] ?.map(_$SportDetailsEnumMap._$fromName) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toSet() as Set?) ?.toSet(), enumOnlyInSetField: (state .uri.queryParametersAll['enum-only-in-set-field'] ?.map(_$CookingRecipeEnumMap._$fromName) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toSet() as Set?) ?.toSet(), ); @@ -576,14 +561,12 @@ extension $IterableRouteWithDefaultValuesExtension IterableRouteWithDefaultValues( intIterableField: (state.uri.queryParametersAll['int-iterable-field'] ?.map(int.parse) - ?.where((e) => e != null) - ?.cast() as Iterable?) ?? + .cast() as Iterable?) ?? const [0], doubleIterableField: (state .uri.queryParametersAll['double-iterable-field'] ?.map(double.parse) - ?.where((e) => e != null) - ?.cast() as Iterable?) ?? + .cast() as Iterable?) ?? const [0, 1, 2], stringIterableField: (state .uri.queryParametersAll['string-iterable-field'] @@ -591,25 +574,21 @@ extension $IterableRouteWithDefaultValuesExtension const ['defaultValue'], boolIterableField: (state.uri.queryParametersAll['bool-iterable-field'] ?.map(_$boolConverter) - ?.where((e) => e != null) - ?.cast() as Iterable?) ?? + .cast() as Iterable?) ?? const [false], enumIterableField: (state.uri.queryParametersAll['enum-iterable-field'] ?.map(_$SportDetailsEnumMap._$fromName) - ?.where((e) => e != null) - ?.cast() as Iterable?) ?? + .cast() as Iterable?) ?? const [SportDetails.tennis, SportDetails.hockey], intListField: (state.uri.queryParametersAll['int-list-field'] ?.map(int.parse) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toList() as List?) ?.toList() ?? const [0], doubleListField: (state.uri.queryParametersAll['double-list-field'] ?.map(double.parse) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toList() as List?) ?.toList() ?? const [1, 2, 3], @@ -618,29 +597,25 @@ extension $IterableRouteWithDefaultValuesExtension const ['defaultValue0', 'defaultValue1'], boolListField: (state.uri.queryParametersAll['bool-list-field'] ?.map(_$boolConverter) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toList() as List?) ?.toList() ?? const [true], enumListField: (state.uri.queryParametersAll['enum-list-field'] ?.map(_$SportDetailsEnumMap._$fromName) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toList() as List?) ?.toList() ?? const [SportDetails.football], intSetField: (state.uri.queryParametersAll['int-set-field'] ?.map(int.parse) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toSet() as Set?) ?.toSet() ?? const {0, 1}, doubleSetField: (state.uri.queryParametersAll['double-set-field'] ?.map(double.parse) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toSet() as Set?) ?.toSet() ?? const {}, @@ -649,15 +624,13 @@ extension $IterableRouteWithDefaultValuesExtension const {'defaultValue'}, boolSetField: (state.uri.queryParametersAll['bool-set-field'] ?.map(_$boolConverter) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toSet() as Set?) ?.toSet() ?? const {true, false}, enumSetField: (state.uri.queryParametersAll['enum-set-field'] ?.map(_$SportDetailsEnumMap._$fromName) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toSet() as Set?) ?.toSet() ?? const {SportDetails.hockey}, diff --git a/packages/go_router_builder/lib/src/type_helpers.dart b/packages/go_router_builder/lib/src/type_helpers.dart index 81bf71a3c9d..6a13c146930 100644 --- a/packages/go_router_builder/lib/src/type_helpers.dart +++ b/packages/go_router_builder/lib/src/type_helpers.dart @@ -333,7 +333,7 @@ class _TypeHelperIterable extends _TypeHelperWithHelper { formatIterableType = '?.toSet()'; } convertToNotNull = - '?.where((e) => e != null)?.cast<$iterableType>()$formatIterableType$asParameterType'; + '.cast<$iterableType>()$formatIterableType$asParameterType'; } entriesTypeDecoder = helper.helperName(iterableType); } diff --git a/packages/go_router_builder/test_inputs/iterable_with_default_value.dart.expect b/packages/go_router_builder/test_inputs/iterable_with_default_value.dart.expect index 8a1597f5818..683a64ec7ca 100644 --- a/packages/go_router_builder/test_inputs/iterable_with_default_value.dart.expect +++ b/packages/go_router_builder/test_inputs/iterable_with_default_value.dart.expect @@ -8,8 +8,7 @@ extension $IterableDefaultValueRouteExtension on IterableDefaultValueRoute { IterableDefaultValueRoute( param: (state.uri.queryParametersAll['param'] ?.map(int.parse) - ?.where((e) => e != null) - ?.cast() as Iterable?) ?? + .cast() as Iterable?) ?? const [0], ); diff --git a/packages/go_router_builder/test_inputs/iterable_with_enum.dart.expect b/packages/go_router_builder/test_inputs/iterable_with_enum.dart.expect index f2eb0851479..8d20676242f 100644 --- a/packages/go_router_builder/test_inputs/iterable_with_enum.dart.expect +++ b/packages/go_router_builder/test_inputs/iterable_with_enum.dart.expect @@ -8,8 +8,7 @@ extension $IterableWithEnumRouteExtension on IterableWithEnumRoute { IterableWithEnumRoute( param: (state.uri.queryParametersAll['param'] ?.map(_$EnumOnlyUsedInIterableEnumMap._$fromName) - ?.where((e) => e != null) - ?.cast() + .cast() as Iterable?), ); diff --git a/packages/go_router_builder/test_inputs/list.dart.expect b/packages/go_router_builder/test_inputs/list.dart.expect index a70168ca802..bd756314184 100644 --- a/packages/go_router_builder/test_inputs/list.dart.expect +++ b/packages/go_router_builder/test_inputs/list.dart.expect @@ -7,22 +7,19 @@ extension $ListRouteExtension on ListRoute { static ListRoute _fromState(GoRouterState state) => ListRoute( ids: (state.uri.queryParametersAll['ids'] ?.map(int.parse) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toList() as List) ?.toList() ?? const [], nullableIds: (state.uri.queryParametersAll['nullable-ids'] ?.map(int.parse) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toList() as List?) ?.toList(), idsWithDefaultValue: (state .uri.queryParametersAll['ids-with-default-value'] ?.map(int.parse) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toList() as List?) ?.toList() ?? const [0], diff --git a/packages/go_router_builder/test_inputs/set.dart.expect b/packages/go_router_builder/test_inputs/set.dart.expect index 0c77d721e6d..a8f577bdb00 100644 --- a/packages/go_router_builder/test_inputs/set.dart.expect +++ b/packages/go_router_builder/test_inputs/set.dart.expect @@ -7,22 +7,19 @@ extension $SetRouteExtension on SetRoute { static SetRoute _fromState(GoRouterState state) => SetRoute( ids: (state.uri.queryParametersAll['ids'] ?.map(int.parse) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toSet() as Set) ?.toSet() ?? const {}, nullableIds: (state.uri.queryParametersAll['nullable-ids'] ?.map(int.parse) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toSet() as Set?) ?.toSet(), idsWithDefaultValue: (state .uri.queryParametersAll['ids-with-default-value'] ?.map(int.parse) - ?.where((e) => e != null) - ?.cast() + .cast() ?.toSet() as Set?) ?.toSet() ?? const {0}, From b0c506d5ff16e4e8771bb7dd68bc9da11b5c670e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cao=20Gia=20Hie=CC=82=CC=81u?= Date: Thu, 20 Feb 2025 13:06:51 +0700 Subject: [PATCH 14/15] fix Uri.encodeComponent --- packages/go_router_builder/example/lib/readme_excerpts.g.dart | 2 +- packages/go_router_builder/lib/src/route_config.dart | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/go_router_builder/example/lib/readme_excerpts.g.dart b/packages/go_router_builder/example/lib/readme_excerpts.g.dart index 8a26a6ac0fc..f6719844df6 100644 --- a/packages/go_router_builder/example/lib/readme_excerpts.g.dart +++ b/packages/go_router_builder/example/lib/readme_excerpts.g.dart @@ -50,7 +50,7 @@ extension $FamilyRouteExtension on FamilyRoute { ); String get location => GoRouteData.$location( - '/family/${Uri.encodeComponent(fid)}', + '/family/${Uri.encodeComponent(fid ?? '')}', ); void go(BuildContext context) => context.go(location); diff --git a/packages/go_router_builder/lib/src/route_config.dart b/packages/go_router_builder/lib/src/route_config.dart index 0a925c47559..d272335db28 100644 --- a/packages/go_router_builder/lib/src/route_config.dart +++ b/packages/go_router_builder/lib/src/route_config.dart @@ -231,8 +231,9 @@ class GoRouteConfig extends RouteBaseConfig { // Enum types are encoded using a map, so we need a nullability check // here to ensure it matches Uri.encodeComponent nullability final DartType? type = _field(pathParameter)?.returnType; + final String value = - '\${Uri.encodeComponent(${_encodeFor(pathParameter)}${type?.isEnum ?? false ? '!' : ''})}'; + '\${Uri.encodeComponent(${_encodeFor(pathParameter)}${(type?.isEnum ?? false) ? '!' : (type?.isNullableType ?? false) ? "?? ''" : ''})}'; return MapEntry(pathParameter, value); }), ); From ecfb872c40b8b4cd6d98833d1b8e3151487ce0ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cao=20Gia=20Hie=CC=82=CC=81u?= Date: Fri, 28 Feb 2025 09:43:20 +0700 Subject: [PATCH 15/15] allow nullable String where try parse to enum --- packages/go_router_builder/example/lib/all_types.g.dart | 2 +- packages/go_router_builder/example/lib/main.g.dart | 2 +- .../lib/stateful_shell_route_initial_location_example.g.dart | 2 +- packages/go_router_builder/lib/src/route_config.dart | 2 +- .../go_router_builder/test_inputs/enum_parameter.dart.expect | 2 +- .../test_inputs/iterable_with_enum.dart.expect | 2 +- 6 files changed, 6 insertions(+), 6 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 a30f03f62c6..581814d47c2 100644 --- a/packages/go_router_builder/example/lib/all_types.g.dart +++ b/packages/go_router_builder/example/lib/all_types.g.dart @@ -716,7 +716,7 @@ bool _$boolConverter(String value) { } extension on Map { - T? _$fromName(String value) => + T? _$fromName(String? value) => entries.where((element) => element.value == value).firstOrNull?.key; } diff --git a/packages/go_router_builder/example/lib/main.g.dart b/packages/go_router_builder/example/lib/main.g.dart index e489f48ad7d..ab4cbdb3540 100644 --- a/packages/go_router_builder/example/lib/main.g.dart +++ b/packages/go_router_builder/example/lib/main.g.dart @@ -147,7 +147,7 @@ extension $FamilyCountRouteExtension on FamilyCountRoute { } extension on Map { - T? _$fromName(String value) => + T? _$fromName(String? value) => entries.where((element) => element.value == value).firstOrNull?.key; } diff --git a/packages/go_router_builder/example/lib/stateful_shell_route_initial_location_example.g.dart b/packages/go_router_builder/example/lib/stateful_shell_route_initial_location_example.g.dart index 11aa3efae3c..f86f360772d 100644 --- a/packages/go_router_builder/example/lib/stateful_shell_route_initial_location_example.g.dart +++ b/packages/go_router_builder/example/lib/stateful_shell_route_initial_location_example.g.dart @@ -111,6 +111,6 @@ extension $OrdersRouteDataExtension on OrdersRouteData { } extension on Map { - T? _$fromName(String value) => + T? _$fromName(String? value) => entries.where((element) => element.value == value).firstOrNull?.key; } diff --git a/packages/go_router_builder/lib/src/route_config.dart b/packages/go_router_builder/lib/src/route_config.dart index d272335db28..fe60df748c3 100644 --- a/packages/go_router_builder/lib/src/route_config.dart +++ b/packages/go_router_builder/lib/src/route_config.dart @@ -775,7 +775,7 @@ bool $boolConverterHelperName(String value) { const String _enumConverterHelper = ''' extension on Map { - T? $enumExtensionHelperName(String value) => + T? $enumExtensionHelperName(String? value) => entries.where((element) => element.value == value).firstOrNull?.key; }'''; diff --git a/packages/go_router_builder/test_inputs/enum_parameter.dart.expect b/packages/go_router_builder/test_inputs/enum_parameter.dart.expect index 97c63224b35..42d27809f85 100644 --- a/packages/go_router_builder/test_inputs/enum_parameter.dart.expect +++ b/packages/go_router_builder/test_inputs/enum_parameter.dart.expect @@ -29,6 +29,6 @@ const _$EnumTestEnumMap = { }; extension on Map { - T? _$fromName(String value) => + T? _$fromName(String? value) => entries.where((element) => element.value == value).firstOrNull?.key; } diff --git a/packages/go_router_builder/test_inputs/iterable_with_enum.dart.expect b/packages/go_router_builder/test_inputs/iterable_with_enum.dart.expect index 8d20676242f..88a9f97dc27 100644 --- a/packages/go_router_builder/test_inputs/iterable_with_enum.dart.expect +++ b/packages/go_router_builder/test_inputs/iterable_with_enum.dart.expect @@ -38,6 +38,6 @@ const _$EnumOnlyUsedInIterableEnumMap = { }; extension on Map { - T? _$fromName(String value) => + T? _$fromName(String? value) => entries.where((element) => element.value == value).firstOrNull?.key; }