I'm trying to build a website with a top navbar, content and a footer. I am using go router to navigate between different page content while retaining the navbar and footer.
This is my implementation, but I'm getting a blank screen with this log:
Go router file
final GlobalKey<NavigatorState> rootNavigatorKey =
GlobalKey<NavigatorState>(debugLabel: 'root');
final GlobalKey<NavigatorState> shellNavigatorKey =
GlobalKey<NavigatorState>(debugLabel: 'shell');
final GoRouter appRouter = GoRouter(
navigatorKey: rootNavigatorKey,
initialLocation: '/',
debugLogDiagnostics: true,
routes: <RouteBase>[
ShellRoute(
navigatorKey: shellNavigatorKey,
builder: (BuildContext context, GoRouterState state, Widget child) {
return HomeScreen(
key: state.pageKey,
pageContent: child, // <--- Passing the pageContent Widget to HomeScreen Widget
);
},
routes: <RouteBase>[
GoRoute(
name: 'home',
path: '/',
builder: (BuildContext context, GoRouterState state) {
return const HomePageContent();
},
),
GoRoute(
path: '/about',
name: 'about',
builder: (BuildContext context, GoRouterState state) {
return const AboutPageContent();
},
),
GoRoute(
path: '/contact',
name: 'contact',
builder: (BuildContext context, GoRouterState state) {
return const ContactPageContent();
},
),
],
)
],
);
HomeScreen file
class HomeScreen extends StatefulWidget {
final Widget pageContent;
const HomeScreen({super.key, required this.pageContent});
@override
State<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
@override
Widget build(BuildContext context) {
w = MediaQuery.of(context).size.width;
h = MediaQuery.of(context).size.height;
return Scaffold(
appBar: NavBar(),
body: Body(
pageContent: widget.pageContent, // <--- Passing the pageContent Widget to Body widget
),
);
}
}
Body widget file
class Body extends StatefulWidget {
final Widget pageContent;
const Body({super.key, required this.pageContent});
@override
State<Body> createState() => _BodyState();
}
class _BodyState extends State<Body> {
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child: ScreenTypeLayout.builder( // Responsive layout using flutter_responsive_builder
mobile: (context) => mobileBody(),
tablet: (context) => tabletBody(),
desktop: (context) => desktopBody(),
),
);
}
...
Widget desktopBody() {
bodyMarginWidth = w! / 6;
return Padding(
padding: EdgeInsets.symmetric(
horizontal: bodyMarginWidth!,
vertical: 25,
),
child: Column(
children: [
widget.pageContent, // <--- Using the pageContent widget
horizontalLine(),
Footer(),
],
),
);
}
...
}
HomePageContent file
class HomePageContent extends StatefulWidget {
const HomePageContent({super.key});
@override
State<HomePageContent> createState() => _HomePageContentState();
}
class _HomePageContentState extends State<HomePageContent> {
@override
Widget build(BuildContext context) {
return Container(
width: w! - 2 * bodyMarginWidth!, // dynamic width for mobile and desktop views
color: Colors.lime[100], // fill color
height: h! * 2,
);
}
}
Debug Console
=═╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
The following assertion was thrown during performResize():
Assertion failed:
overlay.dart:1064
constraints.biggest.isFinite
is not true
The relevant error-causing widget was:
Navigator-[LabeledGlobalKey<NavigatorState>#433fa shell]
Navigator:file:///C:/Users/laksh/AppData/Local/Pub/Cache/hosted/pub.dev/go_router-9.0.3/lib/src/builder.dart:302:30
builder.dart:302
When the exception was thrown, this was the stack:
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 288:49 throw_
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 29:3 assertFailed
packages/flutter/src/widgets/overlay.dart 1064:23 computeDryLayout
packages/flutter/src/rendering/box.dart 2397:12 performResize
packages/flutter/src/rendering/object.dart 2374:9 layout
packages/flutter/src/rendering/box.dart 2386:11 layout
packages/flutter/src/rendering/proxy_box.dart 122:7 performLayout
packages/flutter/src/rendering/object.dart 2395:7 layout
packages/flutter/src/rendering/box.dart 2386:11 layout
packages/flutter/src/rendering/proxy_box.dart 122:7 performLayout
packages/flutter/src/rendering/object.dart 2395:7 layout
packages/flutter/src/rendering/box.dart 2386:11 layout
packages/flutter/src/rendering/layout_helper.dart 52:10 layoutChild
packages/flutter/src/rendering/flex.dart 808:43 [_computeSizes]
packages/flutter/src/rendering/flex.dart 903:32 performLayout
packages/flutter/src/rendering/object.dart 2395:7 layout
packages/flutter/src/rendering/box.dart 2386:11 layout
packages/flutter/src/rendering/shifted_box.dart 238:5 performLayout
packages/flutter/src/rendering/object.dart 2395:7 layout
packages/flutter/src/rendering/box.dart 2386:11 layout
packages/flutter/src/widgets/layout_builder.dart 315:7 performLayout
packages/flutter/src/rendering/object.dart 2395:7 layout
packages/flutter/src/rendering/box.dart 2386:11 layout
packages/flutter/src/widgets/single_child_scroll_view.dart 491:7 performLayout
packages/flutter/src/rendering/object.dart 2395:7 layout
packages/flutter/src/rendering/box.dart 2386:11 layout
packages/flutter/src/rendering/proxy_box.dart 122:7 performLayout
packages/flutter/src/rendering/object.dart 2395:7 layout
packages/flutter/src/rendering/box.dart 2386:11 layout
packages/flutter/src/rendering/proxy_box.dart 122:7 performLayout
packages/flutter/src/rendering/object.dart 2395:7 layout
packages/flutter/src/rendering/box.dart 2386:11 layout
...
packages/flutter/src/rendering/proxy_box.dart 122:7 performLayout
packages/flutter/src/rendering/object.dart 2395:7 layout
packages/flutter/src/rendering/box.dart 2386:11 layout
packages/flutter/src/rendering/proxy_box.dart 122:7 performLayout
packages/flutter/src/rendering/object.dart 2395:7 layout
packages/flutter/src/rendering/box.dart 2386:11 layout
packages/flutter/src/rendering/view.dart 173:7 performLayout
packages/flutter/src/rendering/object.dart 2234:7 [_layoutWithoutResize]
packages/flutter/src/rendering/object.dart 1016:17 flushLayout
packages/flutter/src/rendering/binding.dart 492:19 drawFrame
packages/flutter/src/widgets/binding.dart 905:13 drawFrame
packages/flutter/src/rendering/binding.dart 358:5 [_handlePersistentFrameCallback]
packages/flutter/src/scheduler/binding.dart 1284:15 [_invokeFrameCallback]
packages/flutter/src/scheduler/binding.dart 1214:9 handleDrawFrame
packages/flutter/src/scheduler/binding.dart 939:7 <fn>
dart-sdk/lib/_internal/js_dev_runtime/private/isolate_helper.dart 48:19 internalCallback
The following RenderObject was being processed when the exception was fired: _RenderTheater#65a84 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE:
creator: _Theater ← Overlay-[LabeledGlobalKey<OverlayState>#e4f12] ← UnmanagedRestorationScope ←
_FocusInheritedScope ← Focus ← _FocusInheritedScope ← Focus ← FocusTraversalGroup ← AbsorbPointer
← Listener ← HeroControllerScope ← Navigator-[LabeledGlobalKey<NavigatorState>#433fa shell] ← ⋯
parentData: <none> (can use size)
constraints: BoxConstraints(0.0<=w<=1138.2, 0.0<=h<=Infinity)
size: MISSING
skipCount: 0
textDirection: ltr
This RenderObject had the following descendants (showing up to depth 5):
onstage 1: RenderIgnorePointer#1f0c9 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
child: RenderBlockSemantics#c664d NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
child: RenderExcludeSemantics#67745 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
child: RenderSemanticsGestureHandler#6bde9 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
child: RenderPointerListener#48c06 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
onstage 2: RenderSemanticsAnnotations#4df60 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
child: RenderOffstage#baa8d NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
child: RenderSemanticsAnnotations#d5360 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
child: RenderRepaintBoundary#8c24e NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
child: _RenderSnapshotWidget#10fa7 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
no offstage children
════════════════════════════════════════════════════════════════════════════════════════════════════
Another exception was thrown: BoxConstraints forces an infinite height.
23
Another exception was thrown: Assertion failed:
box.dart:1966
14
Another exception was thrown: Cannot hit test a render box that has never been laid out.
There is no error, if in gorouter file I provide HomePageContent()
directly to the pageContent
named parameter of HomeScreen()
in the builder.