| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- import 'package:analyzer/dart/element/element.dart';
- import 'package:build/build.dart';
- import 'package:router_gen/annotation/router_table.dart';
- import 'package:router_gen/model/router.dart';
- import 'package:source_gen/source_gen.dart';
- import 'package:path/path.dart' as Path;
- class RouterTableGenerator extends GeneratorForAnnotation<RouterTable> {
- @override
- generateForAnnotatedElement(
- Element element, ConstantReader annotation, BuildStep buildStep) {
- // print("find table annotation ${buildStep.inputId.path}");
- // print("RouterTable imports ${router.imports.toString()}");
- // print("RouterTable map ${router.routerMap.toString()}");
- String path = buildStep.inputId.path; // lib/xxx.dart
- String relatedFileName = Path.basename(path); // xxx.dart
- String relatedClassName = element.name;
- String imports = "";
- for (String import in router.imports) {
- imports = imports + "import '" + import + "';\n";
- }
- // all router's name
- List<String> routeNames = router.routerMap.keys.toList();
- String pathFiled = _generateFields(routeNames, router.routerMap);
- String register = _generateRouterRegister(routeNames, router.routerMap);
- // i2 school
- // import 'package:fluro/fluro.dart';
- // import 'package:school_parent/base_plugin/routes.dart';
- // example
- // import 'package:example/routes.dart';
- return """
- import '${relatedFileName}';
- import 'package:fluro/fluro.dart';
- import 'package:school_parent/base_plugin/routes.dart';
- ${imports}
- class \$${relatedClassName} implements ${relatedClassName} {
- ${pathFiled}
- @override
- void registerRoutes(Router router) {
- ${register}
- }
- }
- """;
- }
- _generateFields(List<String> routeNames, Map<String, Page> page) {
- String field = "";
- routeNames.forEach((e) {
- field += "static final ${e} = \"${page[e].path}\";\n";
- });
- return field;
- }
- _generateRouterRegister(List<String> routeNames, Map<String, Page> page) {
- String register = "";
- routeNames.forEach((e) {
- String params = "";
- page[e].arguments.forEach((element) {
- params +=
- "${element.name}: IRoutesProvider.getParams<${element.type}>(p, \"${element.name}\"),\n";
- });
- register += """
- router.define(${e},
- handler: Handler(
- handlerFunc: (c, p) => ${page[e].name}(
- ${params}
- ),
- ),
- );
- """;
- });
- return register;
- }
- }
|