diff --git a/packages/go_router/CHANGELOG.md b/packages/go_router/CHANGELOG.md index 97d8dfe35c3..19a6cdf7061 100644 --- a/packages/go_router/CHANGELOG.md +++ b/packages/go_router/CHANGELOG.md @@ -1,3 +1,7 @@ +## 14.8.1 + +- Secured canPop method for the lack of matches in routerDelegate's configuration. + ## 14.8.0 - Adds `preload` parameter to `StatefulShellBranchData.$branch`. diff --git a/packages/go_router/lib/src/delegate.dart b/packages/go_router/lib/src/delegate.dart index 3b90297be28..aa95fdb39eb 100644 --- a/packages/go_router/lib/src/delegate.dart +++ b/packages/go_router/lib/src/delegate.dart @@ -81,6 +81,9 @@ class GoRouterDelegate extends RouterDelegate if (navigatorKey.currentState?.canPop() ?? false) { return true; } + if (currentConfiguration.matches.isEmpty) { + return false; + } RouteMatchBase walker = currentConfiguration.matches.last; while (walker is ShellRouteMatch) { if (walker.navigatorKey.currentState?.canPop() ?? false) { diff --git a/packages/go_router/pubspec.yaml b/packages/go_router/pubspec.yaml index 636d2637eb9..86b0e9643fa 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: 14.8.0 +version: 14.8.1 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/delegate_test.dart b/packages/go_router/test/delegate_test.dart index 75db026fca6..ad628610fd1 100644 --- a/packages/go_router/test/delegate_test.dart +++ b/packages/go_router/test/delegate_test.dart @@ -317,6 +317,20 @@ void main() { expect(goRouter.routerDelegate.canPop(), true); }, ); + testWidgets( + 'It should return false if there are no matches in the stack', + (WidgetTester tester) async { + final GoRouter goRouter = GoRouter( + initialLocation: '/', + routes: [], + ); + addTearDown(goRouter.dispose); + await tester.pumpWidget(MaterialApp.router(routerConfig: goRouter)); + await tester.pumpAndSettle(); + expect(goRouter.routerDelegate.currentConfiguration.matches.length, 0); + expect(goRouter.routerDelegate.canPop(), false); + }, + ); }); group('pushReplacement', () {