NavLens
Runtime navigation visualizer for Flutter. See exactly how your app moves between screens, live, inside the app.
NavLens turns invisible Navigator events into a debug overlay that shows
the current stack, a tree of visited screens, a chronological timeline of
pushes and pops, and one-tap JSON / PNG export — without pulling in any
dependencies.
Why
Flutter navigation is hard to debug. You end up guessing at the stack,
scattering print statements, or wading through framework logs. NavLens
makes the flow visible:
- what screen is active right now
- how screens connect to each other
- what happened, step by step, to get here
Install
Add to pubspec.yaml:
dependencies:
navlens:
git: https://github.com/Morena96/navlens.git
Two-line setup
import 'package:flutter/material.dart';
import 'package:navlens/navlens.dart';
MaterialApp(
navigatorObservers: [NavLensObserver()],
builder: (context, child) =>
NavLens.wrap(child: child ?? const SizedBox.shrink()),
home: const HomeScreen(),
);
That's it. A draggable NavLens button appears in debug and profile builds (hidden automatically in release). Tap it to open the inspector.
Using
builder:places the overlay inside theMaterialAppso it has access to the Navigator, theme,MediaQuery, andScaffoldMessengerwhile still floating above every screen.
What you get
Current stack
Shows the live Navigator stack, bottom to top, with the visible route
highlighted.
Tree view
A historical tree of every screen the app has pushed onto another, rendered with the familiar indent guides:
Home
├── Chat
└── Profile
└── Settings
The currently active node is highlighted.
Timeline
A reverse-chronological list of every push, pop, replace and remove,
with icons, previous-route context and timestamps.
Export
The inspector's app bar has one-tap actions to:
- Copy the navigation graph as JSON (schema-versioned, stable)
- Capture the tree view as a PNG
You can also call the APIs directly:
final json = const NavLensJsonExporter().export();
final pngBytes = await const NavLensPngExporter().export(
boundaryKey: myRepaintBoundaryKey,
);
Works with any router
NavLensObserver is a plain NavigatorObserver, so it slots straight into
MaterialApp.navigatorObservers, go_router's observers, auto_route's
navigatorObservers, or any other router that builds on Navigator 1.0
under the hood.
Platform support
NavLens is pure Flutter — no platform channels, no plugins — so it runs everywhere Flutter does:
| Android | iOS | Web | macOS | Windows | Linux |
|---|---|---|---|---|---|
| yes | yes | yes | yes | yes | yes |
Example app
The example/ folder contains a runnable demo with:
- a tabbed
Home(Feed + Chat) - a
Home → Profile → Settingspush chain matching the spec tree - a
Detailscreen with buttons forpush,pushReplacement,pushAndRemoveUntilandpop
cd example
flutter run
V1 feature set
- Live current-stack view
- Historical flow tree
- Push / pop / replace / remove timeline
- Draggable debug overlay button (release-safe)
- JSON export (schema-versioned)
- PNG export via
RepaintBoundary
Roadmap
- Full declarative navigation graph (complete app flow, ahead of time)
- Automatic route discovery without running the app
- CLI for generating graphs offline
- Diff between planned vs. actual navigation
License
MIT.
Libraries
- NavLens — runtime navigation visualizer for Flutter apps.