github:
https://github.com/alibaba-flutter/annotation_route
demo:
https://github.com/anymyna/flutter-examples/annotation_route_demo
效果:
步骤:
1、 增加依赖 annotation_route和build_runner
dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^0.1.2
annotation_route: ^0.0.2
dev_dependencies:
flutter_test:
sdk: flutter
build_runner: ^1.0.0
2、跳转进入的路由页面注解@ARoute
@ARoute(url: 'page://page2')
class SecondPage extends StatelessWidget {
dynamic option;
SecondPage(this.option);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Page 2"),
),
body: Center(
child: Column(
children: <Widget>[
RaisedButton(
onPressed: () {
//导航到新路由
Navigator.push( context,
MaterialPageRoute(builder: (context) {
return HomePage();
}));
},
child: Text("Home Page"),
),
Text("url "+ option.urlpattern,
textAlign: TextAlign.left,
),
Text("params "+option.query[ 'test' ],
textAlign: TextAlign.left,
),
],
),
),
);
}
}
3、路由管理类ARouteRoot
@ARouteRoot()
class AppRoute {
static Widget getPage(String urlString, Map<String, dynamic> query) {
ARouterInternalImpl internal = ARouterInternalImpl();
ARouterResult routeResult = internal.findPage(ARouteOption(urlString, query), MyRouteOption(urlString, query));
if(routeResult.state == ARouterResultState.FOUND) {
return routeResult.widget;
}
return Text('NOT FOUND');
}
}
class MyRouteOption {
String urlpattern;
Map<String, dynamic> query;
MyRouteOption(this.urlpattern, this.query );
}
4、注解文件的生成
构建:
flutter packages pub run build_runner build --delete-conflicting-outputs
清除:
flutter packages pub run build_runner clean
建议在构建前,执行清除操作
5、动态路由跳转
Navigator.of(context).push(PageRouteBuilder(
opaque: false,
pageBuilder: (_, __, ___) {
return AppRoute.getPage('page://page2', {'test': 'hi'});
},
));