From 3c6a6bb525d32da9e3a5fbf19cf65eeea53fee60 Mon Sep 17 00:00:00 2001 From: Valentin Vignal <32538273+ValentinVignal@users.noreply.github.com> Date: Thu, 3 Aug 2023 05:20:32 +0800 Subject: [PATCH] [go_router_builder] Support `ShellRouteData` without `const` constructor (#4627) Fixes https://github.com/flutter/flutter/issues/131211 --- packages/go_router_builder/CHANGELOG.md | 4 +++ .../lib/src/route_config.dart | 25 +++++++++++++------ packages/go_router_builder/pubspec.yaml | 2 +- .../test_inputs/shell_route_data.dart | 17 +++++++++++++ .../test_inputs/shell_route_data.dart.expect | 19 ++++++++++++++ ...oute_data_without_unnamed_constructor.dart | 12 +++++++++ ...ta_without_unnamed_constructor.dart.expect | 1 + 7 files changed, 72 insertions(+), 8 deletions(-) create mode 100644 packages/go_router_builder/test_inputs/shell_route_data.dart create mode 100644 packages/go_router_builder/test_inputs/shell_route_data.dart.expect create mode 100644 packages/go_router_builder/test_inputs/shell_route_data_without_unnamed_constructor.dart create mode 100644 packages/go_router_builder/test_inputs/shell_route_data_without_unnamed_constructor.dart.expect diff --git a/packages/go_router_builder/CHANGELOG.md b/packages/go_router_builder/CHANGELOG.md index cb3433fb37..11aeb62a35 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 ef3b82edfb..1d607761a9 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 1bd454a71b..dac268f794 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 0000000000..43f2b28498 --- /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 0000000000..b99dd5176b --- /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 0000000000..24e97bfd9c --- /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 0000000000..c3d6e57e86 --- /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.