safe_route 0.0.4 copy "safe_route: ^0.0.4" to clipboard
safe_route: ^0.0.4 copied to clipboard

A type-safe Flutter navigation package that adds compile-time checks for route arguments and results.

safe_route #

pub.dev

safe_route is a simple and type-safe navigation helper for Flutter applications.
No more dynamic arguments and runtime crashes — everything is strictly typed.


Why? #

Default Flutter navigation with Navigator.pushNamed requires Object? arguments.
It’s flexible but unsafe:

Navigator.of(context).pushNamed('/user', arguments: 123); // ❌ runtime crash if page expects String

With safe_route, both arguments and results are typed at compile-time.


Features #

  • ✅ Type-safe arguments and results
  • ✅ Nested routes (SafeNestedRoute)
  • ✅ Strongly typed navigation helpers
  • ✅ Clean, declarative API
  • ✅ Simple integration with MaterialApp

Installation #

Add to pubspec.yaml:

dependencies:
  safe_route: ^<latest_version>

Quick Start #

1. Define routes #

final homeRoute = SafeRoute<Null, Null>(
  name: '/',
  builder: (_, __) => const HomePage(),
);

final settingsRoute = SafeRoute<Null, bool>(
  name: '/settings',
  builder: (_, __) => const SettingsPage(),
);

2. Register them in SafeRouter #

final router = SafeRouter()
  ..registerAll([homeRoute, settingsRoute]);

MaterialApp(
  initialRoute: homeRoute.fullPath,
  onGenerateRoute: router.onGenerateRoute,
);

3. Navigate safely #

// Navigate without arguments
Navigator.of(context).pushRoute(homeRoute, null);

// Navigate with arguments
Navigator.of(context).pushRoute(userRoute, "Alex");

// Return a result
Navigator.of(context).pop(true);

// Receive a result
final isDark = await Navigator.of(context).pushRoute(settingsRoute, null);

safe_route provides a convenient extension AppRouteNavigation on NavigatorState with typed wrappers around standard navigation methods:

Flutter API method safe_route method
pushNamed pushRoute
popAndPushNamed popAndPushRoute
pushNamedAndRemoveUntil pushRouteAndRemoveUntil
pushReplacementNamed pushReplacementRoute
restorablePushNamed restorablePushRoute
restorablePopAndPushNamed restorablePopAndPushRoute
restorablePushNamedAndRemoveUntil restorablePushRouteAndRemoveUntil
restorablePushReplacementNamed restorablePushReplacementRoute

All methods ensure arguments and results are strictly typed.


Nested Routes #

You can group routes together with SafeNestedRoute:

final profileRoute = SafeRoute<Null, Null>(
  name: '/profile',
  builder: (_, __) => const ProfilePage(),
);

final userRoutes = SafeNestedRoute(
  name: '/user',
  routes: [profileRoute, settingsRoute],
);

Full Example #

final loginRoute = SafeRoute<Null, String>(
  name: '/',
  builder: (_, __) => const LoginPage(),
);

final homeRoute = SafeRoute<String, void>(
  name: '/home',
  builder: (_, username) => HomePage(username: username),
);

final settingsRoute = SafeRoute<Null, bool>(
  name: '/settings',
  builder: (_, __) => const SettingsPage(),
);

class MyApp extends StatelessWidget {
  MyApp({super.key})
      : router = SafeRouter()..registerAll([loginRoute, homeRoute, settingsRoute]);

  final SafeRouter router;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      onGenerateRoute: router.onGenerateRoute,
    );
  }
}
3
likes
0
points
7
downloads

Publisher

verified publishercontributors.info

Weekly Downloads

A type-safe Flutter navigation package that adds compile-time checks for route arguments and results.

Homepage
Repository (GitHub)
View/report issues

Topics

#navigation #routing #typesafety #flutter

License

unknown (license)

Dependencies

collection, flutter

More

Packages that depend on safe_route