[go_router_builder] Support ShellRouteData without const constructor (#4627)

Fixes https://github.com/flutter/flutter/issues/131211
This commit is contained in:
Valentin Vignal
2023-08-03 05:20:32 +08:00
committed by GitHub
parent 228172e2d0
commit 3c6a6bb525
7 changed files with 72 additions and 8 deletions

View File

@ -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.

View File

@ -47,13 +47,24 @@ class ShellRouteConfig extends RouteBaseConfig {
final String? navigatorKey;
@override
Iterable<String> classDeclarations() => <String>[
'''
extension $_extensionName on $_className {
static $_className _fromState(GoRouterState state) => const $_className();
}
'''
];
Iterable<String> 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 <String>[
'''
extension $_extensionName on $_className {
static $_className _fromState(GoRouterState state) =>${isConst ? ' const' : ''} $_className();
}
'''
];
}
@override
String get routeConstructorParameters =>

View File

@ -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

View File

@ -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<ShellRouteNoConstConstructor>(
routes: <TypedRoute<RouteData>>[],
)
class ShellRouteNoConstConstructor extends ShellRouteData {}
@TypedShellRoute<ShellRouteWithConstConstructor>(
routes: <TypedRoute<RouteData>>[],
)
class ShellRouteWithConstConstructor extends ShellRouteData {
const ShellRouteWithConstConstructor();
}

View File

@ -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();
}

View File

@ -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<ShellRouteWithoutUnnamedConstructor>(
routes: <TypedRoute<RouteData>>[],
)
class ShellRouteWithoutUnnamedConstructor extends ShellRouteData {
const ShellRouteWithoutUnnamedConstructor.namedConstructor();
}

View File

@ -0,0 +1 @@
The ShellRouteData "ShellRouteWithoutUnnamedConstructor" class must have an unnamed constructor.