Flutter for OpenHarmony: Flutter 三方库 source_gen 自动化代码生成的幕后英雄(打造自己的 build_runner 插件)

Flutter for OpenHarmony: Flutter 三方库 source_gen 自动化代码生成的幕后英雄(打造自己的 build_runner 插件)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net

在这里插入图片描述

前言

在 OpenHarmony 应用开发中,我们经常使用 json_serializableriverpod 等库,它们通过 dart run build_runner build 命令自动生成大量的样板代码。这些库背后的核心引擎正是 source_gen

如果你想为鸿蒙项目编写一些“黑科技”工具,例如:

  • 扫描所有包含 @OhosAbility 注解的类并自动生成路由表。
  • 根据自定义注解自动生成跨端桥接代码。
  • 自动为 Data 类生成字段映射器。

那么,掌握 source_gen 是从“代码搬运工”走向“架构设计师”的必经之路。

一、核心原理解析

source_gen 为 Dart 的 build 库提供了更高层的抽象。它通过分析 AST(抽象语法树)来识别注解,并生成对应的字符串代码。

分析注解

源代码 (.dart)

Build Runner

source_gen Generator

Element Annotation Analyzer

生成逻辑代码字符串

生成的辅助文件 (.g.dart)

二、核心 API 实战

2.1 定义自定义注解

在代码生成的语境下,注解通常是一个简单的 const 类,用于在源代码中标记需要被扫描的目标。

classOhosRoute{finalString path;finalString title;// 💡 注解必须有 const 构造函数,因为它运行在编译期constOhosRoute({required this.path,this.title =""});}// 使用方式:@OhosRoute(path:'/details', title:'详情页')classDetailAbility{}
在这里插入图片描述

2.2 实现生成器 (Generator)

生成器是 source_gen 的核心。它会拿到被注解标记的元素,并返回一个生成的代码字符串。

import'package:source_gen/source_gen.dart';import'package:analyzer/dart/element/element.dart';classOhosRouteGeneratorextendsGeneratorForAnnotation<OhosRoute>{@overrideStringgenerateForAnnotatedElement(Element element,ConstantReader annotation,BuildStep buildStep ){// 1. 💡 获取被注解类的名称final className = element.name;// 2. 💡 从注解中读取参数值final path = annotation.read('path').stringValue;// 3. 💡 返回生成的代码字符串(将写入 .g.dart)return'void goTo$className(BuildContext context) => Navigator.pushNamed(context, "$path");';}}
在这里插入图片描述

2.3 配置 Builder 文件

要在项目中使用,需在 build.yaml 中配置:

builders:ohos_route_builder:import:"package:my_tool/builder.dart"builder_factories:["ohosRouteBuilder"]build_extensions:{".dart":[".ohos.g.dart"]}
在这里插入图片描述

三、OpenHarmony 平台适配

3.1 跨语言元数据提取

💡 技巧:在鸿蒙开发中,如果需要将 Dart 的接口定义同步给 ArkTS。你可以利用 source_gen 扫描 Dart 定义,并自动生成一份对应的 .ts 声明文件,从而保证两端接口的绝对同步。

3.2 离线代码生成优势

source_gen 的所有操作都在编译前完成。生成的代码是纯正的 Dart 源码,不包含任何运行时反射逻辑。这完美契合了鸿蒙系统的 AOT 安全与性能要求。

四、完整实战示例:鸿蒙权限声明自动检查器

本示例模拟了生成器在扫描到带权限注解的类后,如何自动生成一套配套的权限查验逻辑。

import'package:source_gen/source_gen.dart';/// 💡 模拟生成器产出 .g.dart 代码的拼接逻辑classOhosPermissionGenerator{StringgenerateCheckFunction(String className,List<String> permissions){final code =StringBuffer(); code.writeln('// 🛡️ 为 $className 自动生成的权限预检函数'); code.writeln('Future<bool> check${className}Auth() async {');for(var p in permissions){ code.writeln(' // 调用鸿蒙底层 API 校验权限: $p'); code.writeln(' if (!await OhosInternal.hasPermission("$p")) return false;');} code.writeln(' return true;'); code.writeln('}');return code.toString();}}voidmain(){final gen =OhosPermissionGenerator();// 生成代码字符串final generatedCode = gen.generateCheckFunction('CameraAbility',['ohos.camera','ohos.mic']);print(generatedCode);}
在这里插入图片描述

五、总结

source_gen 软件包是构建 OpenHarmony 高级开发工具的基石。它赋予了开发者“通过代码编写代码”的超能力。在追求“零重复劳动”的鸿蒙工业化开发流程中,学会利用 source_gen 构建自动化的元数据处理流程,能极大地提升项目的稳定性和开发效率。

Read more

【JAVA 进阶】深入拆解SpringBoot自动配置:从原理到实战的完整指南

【JAVA 进阶】深入拆解SpringBoot自动配置:从原理到实战的完整指南

文章目录 * 前言 * 第一章 初识SpringBoot自动配置:什么是“约定优于配置” * 1.1 传统Spring配置的痛点 * 1.2 SpringBoot自动配置的核心价值 * 1.3 自动配置的核心特性 * 第二章 深入源码:自动配置的实现原理 * 2.1 自动配置的“入口”:@SpringBootApplication * 2.2 自动配置的“引擎”:@EnableAutoConfiguration * 2.2.1 自动配置包扫描:@AutoConfigurationPackage * 2.2.2 自动配置类加载:AutoConfigurationImportSelector * 步骤1:加载候选自动配置类 * 步骤2:筛选符合条件的自动配置类 * 步骤3:导入筛选后的自动配置类 * 2.3 自动配置的“开关”:条件注解 * 2.

By Ne0inhk

为什么PostgreSQL的TIMESTAMPTZ无法映射到Java LocalDateTime?深度解析与解决方案

一、问题现象 org.postgresql.util.PSQLException: Cannot convert the column of type TIMESTAMPTZ to requested type java.time.LocalDateTime. 这个错误通常发生在以下场景: * 数据库字段类型:TIMESTAMP WITH TIME ZONE (TIMESTAMPTZ) * Java实体类字段:java.time.LocalDateTime * 框架:Spring Data JPA、MyBatis或原生JDBC查询 二、根本原因深度解析 2.1 LocalDateTime的本质:纯粹的"挂钟时间" // 这只是一个日期时间的数值组合,不指向任何具体时刻 LocalDateTime.now(); // 输出: 2026-01-14

By Ne0inhk
解锁超级生产力:手把手教你构建与GitHub深度集成的自动化工作流,让AI成为你的编程副驾驶

解锁超级生产力:手把手教你构建与GitHub深度集成的自动化工作流,让AI成为你的编程副驾驶

前言 在当今快节奏的软件开发世界中,效率就是生命线。每一位开发者、项目经理和技术爱好者都在不断寻求能够简化流程、自动化重复性任务并最终解放创造力的工具和方法。想象一下,如果你能用自然语言与你的开发环境对话,让它为你搜索代码库、管理项目任务,甚至直接在你最喜欢的代码托管平台GitHub上执行操作,那将会是怎样一种颠覆性的体验? 这并非遥不可及的科幻场景,而是已经可以实现的强大功能。本文将为你揭开这层神秘的面纱,通过一个名为“蓝耘”的平台(或任何支持此类功能的类似平台),一步步指导你从零开始构建一个基础的自动化工作流。更令人兴奋的是,我们将向你展示如何将这个工作流与强大的GitHub MCP(Multi-Capability Platform)工具无缝集成,从而赋予你的工作流直接与GitHub仓库进行深度交互的能力。 无论你是希望快速检索海量开源项目、自动追踪和创建任务(Issues),还是希望简化代码提交与拉取请求(Pull Request)的流程,本文都将为你提供详尽的、可操作的指南。我们将深入每一个步骤,从最基础的节点设置,到获取关键的GitHub密钥,再到最终实战演练,让你亲

By Ne0inhk
【Java 开发日记】我们来说说 ThreadLocal 的原理,使用场景及内存泄漏问题

【Java 开发日记】我们来说说 ThreadLocal 的原理,使用场景及内存泄漏问题

目录 一、核心原理 1. 数据存储结构 2. 关键设计 二、源码分析 1. set() 方法流程 2. get() 方法流程 三、使用场景 1. 典型应用场景 2. 使用建议 四、内存泄漏问题 1. 泄漏原理 2. 解决方案对比 3. 最佳实践 五、注意事项 六、替代方案 七、调试技巧 面试回答 1. 首先,它的核心原理是什么? 2. 其次,它的典型使用场景有哪些? 3. 最后,关于它的内存泄漏问题 一、核心原理 1. 数据存储结构 // 每个

By Ne0inhk