Route Map
Generate route paths map for Flutter Navigator 2 using annotation.
README Translation
Table of Contents
Tutorial
Installation
dependencies:
# add route_map to your dependencies
route_map:
dev_dependencies:
# add the generator to your dev_dependencies
route_map_generator:
# add build runner if not already added
build_runner:
Setup
- First, define Route Generator with RouteMapInit annotation.
import 'route_map.config.dart';
@RouteMapInit()
Route? onGenerateRoute(RouteSettings routeSettings) => $onGenerateRoute(routeSettings);
- Redirection changes the location to a new one based on application state. For example, redirection can be used to display a sign-in screen if the user is not logged in.
import 'route_map.config.dart';
@RouteMapInit()
Route? onGenerateRoute(RouteSettings routeSettings) => $onGenerateRoute(routeSettings,redirect:(path){
bool isLogin = false;
if(isLogin && RouteMaps.homePage == path){
return RouteMap.login;
}
return null;
});
- Define the route builder in the
MaterialApp
widget
MaterialApp(
initialRoute: RouteMaps.splash, // defining the initial page
onGenerateRoute: onGenerateRoute
);
- Annotate your pages with
@RouteMap
and let the generator do the work.
Note: Use "/" to specify the root directory. To create a root-independent page, there must be no "/" at the beginning.
@RouteMap(name: "splash")
class SplashPage extends StatefulWidget {}
@RouteMap(name: "/")
class HomePage extends StatefulWidget {}
@RouteMap(name: "/search", fullScreenDialog: true)
class SearchPage extends StatefulWidget {}
@RouteMap(name: "/detail", path:"/detail/:id/:name")
class DetailPage extends StatefulWidget {}
- You can take advantage of the class object to be redirected when passing data between pages. You can use all the functions of the standart Navigator class.
DetailPageRoute(id: "0",name: "push").push(context);
DetailPageRoute(id: "0",name: "push").popAndPush(context);
- Redirection between pages using standart Navigator class
The arguments field can be used to send values during routing.
Navigator.of(context)
.pushNamed(RouteMaps.detailPage, arguments: "value");
Navigator.of(context)
.pushNamed(RouteMaps.detailPage, arguments: {"val1":"Easy","val2":"Route"});
- Reading the values with
routeArgs()
passed from previous screen via Navigator.
String value = context.routeArgs();
String val1 = context.routeArgs()["val1"];
String val2 = context.routeArgs()["val2"];
- @RouteMapArg() attribute should be used for custom model.
@RouteMapArg()
class CustomModel {
String name;
CustomModel({required this.name});
}
- Customized builder is available. For example, you might want to wrap your page with ChangeNotifierProvider.
Widget homeBuilder(Widget child) {
return ChangeNotifierProvider(
create: (_) => HomeViewModel(),
child: child,
);
}
@RouteMap(name: "home", builder: homeBuilder)
class HomePage extends StatefulWidget {
const HomePage({Key? key}) : super(key: key);
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
I need help.
URL-based page redirection is still experimental. There are issues regarding type conversions, and it hasn't been thoroughly tested yet.
I need assistance with type conversions in URL-based page redirection. It supports int, double, string, and bool.
Run the generator
Use the watch
flag to watch the files' system for edits and rebuild as necessary.
flutter packages pub run build_runner watch --delete-conflicting-outputs
if you want the generator to run one time and exits use
flutter packages pub run build_runner build --delete-conflicting-outputs
Problems with the generation?
Make sure you always Save your files before running the generator, if that does not work you can always try to clean and rebuild.
flutter packages pub run build_runner clean