MorphNavigatorObserver class
Drop-in NavigatorObserver that feeds Morph's behavior store with every route transition. Plug it into any router that accepts a NavigatorObserver:
// GoRouter
GoRouter(
observers: [MorphNavigatorObserver.instance],
routes: [...],
)
// Vanilla MaterialApp
MaterialApp(
navigatorObservers: [MorphNavigatorObserver.instance],
routes: {...},
)
The observer is a singleton — MorphProvider auto-attaches its
internal BehaviorDB at boot, so the dev never has to wire that part
manually. Routes without a name (or with an empty one) are ignored —
nothing useful to report on anonymous routes.
Each transition records:
• trackSequence(from, to) — the from → to pair for sequence mining
• trackClick(to, 'navigation') — counts the destination as a visit
• trackTimeSpent(from, ms) — accumulates dwell time on the previous
page when the user navigates away
The observer also keeps an in-memory sessionHistory (the route names
visited in order, this session) — read it from
AnalyticsReporter._buildPayload to compute average navigation depth.
- Inheritance
-
- Object
- NavigatorObserver
- MorphNavigatorObserver
Constructors
- Public so tests can build their own instance with a stubbed BehaviorDB.
Properties
- currentRoute → String?
-
Name of the route the user is currently on, or null when the
observer has never seen a transition (boot before first push). Same
as
sessionHistory.lastwhen populated; provided as a getter so callers can read it without bothering with bounds checks.no setter - hashCode → int
-
The hash code for this object.
no setterinherited
-
The navigator that the observer is observing, if any.
no setterinherited
- runtimeType → Type
-
A representation of the runtime type of the object.
no setterinherited
-
sessionHistory
→ List<
String> -
Ordered list of route names visited this session — front of the list
is the entry route, back is the current route. Reset on detach (i.e.
app dispose). Read by AnalyticsReporter for navigation-depth metrics.
final
Methods
-
attach(
BehaviorDB db) → void - Wired by MorphProvider once the local store is initialized. Safe to call multiple times — subsequent attaches replace the ref (handy for hot reload scenarios).
-
detach(
) → void - Called by MorphProvider on dispose so the observer doesn't keep a dangling reference to a closed Hive store.
-
didChangeTop(
Route topRoute, Route? previousTopRoute) → void -
The top most route has changed.
inherited
-
didPop(
Route route, Route? previousRoute) → void -
The Navigator popped
route.override -
didPush(
Route route, Route? previousRoute) → void -
The Navigator pushed
route.override -
didRemove(
Route route, Route? previousRoute) → void -
The Navigator removed
route.inherited -
didReplace(
{Route? newRoute, Route? oldRoute}) → void -
The Navigator replaced
oldRoutewithnewRoute.override -
didStartUserGesture(
Route route, Route? previousRoute) → void -
The Navigator's routes are being moved by a user gesture.
inherited
-
didStopUserGesture(
) → void -
User gesture is no longer controlling the Navigator.
inherited
-
noSuchMethod(
Invocation invocation) → dynamic -
Invoked when a nonexistent method or property is accessed.
inherited
-
toString(
) → String -
A string representation of this object.
inherited
Operators
-
operator ==(
Object other) → bool -
The equality operator.
inherited
Static Properties
- instance → MorphNavigatorObserver
-
Process-wide singleton. MorphProvider calls attach on it
during bootstrap and detach on dispose. Apps can pass this same
instance to multiple routers (e.g. nested navigators) without issue.
final