[go_router] error when pushing Route with ShellRoute twice
- Dominant language
- Dart
- Stars
- 179k
- Forks
- 31.1k
- PR merge metrics
- PR metrics pending
Description
### Steps to reproduce
1. run the provided code
2. tap `push a`, then `push b`, then `push a` again
### Expected results
Navigation Stack is Root -> ARoute -> BRoute -> ARoute without errors
### Actual results
Application throws error (see error log below). This only happens when the route is wrapped in a ShellRoute.
### Code sample
Code sample
```dart
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
part 'main.g.dart';
void main() {
runApp(const MyApp());
}
final router = GoRouter(routes: $appRoutes);
@TypedGoRoute(
path: '/',
routes: [
TypedShellRoute(
routes: [
TypedGoRoute(path: '/a'),
],
),
TypedShellRoute(
routes: [
TypedGoRoute(path: '/b'),
],
),
],
)
class RootRoute extends GoRouteData with $RootRoute {
RootRoute();
@override
Widget build(BuildContext context, GoRouterState state) {
return DebugScreen();
}
}
class AShellRoute extends ShellRouteData {
@override
Widget builder(BuildContext context, GoRouterState state, Widget navigator) {
return navigator;
}
}
class ARoute extends GoRouteData with $ARoute {
@override
Widget build(BuildContext context, GoRouterState state) {
return DebugScreen(id: "A");
}
}
class BShellRoute extends ShellRouteData {
@override
Widget builder(BuildContext context, GoRouterState state, Widget navigator) {
return navigator;
}
}
class BRoute extends GoRouteData with $BRoute {
@override
Widget build(BuildContext context, GoRouterState state) {
return DebugScreen(id: "B");
}
}
class DebugScreen extends StatelessWidget {
final String? id;
const DebugScreen({this.id, super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Center(
child: Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisSize: .min,
children: [
if (id != null)
Padding(
padding: const EdgeInsets.all(16.0),
child: Text(id!),
),
ElevatedButton(
onPressed: () {
ARoute().push(context);
},
child: Text("push a"),
),
ElevatedButton(
onPressed: () {
BRoute().push(context);
},
child: Text("push b"),
),
],
),
),
),
),
);
}
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return HeroControllerScope.none(
child: MaterialApp.router(
routerConfig: router,
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: .fromSeed(seedColor: Colors.deepPurple),
),
),
);
}
}
```
### Screenshots or Video
_No response_
### Logs
Logs
```console
======== Exception caught by widgets library =======================================================
The following assertion was thrown building HeroControllerScope:
'package:flutter/src/widgets/navigator.dart': Failed assertion: line 4049 pos 18: '!keyReservation.contains(key)': is not true.
Either the assertion indicates an error in the framework itself, or we should provide substantially more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
https://github.com/flutter/flutter/issues/new?template=02_bug.yml
The relevant error-causing widget was:
MaterialApp MaterialApp:file:///C:/Users/TimBa/Coding/Workspace/go_router_same_routes_test/lib/main.dart:112:26
When the exception was thrown, this was the stack:
#2 NavigatorState._debugCheckDuplicatedPageKeys. (package:flutter/src/widgets/navigator.dart:4049:18)
#3 NavigatorState._debugCheckDuplicatedPageKeys (package:flutter/src/widgets/navigator.dart:4054:6)
#4 NavigatorState._updatePages. (package:flutter/src/widgets/navigator.dart:4115:7)
#5 NavigatorState._updatePages (package:flutter/src/widgets/navigator.dart:4118:6)
#6 NavigatorState.didUpdateWidget (package:flutter/src/widgets/navigator.dart:4033:7)
#7 StatefulElement.update (package:flutter/src/widgets/framework.dart:5991:55)
#8 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15)
#9 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5841:16)
#10 Element.rebuild (package:flutter/src/widgets/framework.dart:5529:7)
#11 ProxyElement.update (package:flutter/src/widgets/framework.dart:6149:5)
#12 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15)
#13 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5841:16)
#14 Element.rebuild (package:flutter/src/widgets/framework.dart:5529:7)
#15 ProxyElement.update (package:flutter/src/widgets/framework.dart:6149:5)
#16 _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:108:11)
#17 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15)
#18 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5841:16)
#19 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5982:11)
#20 Element.rebuild (package:flutter/src/widgets/framework.dart:5529:7)
#21 StatefulElement.update (package:flutter/src/widgets/framework.dart:6007:5)
#22 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15)
#23 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5841:16)
#24 Element.rebuild (package:flutter/src/widgets/framework.dart:5529:7)
#25 ProxyElement.update (package:flutter/src/widgets/framework.dart:6149:5)
#26 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15)
#27 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5841:16)
#28 Element.rebuild (package:flutter/src/widgets/framework.dart:5529:7)
#29 StatelessElement.update (package:flutter/src/widgets/framework.dart:5895:5)
#30 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15)
#31 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5841:16)
#32 Element.rebuild (package:flutter/src/widgets/framework.dart:5529:7)
#33 ProxyElement.update (package:flutter/src/widgets/framework.dart:6149:5)
#34 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15)
#35 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5841:16)
#36 Element.rebuild (package:flutter/src/widgets/framework.dart:5529:7)
#37 ProxyElement.update (package:flutter/src/widgets/framework.dart:6149:5)
#38 Element.updateChild (package:flutter/src/widgets/framework.dart:4037:15)
#39 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5841:16)
#40 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5982:11)
#41 Element.rebuild (package:flutter/src/widgets/framework.dart:5529:7)
#42 BuildScope._tryRebuild (package:flutter/src/widgets/framework.dart:2750:15)
#43 BuildScope._flushDirtyElements (package:flutter/src/widgets/framework.dart:2807:11)
#44 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:3111:18)
#45 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:1302:21)
#46 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:495:5)
#47 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1430:15)
#48 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1345:9)
#49 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:1198:5)
#50 _invoke (dart:ui/hooks.dart:356:13)
#51 PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:444:5)
#52 _drawFrame (dart:ui/hooks.dart:328:31)
(elided 2 frames from class _AssertionError)
====================================================================================================
```
### Flutter Doctor output
Doctor output
```console
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel stable, 3.41.2, on Microsoft Windows [Version 10.0.26200.8037], locale de-DE)
[√] Windows Version (11 Pro 64-bit, 25H2, 2009)
[√] Android toolchain - develop for Android devices (Android SDK version 35.0.0)
[√] Chrome - develop for the web
[√] Visual Studio - develop Windows apps (Visual Studio Build Tools 2019 16.11.27)
[√] Connected device (4 available)
[√] Network resources
• No issues found!
```
Contributor guide
Assessment
This issue has not been assessed yet.