diff --git a/packages/go_router_builder/CHANGELOG.md b/packages/go_router_builder/CHANGELOG.md index b9ef60077e8..fe33e99aecd 100644 --- a/packages/go_router_builder/CHANGELOG.md +++ b/packages/go_router_builder/CHANGELOG.md @@ -1,6 +1,7 @@ -## NEXT +## 3.1.0 - Restricts `build` to versions less than 2.5.0. +- Make the mixin public if the route class is not in the same file. ## 3.0.1 diff --git a/packages/go_router_builder/example/lib/separate_file_route.dart b/packages/go_router_builder/example/lib/separate_file_route.dart new file mode 100644 index 00000000000..d16948c8770 --- /dev/null +++ b/packages/go_router_builder/example/lib/separate_file_route.dart @@ -0,0 +1,35 @@ +// 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. + +// ignore_for_file: public_member_api_docs, unreachable_from_main + +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +import 'stateful_shell_route_initial_location_example.dart'; + +class OrdersRouteData extends GoRouteData with $OrdersRouteData { + const OrdersRouteData(); + + @override + Widget build(BuildContext context, GoRouterState state) { + return const OrdersPageView(label: 'Orders page'); + } +} + +class OrdersPageView extends StatelessWidget { + const OrdersPageView({ + required this.label, + super.key, + }); + + final String label; + + @override + Widget build(BuildContext context) { + return Center( + child: Text(label), + ); + } +} diff --git a/packages/go_router_builder/example/lib/stateful_shell_route_initial_location_example.dart b/packages/go_router_builder/example/lib/stateful_shell_route_initial_location_example.dart index 0e05a36e9ad..371d22e3240 100644 --- a/packages/go_router_builder/example/lib/stateful_shell_route_initial_location_example.dart +++ b/packages/go_router_builder/example/lib/stateful_shell_route_initial_location_example.dart @@ -7,6 +7,8 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'separate_file_route.dart'; + part 'stateful_shell_route_initial_location_example.g.dart'; void main() => runApp(App()); @@ -118,15 +120,6 @@ class NotificationsRouteData extends GoRouteData with _$NotificationsRouteData { } } -class OrdersRouteData extends GoRouteData with _$OrdersRouteData { - const OrdersRouteData(); - - @override - Widget build(BuildContext context, GoRouterState state) { - return const OrdersPageView(label: 'Orders page'); - } -} - class MainPageView extends StatelessWidget { const MainPageView({ required this.navigationShell, @@ -258,19 +251,3 @@ class NotificationsSubPageView extends StatelessWidget { ); } } - -class OrdersPageView extends StatelessWidget { - const OrdersPageView({ - required this.label, - super.key, - }); - - final String label; - - @override - Widget build(BuildContext context) { - return Center( - child: Text(label), - ); - } -} diff --git a/packages/go_router_builder/example/lib/stateful_shell_route_initial_location_example.g.dart b/packages/go_router_builder/example/lib/stateful_shell_route_initial_location_example.g.dart index c7e63a1fc7f..203ad60b2cf 100644 --- a/packages/go_router_builder/example/lib/stateful_shell_route_initial_location_example.g.dart +++ b/packages/go_router_builder/example/lib/stateful_shell_route_initial_location_example.g.dart @@ -36,7 +36,7 @@ RouteBase get $mainShellRouteData => StatefulShellRouteData.$route( routes: [ GoRouteData.$route( path: '/orders', - factory: _$OrdersRouteData._fromState, + factory: $OrdersRouteData._fromState, ), ], ), @@ -104,7 +104,7 @@ const _$NotificationsPageSectionEnumMap = { NotificationsPageSection.archive: 'archive', }; -mixin _$OrdersRouteData on GoRouteData { +mixin $OrdersRouteData on GoRouteData { static OrdersRouteData _fromState(GoRouterState state) => const OrdersRouteData(); diff --git a/packages/go_router_builder/lib/src/route_config.dart b/packages/go_router_builder/lib/src/route_config.dart index d95663d15ac..24ccdad3582 100644 --- a/packages/go_router_builder/lib/src/route_config.dart +++ b/packages/go_router_builder/lib/src/route_config.dart @@ -41,6 +41,7 @@ class ShellRouteConfig extends RouteBaseConfig { required this.navigatorKey, required this.parentNavigatorKey, required super.routeDataClass, + required super.targetUri, required this.observers, required super.parent, required this.restorationScopeId, @@ -101,6 +102,7 @@ class StatefulShellRouteConfig extends RouteBaseConfig { StatefulShellRouteConfig._({ required this.parentNavigatorKey, required super.routeDataClass, + required super.targetUri, required super.parent, required this.navigatorContainerBuilder, required this.restorationScopeId, @@ -146,6 +148,7 @@ class StatefulShellBranchConfig extends RouteBaseConfig { StatefulShellBranchConfig._({ required this.navigatorKey, required super.routeDataClass, + required super.targetUri, required super.parent, required this.observers, this.restorationScopeId, @@ -197,6 +200,7 @@ class GoRouteConfig extends RouteBaseConfig { required this.caseSensitive, required this.parentNavigatorKey, required super.routeDataClass, + required super.targetUri, required super.parent, }) : super._(); @@ -483,6 +487,7 @@ mixin $_mixinName on GoRouteData { abstract class RouteBaseConfig { RouteBaseConfig._({ required this.routeDataClass, + required this.targetUri, required this.parent, }); @@ -525,11 +530,14 @@ abstract class RouteBaseConfig { // TODO(kevmoo): validate that this MUST be a subtype of `GoRouteData` final InterfaceElement classElement = typeParamType.element; + final Uri targetUri = element.source.uri; + final RouteBaseConfig value; switch (typeName) { case 'TypedShellRoute': value = ShellRouteConfig._( routeDataClass: classElement, + targetUri: targetUri, parent: parent, navigatorKey: _generateParameterGetterCode( classElement, @@ -551,6 +559,7 @@ abstract class RouteBaseConfig { case 'TypedStatefulShellRoute': value = StatefulShellRouteConfig._( routeDataClass: classElement, + targetUri: targetUri, parent: parent, parentNavigatorKey: _generateParameterGetterCode( classElement, @@ -568,6 +577,7 @@ abstract class RouteBaseConfig { case 'TypedStatefulShellBranch': value = StatefulShellBranchConfig._( routeDataClass: classElement, + targetUri: targetUri, parent: parent, navigatorKey: _generateParameterGetterCode( classElement, @@ -605,6 +615,7 @@ abstract class RouteBaseConfig { name: nameValue.isNull ? null : nameValue.stringValue, caseSensitive: caseSensitiveValue.boolValue, routeDataClass: classElement, + targetUri: targetUri, parent: parent, parentNavigatorKey: _generateParameterGetterCode( classElement, @@ -629,6 +640,9 @@ abstract class RouteBaseConfig { /// The `RouteData` class this class represents. final InterfaceElement routeDataClass; + /// The URI of the file where the code will be generated. + final Uri targetUri; + /// The parent of this route config. final RouteBaseConfig? parent; @@ -729,7 +743,11 @@ RouteBase get $_routeGetterName => ${_invokesRouteConstructor()}; String get _className => routeDataClass.name; - String get _mixinName => '_\$$_className'; + String get _mixinName { + // If the routeDataClass is in a different file, we need to make the mixin public + final Uri routeUri = routeDataClass.source.uri; + return routeUri != targetUri ? '\$$_className' : '_\$$_className'; + } String get _extensionName => '\$${_className}Extension'; diff --git a/packages/go_router_builder/pubspec.yaml b/packages/go_router_builder/pubspec.yaml index 7d7dde0c893..3d61386b7b5 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: 3.0.1 +version: 3.1.0 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