diff --git a/packages/go_router_builder/CHANGELOG.md b/packages/go_router_builder/CHANGELOG.md index cb3433fb376c1..11aeb62a35d91 100644 --- a/packages/go_router_builder/CHANGELOG.md +++ b/packages/go_router_builder/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.2.5 + +* Fixes a bug where shell routes without const constructor were not generated correctly. + ## 2.2.4 * Bumps example go_router version to v10.0.0 and migrate example code. diff --git a/packages/go_router_builder/lib/src/route_config.dart b/packages/go_router_builder/lib/src/route_config.dart index ef3b82edfb61a..1d607761a98e9 100644 --- a/packages/go_router_builder/lib/src/route_config.dart +++ b/packages/go_router_builder/lib/src/route_config.dart @@ -47,13 +47,24 @@ class ShellRouteConfig extends RouteBaseConfig { final String? navigatorKey; @override - Iterable classDeclarations() => [ - ''' -extension $_extensionName on $_className { - static $_className _fromState(GoRouterState state) => const $_className(); -} -''' - ]; + Iterable classDeclarations() { + if (routeDataClass.unnamedConstructor == null) { + throw InvalidGenerationSourceError( + 'The ShellRouteData "$_className" class must have an unnamed constructor.', + element: routeDataClass, + ); + } + + final bool isConst = routeDataClass.unnamedConstructor!.isConst; + + return [ + ''' + extension $_extensionName on $_className { + static $_className _fromState(GoRouterState state) =>${isConst ? ' const' : ''} $_className(); + } + ''' + ]; + } @override String get routeConstructorParameters => diff --git a/packages/go_router_builder/pubspec.yaml b/packages/go_router_builder/pubspec.yaml index 1bd454a71be6a..dac268f794b7c 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.2.4 +version: 2.2.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 diff --git a/packages/go_router_builder/test_inputs/shell_route_data.dart b/packages/go_router_builder/test_inputs/shell_route_data.dart new file mode 100644 index 0000000000000..43f2b28498bd4 --- /dev/null +++ b/packages/go_router_builder/test_inputs/shell_route_data.dart @@ -0,0 +1,17 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:go_router/go_router.dart'; + +@TypedShellRoute( + routes: >[], +) +class ShellRouteNoConstConstructor extends ShellRouteData {} + +@TypedShellRoute( + routes: >[], +) +class ShellRouteWithConstConstructor extends ShellRouteData { + const ShellRouteWithConstConstructor(); +} 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 new file mode 100644 index 0000000000000..b99dd5176beb9 --- /dev/null +++ b/packages/go_router_builder/test_inputs/shell_route_data.dart.expect @@ -0,0 +1,19 @@ +RouteBase get $shellRouteNoConstConstructor => ShellRouteData.$route( + factory: $ShellRouteNoConstConstructorExtension._fromState, + ); + +extension $ShellRouteNoConstConstructorExtension + on ShellRouteNoConstConstructor { + static ShellRouteNoConstConstructor _fromState(GoRouterState state) => + ShellRouteNoConstConstructor(); +} + +RouteBase get $shellRouteWithConstConstructor => ShellRouteData.$route( + factory: $ShellRouteWithConstConstructorExtension._fromState, + ); + +extension $ShellRouteWithConstConstructorExtension + on ShellRouteWithConstConstructor { + static ShellRouteWithConstConstructor _fromState(GoRouterState state) => + const ShellRouteWithConstConstructor(); +} diff --git a/packages/go_router_builder/test_inputs/shell_route_data_without_unnamed_constructor.dart b/packages/go_router_builder/test_inputs/shell_route_data_without_unnamed_constructor.dart new file mode 100644 index 0000000000000..24e97bfd9c22c --- /dev/null +++ b/packages/go_router_builder/test_inputs/shell_route_data_without_unnamed_constructor.dart @@ -0,0 +1,12 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:go_router/go_router.dart'; + +@TypedShellRoute( + routes: >[], +) +class ShellRouteWithoutUnnamedConstructor extends ShellRouteData { + const ShellRouteWithoutUnnamedConstructor.namedConstructor(); +} 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 new file mode 100644 index 0000000000000..c3d6e57e861a4 --- /dev/null +++ b/packages/go_router_builder/test_inputs/shell_route_data_without_unnamed_constructor.dart.expect @@ -0,0 +1 @@ +The ShellRouteData "ShellRouteWithoutUnnamedConstructor" class must have an unnamed constructor.