From 05e473753c54a56d8a4a01ddb603327781da1891 Mon Sep 17 00:00:00 2001 From: ValentinVignal Date: Mon, 6 Mar 2023 20:01:35 +0800 Subject: [PATCH 1/7] fix: Default value with iterable parameters --- .../lib/src/type_helpers.dart | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/packages/go_router_builder/lib/src/type_helpers.dart b/packages/go_router_builder/lib/src/type_helpers.dart index a0adb2ee595..70242442111 100644 --- a/packages/go_router_builder/lib/src/type_helpers.dart +++ b/packages/go_router_builder/lib/src/type_helpers.dart @@ -52,7 +52,14 @@ String decodeParameter(ParameterElement element) { final DartType paramType = element.type; for (final _TypeHelper helper in _helpers) { if (helper._matchesType(paramType)) { - return helper._decode(element); + String decoded = helper._decode(element); + if (element.isOptional && element.hasDefaultValue) { + if (element.type.isNullableType) { + throw NullableDefaultValueError(element); + } + decoded += ' ?? ${element.defaultValueCode!}'; + } + return decoded; } } @@ -95,14 +102,7 @@ String _stateValueAccess(ParameterElement element) { } if (element.isOptional) { - String value = 'queryParams[${escapeDartString(element.name.kebab)}]'; - if (element.hasDefaultValue) { - if (element.type.isNullableType) { - throw NullableDefaultValueError(element); - } - value += ' ?? ${element.defaultValueCode!}'; - } - return value; + return 'queryParams[${escapeDartString(element.name.kebab)}]'; } throw InvalidGenerationSourceError( @@ -292,6 +292,7 @@ state.queryParametersAll[${escapeDartString(parameterElement.name.kebab)}]'''; @override String _encode(String fieldName, DartType type) { + final String nullAwareAccess = type.isNullableType ? '?' : ''; if (type is ParameterizedType) { final DartType iterableType = type.typeArguments.first; @@ -300,7 +301,7 @@ state.queryParametersAll[${escapeDartString(parameterElement.name.kebab)}]'''; for (final _TypeHelper helper in _helpers) { if (helper._matchesType(iterableType)) { entriesTypeEncoder = ''' -?.map((e) => ${helper._encode('e', iterableType)}).toList()'''; +$nullAwareAccess.map((e) => ${helper._encode('e', iterableType)}).toList()'''; } } return ''' @@ -308,7 +309,7 @@ $fieldName$entriesTypeEncoder'''; } return ''' -$fieldName?.map((e) => e.toString()).toList()'''; +$fieldName$nullAwareAccess.map((e) => e.toString()).toList()'''; } @override @@ -326,14 +327,10 @@ abstract class _TypeHelperWithHelper extends _TypeHelper { final DartType paramType = parameterElement.type; if (!parameterElement.isRequired) { - String decoded = '$convertMapValueHelperName(' + return '$convertMapValueHelperName(' '${escapeDartString(parameterElement.name.kebab)}, ' 'state.queryParams, ' '${helperName(paramType)})'; - if (parameterElement.hasDefaultValue) { - decoded += ' ?? ${parameterElement.defaultValueCode!}'; - } - return decoded; } return '${helperName(paramType)}' '(state.${_stateValueAccess(parameterElement)})'; From 86f3526c914b01b1c3076a9958cc15a4b98c38ba Mon Sep 17 00:00:00 2001 From: ValentinVignal Date: Mon, 6 Mar 2023 20:01:50 +0800 Subject: [PATCH 2/7] docs: Update the example --- .../example/lib/all_types.dart | 57 +++++++++ .../example/lib/all_types.g.dart | 118 ++++++++++++++++++ .../go_router_builder/example/pubspec.yaml | 2 +- 3 files changed, 176 insertions(+), 1 deletion(-) diff --git a/packages/go_router_builder/example/lib/all_types.dart b/packages/go_router_builder/example/lib/all_types.dart index 21945d6d2df..f9fcaa4f482 100644 --- a/packages/go_router_builder/example/lib/all_types.dart +++ b/packages/go_router_builder/example/lib/all_types.dart @@ -25,6 +25,8 @@ part 'all_types.g.dart'; TypedGoRoute(path: 'string-route/:requiredStringField'), TypedGoRoute(path: 'uri-route/:requiredUriField'), TypedGoRoute(path: 'iterable-route'), + TypedGoRoute( + path: 'iterable-route-with-default-values'), ]) @immutable class AllTypesBaseRoute extends GoRouteData { @@ -342,6 +344,61 @@ class IterableRoute extends GoRouteData { ); } +class IterableRouteWithDefaultValues extends GoRouteData { + IterableRouteWithDefaultValues({ + this.intIterableField = const [0], + this.doubleIterableField = const [0, 1, 2], + this.stringIterableField = const ['defaultValue'], + this.boolIterableField = const [false], + this.enumIterableField = const [ + SportDetails.tennis, + SportDetails.hockey + ], + this.intListField = const [0], + this.doubleListField = const [1, 2, 3], + this.stringListField = const ['defaultValue0', 'defaultValue1'], + this.boolListField = const [true], + this.enumListField = const [SportDetails.football], + this.intSetField = const {0, 1}, + this.doubleSetField = const {}, + this.stringSetField = const {'defaultValue'}, + this.boolSetField = const {true, false}, + this.enumSetField = const {SportDetails.hockey}, + }); + + final Iterable intIterableField; + final List intListField; + final Set intSetField; + + final Iterable doubleIterableField; + final List doubleListField; + final Set doubleSetField; + + final Iterable stringIterableField; + final List stringListField; + final Set stringSetField; + + final Iterable boolIterableField; + final List boolListField; + final Set boolSetField; + + final Iterable enumIterableField; + final List enumListField; + final Set enumSetField; + + @override + Widget build(BuildContext context, GoRouterState state) => + const BasePage( + dataTitle: 'IterableRouteWithDefaultValues', + ); + + Widget drawerTile(BuildContext context) => ListTile( + title: const Text('IterableRouteWithDefaultValues'), + onTap: () => go(context), + selected: GoRouter.of(context).location == location, + ); +} + class BasePage extends StatelessWidget { const BasePage({ required this.dataTitle, 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 61f38b7aee9..ebf092e9a9b 100644 --- a/packages/go_router_builder/example/lib/all_types.g.dart +++ b/packages/go_router_builder/example/lib/all_types.g.dart @@ -64,6 +64,10 @@ GoRoute get $allTypesBaseRoute => GoRouteData.$route( path: 'iterable-route', factory: $IterableRouteExtension._fromState, ), + GoRouteData.$route( + path: 'iterable-route-with-default-values', + factory: $IterableRouteWithDefaultValuesExtension._fromState, + ), ], ); @@ -447,6 +451,120 @@ extension $IterableRouteExtension on IterableRoute { context.pushReplacement(location); } +extension $IterableRouteWithDefaultValuesExtension + on IterableRouteWithDefaultValues { + static IterableRouteWithDefaultValues _fromState(GoRouterState state) => + IterableRouteWithDefaultValues( + intIterableField: + state.queryParametersAll['int-iterable-field']?.map(int.parse) ?? + const [0], + doubleIterableField: state.queryParametersAll['double-iterable-field'] + ?.map(double.parse) ?? + const [0, 1, 2], + stringIterableField: + state.queryParametersAll['string-iterable-field']?.map((e) => e) ?? + const ['defaultValue'], + boolIterableField: state.queryParametersAll['bool-iterable-field'] + ?.map(_$boolConverter) ?? + const [false], + enumIterableField: state.queryParametersAll['enum-iterable-field'] + ?.map(_$SportDetailsEnumMap._$fromName) ?? + const [SportDetails.tennis, SportDetails.hockey], + intListField: state.queryParametersAll['int-list-field'] + ?.map(int.parse) + .toList() ?? + const [0], + doubleListField: state.queryParametersAll['double-list-field'] + ?.map(double.parse) + .toList() ?? + const [1, 2, 3], + stringListField: state.queryParametersAll['string-list-field'] + ?.map((e) => e) + .toList() ?? + const ['defaultValue0', 'defaultValue1'], + boolListField: state.queryParametersAll['bool-list-field'] + ?.map(_$boolConverter) + .toList() ?? + const [true], + enumListField: state.queryParametersAll['enum-list-field'] + ?.map(_$SportDetailsEnumMap._$fromName) + .toList() ?? + const [SportDetails.football], + intSetField: + state.queryParametersAll['int-set-field']?.map(int.parse).toSet() ?? + const {0, 1}, + doubleSetField: state.queryParametersAll['double-set-field'] + ?.map(double.parse) + .toSet() ?? + const {}, + stringSetField: state.queryParametersAll['string-set-field'] + ?.map((e) => e) + .toSet() ?? + const {'defaultValue'}, + boolSetField: state.queryParametersAll['bool-set-field'] + ?.map(_$boolConverter) + .toSet() ?? + const {true, false}, + enumSetField: state.queryParametersAll['enum-set-field'] + ?.map(_$SportDetailsEnumMap._$fromName) + .toSet() ?? + const {SportDetails.hockey}, + ); + + String get location => GoRouteData.$location( + '/iterable-route-with-default-values', + queryParams: { + if (intIterableField != const [0]) + 'int-iterable-field': + intIterableField.map((e) => e.toString()).toList(), + if (doubleIterableField != const [0, 1, 2]) + 'double-iterable-field': + doubleIterableField.map((e) => e.toString()).toList(), + if (stringIterableField != const ['defaultValue']) + 'string-iterable-field': stringIterableField.map((e) => e).toList(), + if (boolIterableField != const [false]) + 'bool-iterable-field': + boolIterableField.map((e) => e.toString()).toList(), + if (enumIterableField != + const [SportDetails.tennis, SportDetails.hockey]) + 'enum-iterable-field': + enumIterableField.map((e) => _$SportDetailsEnumMap[e]).toList(), + if (intListField != const [0]) + 'int-list-field': intListField.map((e) => e.toString()).toList(), + if (doubleListField != const [1, 2, 3]) + 'double-list-field': + doubleListField.map((e) => e.toString()).toList(), + if (stringListField != + const ['defaultValue0', 'defaultValue1']) + 'string-list-field': stringListField.map((e) => e).toList(), + if (boolListField != const [true]) + 'bool-list-field': boolListField.map((e) => e.toString()).toList(), + if (enumListField != const [SportDetails.football]) + 'enum-list-field': + enumListField.map((e) => _$SportDetailsEnumMap[e]).toList(), + if (intSetField != const {0, 1}) + 'int-set-field': intSetField.map((e) => e.toString()).toList(), + if (doubleSetField != const {}) + 'double-set-field': + doubleSetField.map((e) => e.toString()).toList(), + if (stringSetField != const {'defaultValue'}) + 'string-set-field': stringSetField.map((e) => e).toList(), + if (boolSetField != const {true, false}) + 'bool-set-field': boolSetField.map((e) => e.toString()).toList(), + if (enumSetField != const {SportDetails.hockey}) + 'enum-set-field': + enumSetField.map((e) => _$SportDetailsEnumMap[e]).toList(), + }, + ); + + void go(BuildContext context) => context.go(location); + + void push(BuildContext context) => context.push(location); + + void pushReplacement(BuildContext context) => + context.pushReplacement(location); +} + const _$PersonDetailsEnumMap = { PersonDetails.hobbies: 'hobbies', PersonDetails.favoriteFood: 'favorite-food', diff --git a/packages/go_router_builder/example/pubspec.yaml b/packages/go_router_builder/example/pubspec.yaml index 0b7ffcbff9d..52dd2c40517 100644 --- a/packages/go_router_builder/example/pubspec.yaml +++ b/packages/go_router_builder/example/pubspec.yaml @@ -8,7 +8,7 @@ environment: dependencies: flutter: sdk: flutter - go_router: ^6.0.0 + go_router: ^6.2.0 provider: ^6.0.0 dev_dependencies: From 542aad02216efc605b21baaaa82ad55365372de9 Mon Sep 17 00:00:00 2001 From: ValentinVignal Date: Mon, 6 Mar 2023 20:02:06 +0800 Subject: [PATCH 3/7] tests: Update the tests --- .../go_router_builder/test/builder_test.dart | 1 + .../_go_router_builder_test_input.dart | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/packages/go_router_builder/test/builder_test.dart b/packages/go_router_builder/test/builder_test.dart index 68c5a1b28ae..fa9def3c640 100644 --- a/packages/go_router_builder/test/builder_test.dart +++ b/packages/go_router_builder/test/builder_test.dart @@ -35,4 +35,5 @@ const Set _expectedAnnotatedTests = { 'EnumParam', 'DefaultValueRoute', 'NullableDefaultValueRoute', + 'IterableDefaultValueRoute', }; diff --git a/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart b/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart index abb47ad5b7d..07a3787b4a8 100644 --- a/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart +++ b/packages/go_router_builder/test/test_inputs/_go_router_builder_test_input.dart @@ -213,3 +213,38 @@ class NullableDefaultValueRoute extends GoRouteData { NullableDefaultValueRoute({this.param = 0}); final int? param; } + +@ShouldGenerate(r''' +GoRoute get $iterableDefaultValueRoute => GoRouteData.$route( + path: '/iterable-default-value-route', + factory: $IterableDefaultValueRouteExtension._fromState, + ); + +extension $IterableDefaultValueRouteExtension on IterableDefaultValueRoute { + static IterableDefaultValueRoute _fromState(GoRouterState state) => + IterableDefaultValueRoute( + param: + state.queryParametersAll['param']?.map(int.parse) ?? const [0], + ); + + String get location => GoRouteData.$location( + '/iterable-default-value-route', + queryParams: { + if (param != const [0]) + 'param': param.map((e) => e.toString()).toList(), + }, + ); + + void go(BuildContext context) => context.go(location); + + void push(BuildContext context) => context.push(location); + + void pushReplacement(BuildContext context) => + context.pushReplacement(location); +} +''') +@TypedGoRoute(path: '/iterable-default-value-route') +class IterableDefaultValueRoute extends GoRouteData { + IterableDefaultValueRoute({this.param = const [0]}); + final Iterable param; +} From 8f047356b0ce61bef8697d32bedaf8c6c732acd6 Mon Sep 17 00:00:00 2001 From: ValentinVignal Date: Mon, 6 Mar 2023 20:03:50 +0800 Subject: [PATCH 4/7] docs: Update version number --- packages/go_router_builder/CHANGELOG.md | 3 ++- packages/go_router_builder/pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/go_router_builder/CHANGELOG.md b/packages/go_router_builder/CHANGELOG.md index 5f36062d994..ef5fe65ae66 100644 --- a/packages/go_router_builder/CHANGELOG.md +++ b/packages/go_router_builder/CHANGELOG.md @@ -1,6 +1,7 @@ -## NEXT +## 1.1.5 * Aligns Dart and Flutter SDK constraints. +* Supports default values for `Set`, `List` and `Iterable` route parameters. ## 1.1.4 diff --git a/packages/go_router_builder/pubspec.yaml b/packages/go_router_builder/pubspec.yaml index 96c5c17d11b..a6ae01db9c1 100644 --- a/packages/go_router_builder/pubspec.yaml +++ b/packages/go_router_builder/pubspec.yaml @@ -2,7 +2,7 @@ name: go_router_builder description: >- A builder that supports generated strongly-typed route helpers for package:go_router -version: 1.1.4 +version: 1.1.5 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 4b422b660cd87b00db5740d5477bb4a577d58194 Mon Sep 17 00:00:00 2001 From: ValentinVignal Date: Thu, 9 Mar 2023 09:35:36 +0800 Subject: [PATCH 5/7] test: Add a test in example with default values --- .../example/lib/all_types.dart | 22 ++++++++++++++++--- .../example/test/all_types_test.dart | 20 +++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/packages/go_router_builder/example/lib/all_types.dart b/packages/go_router_builder/example/lib/all_types.dart index f9fcaa4f482..547c2ebe3ed 100644 --- a/packages/go_router_builder/example/lib/all_types.dart +++ b/packages/go_router_builder/example/lib/all_types.dart @@ -345,7 +345,7 @@ class IterableRoute extends GoRouteData { } class IterableRouteWithDefaultValues extends GoRouteData { - IterableRouteWithDefaultValues({ + const IterableRouteWithDefaultValues({ this.intIterableField = const [0], this.doubleIterableField = const [0, 1, 2], this.stringIterableField = const ['defaultValue'], @@ -387,9 +387,25 @@ class IterableRouteWithDefaultValues extends GoRouteData { final Set enumSetField; @override - Widget build(BuildContext context, GoRouterState state) => - const BasePage( + Widget build(BuildContext context, GoRouterState state) => BasePage( dataTitle: 'IterableRouteWithDefaultValues', + queryParamWithDefaultValue: >{ + 'intIterableField': intIterableField, + 'intListField': intListField, + 'intSetField': intSetField, + 'doubleIterableField': doubleIterableField, + 'doubleListField': doubleListField, + 'doubleSetField': doubleSetField, + 'stringIterableField': stringIterableField, + 'stringListField': stringListField, + 'stringSetField': stringSetField, + 'boolIterableField': boolIterableField, + 'boolListField': boolListField, + 'boolSetField': boolSetField, + 'enumIterableField': enumIterableField, + 'enumListField': enumListField, + 'enumSetField': enumSetField, + }.toString(), ); Widget drawerTile(BuildContext context) => ListTile( 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 ff3bff1ac69..f75e207c176 100644 --- a/packages/go_router_builder/example/test/all_types_test.dart +++ b/packages/go_router_builder/example/test/all_types_test.dart @@ -136,4 +136,24 @@ void main() { '/iterable-route?int-list-field=1&int-list-field=2&int-list-field=3'), findsOneWidget); }); + + testWidgets( + 'It should navigate to the iterable route with the its default values', + (WidgetTester tester) async { + await tester.pumpWidget(AllTypesApp()); + + final ScaffoldState scaffoldState = + tester.firstState(find.byType(Scaffold)); + + const IterableRouteWithDefaultValues().go(scaffoldState.context); + await tester.pumpAndSettle(); + expect(find.text('IterableRouteWithDefaultValues'), findsOneWidget); + expect( + find.text( + 'Query param with default value: {intIterableField: [0], intListField: [0], intSetField: {0, 1}, doubleIterableField: [0.0, 1.0, 2.0], doubleListField: [1.0, 2.0, 3.0], doubleSetField: {}, stringIterableField: [defaultValue], stringListField: [defaultValue0, defaultValue1], stringSetField: {defaultValue}, boolIterableField: [false], boolListField: [true], boolSetField: {true, false}, enumIterableField: [SportDetails.tennis, SportDetails.hockey], enumListField: [SportDetails.football], enumSetField: {SportDetails.hockey}}', + ), + findsOneWidget, + ); + expect(find.text('/iterable-route-with-default-values'), findsOneWidget); + }); } From cbfef9d67901501a27c043379d68e209640195c5 Mon Sep 17 00:00:00 2001 From: ValentinVignal Date: Fri, 10 Mar 2023 10:07:59 +0800 Subject: [PATCH 6/7] test: Add better tests --- .../example/lib/all_types.dart | 121 +++++++++++++++--- .../example/test/all_types_test.dart | 68 +++++++++- 2 files changed, 165 insertions(+), 24 deletions(-) diff --git a/packages/go_router_builder/example/lib/all_types.dart b/packages/go_router_builder/example/lib/all_types.dart index 547c2ebe3ed..1d6da4f214a 100644 --- a/packages/go_router_builder/example/lib/all_types.dart +++ b/packages/go_router_builder/example/lib/all_types.dart @@ -332,9 +332,23 @@ class IterableRoute extends GoRouteData { final Set? enumSetField; @override - Widget build(BuildContext context, GoRouterState state) => - const BasePage( + Widget build(BuildContext context, GoRouterState state) => IterablePage( dataTitle: 'IterableRoute', + intIterableField: intIterableField, + doubleIterableField: doubleIterableField, + stringIterableField: stringIterableField, + boolIterableField: boolIterableField, + enumIterableField: enumIterableField, + intListField: intListField, + doubleListField: doubleListField, + stringListField: stringListField, + boolListField: boolListField, + enumListField: enumListField, + intSetField: intSetField, + doubleSetField: doubleSetField, + stringSetField: stringSetField, + boolSetField: boolSetField, + enumSetField: enumSetField, ); Widget drawerTile(BuildContext context) => ListTile( @@ -387,25 +401,23 @@ class IterableRouteWithDefaultValues extends GoRouteData { final Set enumSetField; @override - Widget build(BuildContext context, GoRouterState state) => BasePage( + Widget build(BuildContext context, GoRouterState state) => IterablePage( dataTitle: 'IterableRouteWithDefaultValues', - queryParamWithDefaultValue: >{ - 'intIterableField': intIterableField, - 'intListField': intListField, - 'intSetField': intSetField, - 'doubleIterableField': doubleIterableField, - 'doubleListField': doubleListField, - 'doubleSetField': doubleSetField, - 'stringIterableField': stringIterableField, - 'stringListField': stringListField, - 'stringSetField': stringSetField, - 'boolIterableField': boolIterableField, - 'boolListField': boolListField, - 'boolSetField': boolSetField, - 'enumIterableField': enumIterableField, - 'enumListField': enumListField, - 'enumSetField': enumSetField, - }.toString(), + intIterableField: intIterableField, + doubleIterableField: doubleIterableField, + stringIterableField: stringIterableField, + boolIterableField: boolIterableField, + enumIterableField: enumIterableField, + intListField: intListField, + doubleListField: doubleListField, + stringListField: stringListField, + boolListField: boolListField, + enumListField: enumListField, + intSetField: intSetField, + doubleSetField: doubleSetField, + stringSetField: stringSetField, + boolSetField: boolSetField, + enumSetField: enumSetField, ); Widget drawerTile(BuildContext context) => ListTile( @@ -503,6 +515,7 @@ class BasePage extends StatelessWidget { SportDetails.hockey, }, ).drawerTile(context), + const IterableRouteWithDefaultValues().drawerTile(context), ], )), body: Center( @@ -541,3 +554,71 @@ class AllTypesApp extends StatelessWidget { initialLocation: const AllTypesBaseRoute().location, ); } + +class IterablePage extends StatelessWidget { + const IterablePage({ + required this.dataTitle, + this.intIterableField, + this.doubleIterableField, + this.stringIterableField, + this.boolIterableField, + this.enumIterableField, + this.intListField, + this.doubleListField, + this.stringListField, + this.boolListField, + this.enumListField, + this.intSetField, + this.doubleSetField, + this.stringSetField, + this.boolSetField, + this.enumSetField, + super.key, + }); + + final String dataTitle; + + final Iterable? intIterableField; + final List? intListField; + final Set? intSetField; + + final Iterable? doubleIterableField; + final List? doubleListField; + final Set? doubleSetField; + + final Iterable? stringIterableField; + final List? stringListField; + final Set? stringSetField; + + final Iterable? boolIterableField; + final List? boolListField; + final Set? boolSetField; + + final Iterable? enumIterableField; + final List? enumListField; + final Set? enumSetField; + + @override + Widget build(BuildContext context) { + return BasePage( + dataTitle: dataTitle, + queryParamWithDefaultValue: ?>{ + 'intIterableField': intIterableField, + 'intListField': intListField, + 'intSetField': intSetField, + 'doubleIterableField': doubleIterableField, + 'doubleListField': doubleListField, + 'doubleSetField': doubleSetField, + 'stringIterableField': stringIterableField, + 'stringListField': stringListField, + 'stringSetField': stringSetField, + 'boolIterableField': boolIterableField, + 'boolListField': boolListField, + 'boolSetField': boolSetField, + 'enumIterableField': enumIterableField, + 'enumListField': enumListField, + 'enumSetField': enumSetField, + }.toString(), + ); + } +} 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 f75e207c176..074b92e5380 100644 --- a/packages/go_router_builder/example/test/all_types_test.dart +++ b/packages/go_router_builder/example/test/all_types_test.dart @@ -138,7 +138,7 @@ void main() { }); testWidgets( - 'It should navigate to the iterable route with the its default values', + 'It should navigate to the iterable route with its default values', (WidgetTester tester) async { await tester.pumpWidget(AllTypesApp()); @@ -148,11 +148,71 @@ void main() { const IterableRouteWithDefaultValues().go(scaffoldState.context); await tester.pumpAndSettle(); expect(find.text('IterableRouteWithDefaultValues'), findsOneWidget); + final IterablePage page = + tester.widget(find.byType(IterablePage)); expect( - find.text( - 'Query param with default value: {intIterableField: [0], intListField: [0], intSetField: {0, 1}, doubleIterableField: [0.0, 1.0, 2.0], doubleListField: [1.0, 2.0, 3.0], doubleSetField: {}, stringIterableField: [defaultValue], stringListField: [defaultValue0, defaultValue1], stringSetField: {defaultValue}, boolIterableField: [false], boolListField: [true], boolSetField: {true, false}, enumIterableField: [SportDetails.tennis, SportDetails.hockey], enumListField: [SportDetails.football], enumSetField: {SportDetails.hockey}}', + page, + isA().having( + (IterablePage page) => page.intIterableField, + 'intIterableField', + const [0], + ).having( + (IterablePage page) => page.intListField, + 'intListField', + const [0], + ).having( + (IterablePage page) => page.intSetField, + 'intSetField', + const {0, 1}, + ).having( + (IterablePage page) => page.doubleIterableField, + 'doubleIterableField', + const [0, 1, 2], + ).having( + (IterablePage page) => page.doubleListField, + 'doubleListField', + const [1, 2, 3], + ).having( + (IterablePage page) => page.doubleSetField, + 'doubleSetField', + const {}, + ).having( + (IterablePage page) => page.stringIterableField, + 'stringIterableField', + const ['defaultValue'], + ).having( + (IterablePage page) => page.stringListField, + 'stringListField', + const ['defaultValue0', 'defaultValue1'], + ).having( + (IterablePage page) => page.stringSetField, + 'stringSetField', + const {'defaultValue'}, + ).having( + (IterablePage page) => page.boolIterableField, + 'boolIterableField', + const [false], + ).having( + (IterablePage page) => page.boolListField, + 'boolListField', + const [true], + ).having( + (IterablePage page) => page.boolSetField, + 'boolSetField', + const {true, false}, + ).having( + (IterablePage page) => page.enumIterableField, + 'enumIterableField', + const [SportDetails.tennis, SportDetails.hockey], + ).having( + (IterablePage page) => page.enumListField, + 'enumListField', + const [SportDetails.football], + ).having( + (IterablePage page) => page.enumSetField, + 'enumSetField', + const {SportDetails.hockey}, ), - findsOneWidget, ); expect(find.text('/iterable-route-with-default-values'), findsOneWidget); }); From d2fa8da444d7df10b8ef21b365fd7639336e77d0 Mon Sep 17 00:00:00 2001 From: ValentinVignal Date: Fri, 10 Mar 2023 10:18:00 +0800 Subject: [PATCH 7/7] format: Add missing comma --- packages/go_router_builder/example/lib/all_types.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/go_router_builder/example/lib/all_types.dart b/packages/go_router_builder/example/lib/all_types.dart index 1d6da4f214a..76157e74dae 100644 --- a/packages/go_router_builder/example/lib/all_types.dart +++ b/packages/go_router_builder/example/lib/all_types.dart @@ -366,7 +366,7 @@ class IterableRouteWithDefaultValues extends GoRouteData { this.boolIterableField = const [false], this.enumIterableField = const [ SportDetails.tennis, - SportDetails.hockey + SportDetails.hockey, ], this.intListField = const [0], this.doubleListField = const [1, 2, 3],