Skip to content

[go_router_builder] Support default value for Set, List and Iterable route parameters #3391

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
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