flutter / flutter/flutter

[go_router] error when pushing Route with ShellRoute twice

Open
#185,011 2 comments 0 reactions 0 assignees View on GitHub
has reproducible steps p: go_router P2 package team-ecosystem triaged-ecosystem
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.