router_table_generator.dart 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import 'package:analyzer/dart/element/element.dart';
  2. import 'package:build/build.dart';
  3. import 'package:router_gen/annotation/router_table.dart';
  4. import 'package:router_gen/model/router.dart';
  5. import 'package:source_gen/source_gen.dart';
  6. import 'package:path/path.dart' as Path;
  7. class RouterTableGenerator extends GeneratorForAnnotation<RouterTable> {
  8. @override
  9. generateForAnnotatedElement(
  10. Element element, ConstantReader annotation, BuildStep buildStep) {
  11. // print("find table annotation ${buildStep.inputId.path}");
  12. // print("RouterTable imports ${router.imports.toString()}");
  13. // print("RouterTable map ${router.routerMap.toString()}");
  14. String path = buildStep.inputId.path; // lib/xxx.dart
  15. String relatedFileName = Path.basename(path); // xxx.dart
  16. String relatedClassName = element.name;
  17. String imports = "";
  18. for (String import in router.imports) {
  19. imports = imports + "import '" + import + "';\n";
  20. }
  21. // all router's name
  22. List<String> routeNames = router.routerMap.keys.toList();
  23. String pathFiled = _generateFields(routeNames, router.routerMap);
  24. String register = _generateRouterRegister(routeNames, router.routerMap);
  25. // i2 school
  26. // import 'package:fluro/fluro.dart';
  27. // import 'package:school_parent/base_plugin/routes.dart';
  28. // example
  29. // import 'package:example/routes.dart';
  30. return """
  31. import '${relatedFileName}';
  32. import 'package:fluro/fluro.dart';
  33. import 'package:school_parent/base_plugin/routes.dart';
  34. ${imports}
  35. class \$${relatedClassName} implements ${relatedClassName} {
  36. ${pathFiled}
  37. @override
  38. void registerRoutes(Router router) {
  39. ${register}
  40. }
  41. }
  42. """;
  43. }
  44. _generateFields(List<String> routeNames, Map<String, Page> page) {
  45. String field = "";
  46. routeNames.forEach((e) {
  47. field += "static final ${e} = \"${page[e].path}\";\n";
  48. });
  49. return field;
  50. }
  51. _generateRouterRegister(List<String> routeNames, Map<String, Page> page) {
  52. String register = "";
  53. routeNames.forEach((e) {
  54. String params = "";
  55. page[e].arguments.forEach((element) {
  56. params +=
  57. "${element.name}: IRoutesProvider.getParams<${element.type}>(p, \"${element.name}\"),\n";
  58. });
  59. register += """
  60. router.define(${e},
  61. handler: Handler(
  62. handlerFunc: (c, p) => ${page[e].name}(
  63. ${params}
  64. ),
  65. ),
  66. );
  67. """;
  68. });
  69. return register;
  70. }
  71. }