diff --git a/packages/go_router/CHANGELOG.md b/packages/go_router/CHANGELOG.md index 09b0e883479a..a8a2c2d3944c 100644 --- a/packages/go_router/CHANGELOG.md +++ b/packages/go_router/CHANGELOG.md @@ -1,3 +1,7 @@ +## 15.1.2 + +- Fixes focus request propagation from `GoRouter` to `Navigator` by properly handling the `requestFocus` parameter. + ## 15.1.1 - Adds missing `caseSensitive` to `GoRouteData.$route`. diff --git a/packages/go_router/lib/src/builder.dart b/packages/go_router/lib/src/builder.dart index 4258bc7ec83b..22c2cbf2ab53 100644 --- a/packages/go_router/lib/src/builder.dart +++ b/packages/go_router/lib/src/builder.dart @@ -121,6 +121,7 @@ class RouteBuilder { configuration: configuration, errorBuilder: errorBuilder, errorPageBuilder: errorPageBuilder, + requestFocus: requestFocus, ), ); } @@ -138,6 +139,7 @@ class _CustomNavigator extends StatefulWidget { required this.configuration, required this.errorBuilder, required this.errorPageBuilder, + required this.requestFocus }); final GlobalKey navigatorKey; @@ -155,6 +157,7 @@ class _CustomNavigator extends StatefulWidget { final String? navigatorRestorationId; final GoRouterWidgetBuilder? errorBuilder; final GoRouterPageBuilder? errorPageBuilder; + final bool requestFocus; @override State createState() => _CustomNavigatorState(); @@ -295,6 +298,7 @@ class _CustomNavigatorState extends State<_CustomNavigator> { // This is used to recursively build pages under this shell route. errorBuilder: widget.errorBuilder, errorPageBuilder: widget.errorPageBuilder, + requestFocus: widget.requestFocus ); }, ); @@ -437,6 +441,7 @@ class _CustomNavigatorState extends State<_CustomNavigator> { controller: _controller!, child: Navigator( key: widget.navigatorKey, + requestFocus: widget.requestFocus, restorationScopeId: widget.navigatorRestorationId, pages: _pages!, observers: widget.observers, diff --git a/packages/go_router/pubspec.yaml b/packages/go_router/pubspec.yaml index 31e9debc0b99..dcf98a3d9839 100644 --- a/packages/go_router/pubspec.yaml +++ b/packages/go_router/pubspec.yaml @@ -1,7 +1,7 @@ name: go_router description: A declarative router for Flutter based on Navigation 2 supporting deep linking, data-driven routes and more -version: 15.1.1 +version: 15.1.2 repository: https://github.com/flutter/packages/tree/main/packages/go_router issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+go_router%22 diff --git a/packages/go_router/test/builder_test.dart b/packages/go_router/test/builder_test.dart index 7b260d5250ea..f5943220bcfb 100644 --- a/packages/go_router/test/builder_test.dart +++ b/packages/go_router/test/builder_test.dart @@ -383,6 +383,57 @@ void main() { (shellNavigatorKey.currentWidget as Navigator?)?.restorationScopeId, 'scope1'); }); + + testWidgets('GoRouter requestFocus defaults to true', + (WidgetTester tester) async { + final router = GoRouter( + routes: [ + GoRoute( + path: '/', + builder: (context, state) => const Scaffold( + body: Center(child: Text('Home')), + ), + ), + ], + ); + + await tester.pumpWidget( + MaterialApp.router( + routerConfig: router, + ), + ); + + addTearDown(() => router.dispose()); + + final navigator = tester.widget(find.byType(Navigator)); + expect(navigator.requestFocus, isTrue); + }); + + testWidgets('GoRouter requestFocus can be set to false', + (WidgetTester tester) async { + final router = GoRouter( + routes: [ + GoRoute( + path: '/', + builder: (context, state) => const Scaffold( + body: Center(child: Text('Home')), + ), + ), + ], + requestFocus: false, + ); + + await tester.pumpWidget( + MaterialApp.router( + routerConfig: router, + ), + ); + + addTearDown(() => router.dispose()); + + final navigator = tester.widget(find.byType(Navigator)); + expect(navigator.requestFocus, isFalse); + }); }); }