Skip to content

Commit

Permalink
[go_router_builder] Support default value for Set, List and `Iter…
Browse files Browse the repository at this point in the history
…able` route parameters (#3391)

[go_router_builder] Support default value for `Set`, `List` and `Iterable` route parameters
  • Loading branch information
ValentinVignal committed Mar 16, 2023
1 parent 44ddf2c commit 7636eb7
Show file tree
Hide file tree
Showing 9 changed files with 410 additions and 21 deletions.
4 changes: 4 additions & 0 deletions packages/go_router_builder/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 1.1.7

* Supports default values for `Set`, `List` and `Iterable` route parameters.

## 1.1.6

* Generates the const enum map for enums used in `List`, `Set` and `Iterable`.
Expand Down
158 changes: 156 additions & 2 deletions packages/go_router_builder/example/lib/all_types.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ part 'all_types.g.dart';
TypedGoRoute<StringRoute>(path: 'string-route/:requiredStringField'),
TypedGoRoute<UriRoute>(path: 'uri-route/:requiredUriField'),
TypedGoRoute<IterableRoute>(path: 'iterable-route'),
TypedGoRoute<IterableRouteWithDefaultValues>(
path: 'iterable-route-with-default-values'),
])
@immutable
class AllTypesBaseRoute extends GoRouteData {
Expand Down Expand Up @@ -337,9 +339,23 @@ class IterableRoute extends GoRouteData {
final Set<CookingRecipe>? enumOnlyInSetField;

@override
Widget build(BuildContext context, GoRouterState state) =>
const BasePage<String>(
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(
Expand All @@ -349,6 +365,75 @@ class IterableRoute extends GoRouteData {
);
}

class IterableRouteWithDefaultValues extends GoRouteData {
const IterableRouteWithDefaultValues({
this.intIterableField = const <int>[0],
this.doubleIterableField = const <double>[0, 1, 2],
this.stringIterableField = const <String>['defaultValue'],
this.boolIterableField = const <bool>[false],
this.enumIterableField = const <SportDetails>[
SportDetails.tennis,
SportDetails.hockey,
],
this.intListField = const <int>[0],
this.doubleListField = const <double>[1, 2, 3],
this.stringListField = const <String>['defaultValue0', 'defaultValue1'],
this.boolListField = const <bool>[true],
this.enumListField = const <SportDetails>[SportDetails.football],
this.intSetField = const <int>{0, 1},
this.doubleSetField = const <double>{},
this.stringSetField = const <String>{'defaultValue'},
this.boolSetField = const <bool>{true, false},
this.enumSetField = const <SportDetails>{SportDetails.hockey},
});

final Iterable<int> intIterableField;
final List<int> intListField;
final Set<int> intSetField;

final Iterable<double> doubleIterableField;
final List<double> doubleListField;
final Set<double> doubleSetField;

final Iterable<String> stringIterableField;
final List<String> stringListField;
final Set<String> stringSetField;

final Iterable<bool> boolIterableField;
final List<bool> boolListField;
final Set<bool> boolSetField;

final Iterable<SportDetails> enumIterableField;
final List<SportDetails> enumListField;
final Set<SportDetails> enumSetField;

@override
Widget build(BuildContext context, GoRouterState state) => IterablePage(
dataTitle: 'IterableRouteWithDefaultValues',
intIterableField: intIterableField,
doubleIterableField: doubleIterableField,
stringIterableField: stringIterableField,
boolIterableField: boolIterableField,
enumIterableField: enumIterableField,
intListField: intListField,
doubleListField: doubleListField,
stringListField: stringListField,
boolListField: boolListField,
enumListField: enumListField,
intSetField: intSetField,
doubleSetField: doubleSetField,
stringSetField: stringSetField,
boolSetField: boolSetField,
enumSetField: enumSetField,
);

Widget drawerTile(BuildContext context) => ListTile(
title: const Text('IterableRouteWithDefaultValues'),
onTap: () => go(context),
selected: GoRouter.of(context).location == location,
);
}

class BasePage<T> extends StatelessWidget {
const BasePage({
required this.dataTitle,
Expand Down Expand Up @@ -437,6 +522,7 @@ class BasePage<T> extends StatelessWidget {
SportDetails.hockey,
},
).drawerTile(context),
const IterableRouteWithDefaultValues().drawerTile(context),
],
)),
body: Center(
Expand Down Expand Up @@ -475,3 +561,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<int>? intIterableField;
final List<int>? intListField;
final Set<int>? intSetField;

final Iterable<double>? doubleIterableField;
final List<double>? doubleListField;
final Set<double>? doubleSetField;

final Iterable<String>? stringIterableField;
final List<String>? stringListField;
final Set<String>? stringSetField;

final Iterable<bool>? boolIterableField;
final List<bool>? boolListField;
final Set<bool>? boolSetField;

final Iterable<SportDetails>? enumIterableField;
final List<SportDetails>? enumListField;
final Set<SportDetails>? enumSetField;

@override
Widget build(BuildContext context) {
return BasePage<String>(
dataTitle: dataTitle,
queryParamWithDefaultValue: <String, Iterable<dynamic>?>{
'intIterableField': intIterableField,
'intListField': intListField,
'intSetField': intSetField,
'doubleIterableField': doubleIterableField,
'doubleListField': doubleListField,
'doubleSetField': doubleSetField,
'stringIterableField': stringIterableField,
'stringListField': stringListField,
'stringSetField': stringSetField,
'boolIterableField': boolIterableField,
'boolListField': boolListField,
'boolSetField': boolSetField,
'enumIterableField': enumIterableField,
'enumListField': enumListField,
'enumSetField': enumSetField,
}.toString(),
);
}
}
118 changes: 118 additions & 0 deletions packages/go_router_builder/example/lib/all_types.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion packages/go_router_builder/example/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
Loading

0 comments on commit 7636eb7

Please sign in to comment.