A powerful, but for humans, flutter router
- Static routes
- Dynamic routes
- Catch All
$ flutter pub add better_router void main() { final books = [ const Book(id: '3160', name: 'The Odyssey', author: 'Homer'), const Book( id: '8795', name: 'The Divine Comedy', author: 'Dante Alighieri'), ]; final betterRoutes = BetterRouter(routes: { '/': DefaultPageRouteBuilder((context) => Column(children: [ Text('root page'), TextButton( onPressed: () => Navigator.pushNamed(context, "/books"), child: Text("Books")), TextButton( onPressed: () => Navigator.pushNamed(context, "/this_page_does_not_exists"), child: Text("Go to not found page")), TextButton( onPressed: () => Navigator.pushNamed(context, "/custom_route_transition"), child: Text("Go to custom transition")) ])), '/home': DefaultPageRouteBuilder((_) => Text('home page')), '/books': DefaultPageRouteBuilder((context) => Column(children: [ for (var i = 0; i < books.length; i++) TextButton( onPressed: () => Navigator.pushNamed(context, "/books/${books[i].id}"), child: Text(books[i].name)) ])), r"\/books\/(?<id>.+)": DefaultPageRouteBuilder((context) { final params = RouteParams.of(context); return Column( children: [Text('book page'), Text("Book ID: ${params['id']}")], ); }), '/custom_route_transition': (RouteSettings settings) => PageRouteBuilder( pageBuilder: (context, animation, secondaryAnimation) => Text("Transition \o/"), transitionsBuilder: (context, animation, secondaryAnimation, child) { var begin = Offset(0.0, 1.0); var end = Offset.zero; var tween = Tween(begin: begin, end: end); var offsetAnimation = animation.drive(tween); return SlideTransition( position: offsetAnimation, child: child, ); }), '*matchAll': PageRouteBuilder((_) => Text('not found page')), }); runApp(MaterialApp(onGenerateRoute: betterRoutes)); }