Get started

Sealed routes, exhaustive builds

Navigation is a switch over a sealed type. Add a route and the compiler
finds every place that must handle it — no runtime “unknown route” left.

The stack is a value

Your history is a List of route objects. Push, pop, and set are list
operations — testable without a widget tree, restorable across process
death.

Every navigation. One observer.

Register a standard NavigatorObserver once — it sees tab switches and
adaptive in-place changes that produce no route event in other routers.

Zero codegen

No build_runner, no generated files, no magic strings. Routes are plain
Dart classes you already know how to write.

Learn

Migrate