diff --git a/packages/katana_router/example/pubspec.lock b/packages/katana_router/example/pubspec.lock index df4344ff4..da7bdadc4 100644 --- a/packages/katana_router/example/pubspec.lock +++ b/packages/katana_router/example/pubspec.lock @@ -109,10 +109,10 @@ packages: dependency: transitive description: name: built_value - sha256: "169565c8ad06adb760c3645bf71f00bff161b00002cace266cad42c5d22a7725" + sha256: "31b7c748fd4b9adf8d25d72a4c4a59ef119f12876cf414f94f8af5131d5fa2b0" url: "https://pub.dev" source: hosted - version: "8.4.3" + version: "8.4.4" characters: dependency: transitive description: @@ -181,10 +181,10 @@ packages: dependency: transitive description: name: dart_style - sha256: "7a03456c3490394c8e7665890333e91ae8a49be43542b616e414449ac358acd4" + sha256: "5be16bf1707658e4c03078d4a9b90208ded217fb02c163e207d334082412f2fb" url: "https://pub.dev" source: hosted - version: "2.2.4" + version: "2.2.5" encrypt: dependency: transitive description: @@ -358,21 +358,21 @@ packages: path: ".." relative: true source: path - version: "1.11.4" + version: "1.11.5" katana_router_annotation: dependency: "direct overridden" description: path: "../../katana_router_annotation" relative: true source: path - version: "1.11.0" + version: "1.11.1" katana_router_builder: dependency: "direct dev" description: path: "../../katana_router_builder" relative: true source: path - version: "1.11.1" + version: "1.11.2" lints: dependency: transitive description: diff --git a/packages/katana_router/lib/src/app_router.dart b/packages/katana_router/lib/src/app_router.dart index 223eba52e..25f5a8d92 100644 --- a/packages/katana_router/lib/src/app_router.dart +++ b/packages/katana_router/lib/src/app_router.dart @@ -1,5 +1,6 @@ part of katana_router; +/// {@template katana_router.app_router} /// Controller to define routing for the entire app. /// /// You can define the routing for the entire app by passing it to `routerConfig` in [MaterialApp.router]. @@ -51,9 +52,11 @@ part of katana_router; /// } /// /// ``` +/// {@endtemplate} class AppRouter extends ChangeNotifier with NavigatorObserver implements RouterConfig { + /// {@template katana_router.app_router} /// Controller to define routing for the entire app. /// /// You can define the routing for the entire app by passing it to `routerConfig` in [MaterialApp.router]. @@ -105,6 +108,7 @@ class AppRouter extends ChangeNotifier /// } /// /// ``` + /// {@endtemplate} AppRouter({ UnknownRouteQueryBuilder? unknown, BootRouteQueryBuilder? boot, @@ -120,6 +124,7 @@ class AppRouter extends ChangeNotifier bool reportsRouteUpdateToEngine = true, Widget backgroundWidget = const Scaffold(), List loggerAdapters = const [], + bool nested = false, }) : _loggerAdapters = loggerAdapters { navigatorKey ??= GlobalKey(); @@ -133,6 +138,7 @@ class AppRouter extends ChangeNotifier defaultTransitionQuery: defaultTransitionQuery, reportsRouteUpdateToEngine: reportsRouteUpdateToEngine, backgroundWidget: backgroundWidget, + nested: nested, ); _routerDelegate = _AppRouterDelegate( @@ -143,17 +149,23 @@ class AppRouter extends ChangeNotifier _routeInformationParser = _AppRouteInformationParser(this); - final effectiveInitialLocation = _effectiveInitialLocation( - initialPath ?? "/", - ); + nested = nested || initialQuery?.nested == true; + + final effectiveInitialLocation = nested + ? null + : _effectiveInitialLocation( + initialPath, + ); _routeInformationProvider = _AppRouteInformationProvider( router: this, initialRouteInformation: InitialRouteInformation( - query: _effectiveInitialQuery( - effectiveInitialLocation, - initialQuery, - ), + query: nested + ? initialQuery + : _effectiveInitialQuery( + effectiveInitialLocation, + initialQuery, + ), location: effectiveInitialLocation, ), ); @@ -447,12 +459,10 @@ class AppRouter extends ChangeNotifier } } - String _effectiveInitialLocation(String? initialLocation) { + String? _effectiveInitialLocation(String? initialLocation) { final String platformDefault = WidgetsBinding.instance.platformDispatcher.defaultRouteName; - if (initialLocation == null) { - return platformDefault; - } else if (platformDefault == "/") { + if (platformDefault == "/") { return initialLocation; } else { return platformDefault; @@ -460,9 +470,12 @@ class AppRouter extends ChangeNotifier } RouteQuery? _effectiveInitialQuery( - String initialLocation, + String? initialLocation, RouteQuery? initialQuery, ) { + if (initialLocation.isEmpty) { + return initialQuery; + } for (final page in _config.pages) { final query = page.resolve(initialLocation); if (query != null) { @@ -473,6 +486,35 @@ class AppRouter extends ChangeNotifier } } +/// Class for creating nested [AppRouter]. +/// +/// ネストされた[AppRouter]を作成するためのクラスです。 +/// +/// {@macro katana_router.app_router} +class NestedAppRouter extends AppRouter { + /// Class for creating nested [AppRouter]. + /// + /// ネストされた[AppRouter]を作成するためのクラスです。 + /// + /// {@macro katana_router.app_router} + NestedAppRouter({ + super.unknown, + super.boot, + super.initialPath, + super.initialQuery, + required super.pages, + super.redirect = const [], + super.observers = const [], + super.redirectLimit = 5, + super.navigatorKey, + super.restorationScopeId, + super.defaultTransitionQuery, + super.reportsRouteUpdateToEngine = true, + super.backgroundWidget = const Scaffold(), + super.loggerAdapters = const [], + }) : super(nested: true); +} + /// [InheritedWidget] for placing [AppRouter] on the widget tree. /// /// You can take the value of [AppRouter] passed here in [AppRouter.of]. @@ -525,7 +567,9 @@ class _AppRouterConfig { this.defaultTransitionQuery, this.backgroundWidget = const Scaffold(), this.reportsRouteUpdateToEngine = true, + this.nested = false, }); + final bool nested; final BootRouteQueryBuilder? boot; final UnknownRouteQueryBuilder? unknown; final List pages; diff --git a/packages/katana_router/lib/src/route_query.dart b/packages/katana_router/lib/src/route_query.dart index 81035139d..5f2c1189c 100644 --- a/packages/katana_router/lib/src/route_query.dart +++ b/packages/katana_router/lib/src/route_query.dart @@ -40,6 +40,11 @@ abstract class RouteQuery { /// デフォルトは[path]と同じです。 String get name => path; + /// Returns `true` for nested pages (i.e., pages with no path information). + /// + /// ネストされたページ(つまりパス情報が無いページ)の場合は`true`を返します。 + bool get nested => false; + /// A key to identify the query. /// /// It can be obtained as an object of [E] by specifying [E]. diff --git a/packages/katana_router/pubspec.lock b/packages/katana_router/pubspec.lock index 678183be8..8cd142634 100644 --- a/packages/katana_router/pubspec.lock +++ b/packages/katana_router/pubspec.lock @@ -231,10 +231,10 @@ packages: dependency: "direct main" description: name: katana_router_annotation - sha256: "52daf808cdeccf56586c26287784b8365897dac33d52e4cd00738f7cbcedff52" + sha256: "74e93bdc82781d22efa49c168925735f1f867eb76c8d4a8cf66975466dc238b5" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.11.1" lints: dependency: transitive description: diff --git a/packages/katana_router_builder/lib/common/query_class.dart b/packages/katana_router_builder/lib/common/query_class.dart index 5ba50e6ba..cae35094e 100644 --- a/packages/katana_router_builder/lib/common/query_class.dart +++ b/packages/katana_router_builder/lib/common/query_class.dart @@ -151,6 +151,15 @@ List queryClass( annotation.name == null ? "path" : "\"${annotation.name}\"", ), ), + Method( + (m) => m + ..name = "nested" + ..annotations.addAll([const Reference("override")]) + ..type = MethodType.getter + ..lambda = true + ..returns = const Reference("bool") + ..body = const Code("_path == null"), + ), Method( (m) => m ..name = "key" diff --git a/packages/katana_router_builder/pubspec.lock b/packages/katana_router_builder/pubspec.lock index 9a494737d..55e29e9b5 100644 --- a/packages/katana_router_builder/pubspec.lock +++ b/packages/katana_router_builder/pubspec.lock @@ -69,10 +69,10 @@ packages: dependency: transitive description: name: built_value - sha256: "169565c8ad06adb760c3645bf71f00bff161b00002cace266cad42c5d22a7725" + sha256: "31b7c748fd4b9adf8d25d72a4c4a59ef119f12876cf414f94f8af5131d5fa2b0" url: "https://pub.dev" source: hosted - version: "8.4.3" + version: "8.4.4" clock: dependency: transitive description: @@ -125,10 +125,10 @@ packages: dependency: "direct main" description: name: dart_style - sha256: "7a03456c3490394c8e7665890333e91ae8a49be43542b616e414449ac358acd4" + sha256: "5be16bf1707658e4c03078d4a9b90208ded217fb02c163e207d334082412f2fb" url: "https://pub.dev" source: hosted - version: "2.2.4" + version: "2.2.5" encrypt: dependency: transitive description: @@ -245,10 +245,10 @@ packages: dependency: "direct main" description: name: katana_router_annotation - sha256: "52daf808cdeccf56586c26287784b8365897dac33d52e4cd00738f7cbcedff52" + sha256: "74e93bdc82781d22efa49c168925735f1f867eb76c8d4a8cf66975466dc238b5" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.11.1" lints: dependency: transitive description: