Skip to content

Commit f2f6c5e

Browse files
[go_router_builder] Support default values for route parameters (#2826)
* ✨ Support default value in route parameters * 📝 Update the example to include default value * ✅ Update the tests * ⬆️ Update the version number * 🔊 Throw an error when a default value is used with a nullable type * ✅ Add tests on default values * 🚨 Specify type annotation * 📝 Update README * ✏️ equal -> that equals
1 parent 86ff76a commit f2f6c5e

File tree

10 files changed

+208
-11
lines changed

10 files changed

+208
-11
lines changed

packages/go_router_builder/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 1.1.0
2+
3+
* Supports default value for the route parameters.
4+
15
## 1.0.16
26

37
* Update the documentation to go_router v6.0.0.

packages/go_router_builder/README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,23 @@ class LoginRoute extends GoRouteData {
179179
}
180180
```
181181

182+
### Default values
183+
184+
For query parameters with a **non-nullable** type, you can define a default value:
185+
186+
```dart
187+
class MyRoute extends GoRouteData {
188+
MyRoute({this.queryParameter = 'defaultValue'});
189+
final String from;
190+
191+
@override
192+
Widget build(BuildContext context, GoRouterState state) => MyScreen(from: from);
193+
}
194+
```
195+
196+
A query parameter that equals to its default value is not included in the location.
197+
198+
182199
## Extra parameter
183200

184201
A route can consume an extra parameter by taking it as a typed constructor

packages/go_router_builder/example/lib/all_types.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,16 +64,19 @@ class BoolRoute extends GoRouteData {
6464
BoolRoute({
6565
required this.requiredBoolField,
6666
this.boolField,
67+
this.boolFieldWithDefaultValue = true,
6768
});
6869

6970
final bool requiredBoolField;
7071
final bool? boolField;
72+
final bool boolFieldWithDefaultValue;
7173

7274
@override
7375
Widget build(BuildContext context, GoRouterState state) => BasePage<bool>(
7476
dataTitle: 'BoolRoute',
7577
param: requiredBoolField,
7678
queryParam: boolField,
79+
queryParamWithDefaultValue: boolFieldWithDefaultValue,
7780
);
7881

7982
Widget drawerTile(BuildContext context) => ListTile(
@@ -110,16 +113,19 @@ class DoubleRoute extends GoRouteData {
110113
DoubleRoute({
111114
required this.requiredDoubleField,
112115
this.doubleField,
116+
this.doubleFieldWithDefaultValue = 1.0,
113117
});
114118

115119
final double requiredDoubleField;
116120
final double? doubleField;
121+
final double doubleFieldWithDefaultValue;
117122

118123
@override
119124
Widget build(BuildContext context, GoRouterState state) => BasePage<double>(
120125
dataTitle: 'DoubleRoute',
121126
param: requiredDoubleField,
122127
queryParam: doubleField,
128+
queryParamWithDefaultValue: doubleFieldWithDefaultValue,
123129
);
124130

125131
Widget drawerTile(BuildContext context) => ListTile(
@@ -133,16 +139,19 @@ class IntRoute extends GoRouteData {
133139
IntRoute({
134140
required this.requiredIntField,
135141
this.intField,
142+
this.intFieldWithDefaultValue = 1,
136143
});
137144

138145
final int requiredIntField;
139146
final int? intField;
147+
final int intFieldWithDefaultValue;
140148

141149
@override
142150
Widget build(BuildContext context, GoRouterState state) => BasePage<int>(
143151
dataTitle: 'IntRoute',
144152
param: requiredIntField,
145153
queryParam: intField,
154+
queryParamWithDefaultValue: intFieldWithDefaultValue,
146155
);
147156

148157
Widget drawerTile(BuildContext context) => ListTile(
@@ -156,16 +165,19 @@ class NumRoute extends GoRouteData {
156165
NumRoute({
157166
required this.requiredNumField,
158167
this.numField,
168+
this.numFieldWithDefaultValue = 1,
159169
});
160170

161171
final num requiredNumField;
162172
final num? numField;
173+
final num numFieldWithDefaultValue;
163174

164175
@override
165176
Widget build(BuildContext context, GoRouterState state) => BasePage<num>(
166177
dataTitle: 'NumRoute',
167178
param: requiredNumField,
168179
queryParam: numField,
180+
queryParamWithDefaultValue: numFieldWithDefaultValue,
169181
);
170182

171183
Widget drawerTile(BuildContext context) => ListTile(
@@ -179,17 +191,20 @@ class EnumRoute extends GoRouteData {
179191
EnumRoute({
180192
required this.requiredEnumField,
181193
this.enumField,
194+
this.enumFieldWithDefaultValue = PersonDetails.favoriteFood,
182195
});
183196

184197
final PersonDetails requiredEnumField;
185198
final PersonDetails? enumField;
199+
final PersonDetails enumFieldWithDefaultValue;
186200

187201
@override
188202
Widget build(BuildContext context, GoRouterState state) =>
189203
BasePage<PersonDetails>(
190204
dataTitle: 'EnumRoute',
191205
param: requiredEnumField,
192206
queryParam: enumField,
207+
queryParamWithDefaultValue: enumFieldWithDefaultValue,
193208
);
194209

195210
Widget drawerTile(BuildContext context) => ListTile(
@@ -203,17 +218,20 @@ class EnhancedEnumRoute extends GoRouteData {
203218
EnhancedEnumRoute({
204219
required this.requiredEnumField,
205220
this.enumField,
221+
this.enumFieldWithDefaultValue = SportDetails.football,
206222
});
207223

208224
final SportDetails requiredEnumField;
209225
final SportDetails? enumField;
226+
final SportDetails enumFieldWithDefaultValue;
210227

211228
@override
212229
Widget build(BuildContext context, GoRouterState state) =>
213230
BasePage<SportDetails>(
214231
dataTitle: 'EnhancedEnumRoute',
215232
param: requiredEnumField,
216233
queryParam: enumField,
234+
queryParamWithDefaultValue: enumFieldWithDefaultValue,
217235
);
218236

219237
Widget drawerTile(BuildContext context) => ListTile(
@@ -227,16 +245,19 @@ class StringRoute extends GoRouteData {
227245
StringRoute({
228246
required this.requiredStringField,
229247
this.stringField,
248+
this.stringFieldWithDefaultValue = 'defaultValue',
230249
});
231250

232251
final String requiredStringField;
233252
final String? stringField;
253+
final String stringFieldWithDefaultValue;
234254

235255
@override
236256
Widget build(BuildContext context, GoRouterState state) => BasePage<String>(
237257
dataTitle: 'StringRoute',
238258
param: requiredStringField,
239259
queryParam: stringField,
260+
queryParamWithDefaultValue: stringFieldWithDefaultValue,
240261
);
241262

242263
Widget drawerTile(BuildContext context) => ListTile(
@@ -274,12 +295,14 @@ class BasePage<T> extends StatelessWidget {
274295
required this.dataTitle,
275296
required this.param,
276297
this.queryParam,
298+
this.queryParamWithDefaultValue,
277299
super.key,
278300
});
279301

280302
final String dataTitle;
281303
final T param;
282304
final T? queryParam;
305+
final T? queryParamWithDefaultValue;
283306

284307
@override
285308
Widget build(BuildContext context) => Scaffold(
@@ -339,6 +362,9 @@ class BasePage<T> extends StatelessWidget {
339362
Text(dataTitle),
340363
Text('Param: $param'),
341364
Text('Query param: $queryParam'),
365+
Text(
366+
'Query param with default value: $queryParamWithDefaultValue',
367+
),
342368
SelectableText(GoRouter.of(context).location),
343369
],
344370
),

packages/go_router_builder/example/lib/all_types.g.dart

Lines changed: 47 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)