Flutter for OpenHarmony:swagger_dart_code_generator 接口代码自动化生成的救星(OpenAPI/Swagger) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:swagger_dart_code_generator 接口代码自动化生成的救星(OpenAPI/Swagger) 深度解析与鸿蒙适配指南

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

在这里插入图片描述

前言

后端工程师扔给你一个 Swagger (OpenAPI) 文档地址,你会怎么做?

  1. 对着文档,手写 Dart Model 类(容易写错字段类型)。
  2. 手写 Retrofit/Dio 的 API 接口定义(容易拼错 URL)。
  3. 当后端修改了字段名,你对着报错修半天。

这是重复劳动的地狱。

swagger_dart_code_generator 可以将 Swagger (JSON/YAML) 文件直接转换为高质量的 Dart 代码,包括:

  • Model 类:支持 json_serializable,带 fromJson/toJson
  • Service 类:基于 chopperdio 的请求方法。
  • Enum:枚举类型的自动映射。

对于 OpenHarmony 应用开发,这种自动化工具能极大减少与后端对接的沟通成本和代码错误率。

一、核心工作流

该插件作为 build_runner 的一部分运行。

  1. Config: 在 build.yamlpubspec.yaml 中配置 Swagger 源文件位置。
  2. Fetch/Read: 读取本地或远程的 Swagger 文件。
  3. Generate: 生成 .swagger.dart, .models.swagger.dart, .enums.swagger.dart
  4. Integration: 在业务代码中直接调用生成的方法。

输入

生成

生成

生成

调用

Http 请求

swagger.json

swagger_dart_code_generator

User, Product 模型

RestClient (Dio/Chopper)

Status枚举

OpenHarmony 应用

Server

二、集成与用法详解

2.1 添加依赖

我们需要生成器和运行时库。

dependencies:flutter:sdk: flutter json_annotation: ^4.8.0 chopper: ^7.0.0 # 或者 diodev_dependencies:build_runner: ^2.4.0 swagger_dart_code_generator: ^4.1.1 json_serializable: ^6.7.0 chopper_generator: ^7.0.0 

2.2 配置 build.yaml

在项目根目录创建 build.yaml,告诉生成器去哪里找 Swagger 文件。

targets:$default:builders:swagger_dart_code_generator:options:input_folder:"lib/api_docs/"# 存放 json 的目录output_folder:"lib/api_gen/"# 生成代码的目录# 使用 chopper 还是 dio? 默认是 chopper,dio 需要额外配置use_generator: chopper 

2.3 下载 Swagger 文件

将后端的 swagger.json 下载到 lib/api_docs/myservice.swagger.json

2.4 运行生成

flutter pub run build_runner build 

生成完毕后,你会在 lib/api_gen/ 下看到 myservice.swagger.dart 等文件。

2.5 使用生成的代码

import'package:chopper/chopper.dart';import'lib/api_gen/myservice.swagger.dart';voidmain()async{// 1. 创建 Servicefinal service =Myservice.create(ChopperClient( baseUrl:Uri.parse('https://api.example.com'), converter: $JsonSerializableConverter(),));// 2. 调用 APIfinal response =await service.getUser(id:123);if(response.isSuccessful){// 3. 直接获得强类型的 User 对象finalUser? user = response.body;print(user?.name);}}
在这里插入图片描述

三、OpenHarmony 适配与实战:解决构建与兼容性

3.1 鸿蒙网络库选择

生成的代码通常依赖 chopperdio

  • Chopper: 基于 http 包。在纯 Dart 环境和 Flutter Mobile 上表现良好。
  • Dio: 功能更强大(拦截器、下载进度)。

适配建议
在 OpenHarmony 上,两者都能工作。但如果你需要利用鸿蒙特有的网络配置(如安全证书锁定),推荐使用 Dio 模式,因为你可以更方便地拿到底层的 HttpClientAdapter 进行定制(如替换为 dio_http2_adapter 或自定义 adapter)。

修改 build.yaml 切换到 Dio:

swagger_dart_code_generator:options:use_generator: dio 

3.2 解决文件名冲突

有时后端的 Swagger 定义里会有 PageList 这种通用类名,与 Flutter 冲突。
可以在配置中进行重命名映射。

options:replacement_rules:-pattern:"^Page$"replacement:"ApiPage"

3.3 CI/CD 集成

在鸿蒙工程的 CI 流水线中,建议:

  1. 不提交生成代码:将 lib/api_gen/ 加入 .gitignore
  2. 构建时生成:在 CI 脚本中先执行 curl 下载最新 Swagger JSON,再执行 build_runner。这样能确保 App 始终与后端接口保持一致(如果不一致构建会挂)。

四、功能详解:自定义模版

如果默认生成的代码风格不符合团队规范,该插件支持自定义模板。但这通常比较复杂。更简单的方式是利用 include_if_null 等选项微调 JSON 序列化行为。

五、总结

swagger_dart_code_generator 是“契约优先”开发模式的最佳实践工具。它让 API 接口定义成为真理来源(Source of Truth)。

对于 OpenHarmony 开发者:

  • 减少手写:让你从繁琐的 JSON 解析中解放出来,专注于鸿蒙 UI 和交互逻辑。
  • 类型安全:所有字段都是类型安全的,再也不用担心 String 传成 int

最佳实践

  1. 版本控制:虽然建议不提交生成文件,但必须提交 Swagger JSON 文件,以便回溯历史接口变更。
  2. Review 变更:每次后端更新接口后,重新生成代码,利用 Git Diff 查看变动,这有助于前端提前发现潜在的 Breaking Change。

六、完整实战示例

import'package:chopper/chopper.dart';// 假设这是 build_runner 生成的文件// import 'lib/api_gen/my_service.swagger.dart';/* 假定生成的 Service 类定义如下 (由库自动生成): @ChopperApi() abstract class MyService extends ChopperService { @Get(path: '/users/{id}') Future<Response<User>> getUser(@Path('id') int id); static MyService create([ChopperClient? client]) => _$MyService(client); } */classApiManager{ late finalMyService _service;// 使用 dynamic 或生成的类型// 单例模式staticfinalApiManager _instance =ApiManager._internal();factoryApiManager()=> _instance;ApiManager._internal(){// 初始化 Chopper 客户端final chopper =ChopperClient( baseUrl:Uri.parse('https://api.example.com'), converter:JsonConverter(),// 这里通常用 generated $JsonSerializableConverter errorConverter:JsonConverter(), services:[// 注册生成的服务// MyService.create(),], interceptors:[// HttpLoggingInterceptor(), // 日志拦截器]);// 获取服务实例// _service = chopper.getService<MyService>();}Future<void>fetchUser(int id)async{try{/* // 业务调用非常清爽,完全感知不到 HTTP 细节 final response = await _service.getUser(id: id); if (response.isSuccessful) { // body 是强类型的 User 对象 print('User Name: ${response.body?.name}'); } else { print('API Error: ${response.error}'); } */print('API Call (Simulated)');}catch(e){print('Network Exception: $e');}}}voidmain(){ApiManager().fetchUser(1001);}
在这里插入图片描述

Read more

字节跳动AI IDE:Trae 完全上手指南——从零安装到熟练使用,开启AI驱动开发新范式

字节跳动AI IDE:Trae 完全上手指南——从零安装到熟练使用,开启AI驱动开发新范式

目录 * 前言:当IDE进化为智能体 * 1.初识Trae * 1.1 Trae是什么? * 1.2 Trae的核心优势 * 1.3 谁适合使用Trae? * 2.安装与初始配置 * 2.1 支持的操作系统 * 2.2 下载与安装步骤 * 2.3 验证安装成功 * 3.界面导航(五分钟熟悉布局) * 3.1 核心区域功能说明 * 3.2 常用快捷键速查 * 4.核心AI功能详解 * 4.1 Chat模式:随时提问的编程助手 * 4.2 Builder模式:自然语言生成完整项目 * 4.2.1 实战案例:做一个待办事项应用 * 4.

By Ne0inhk
AI 编程新范式:一文彻底搞懂 LLM、Agent、MCP、Skill 是怎么协作的

AI 编程新范式:一文彻底搞懂 LLM、Agent、MCP、Skill 是怎么协作的

文章目录 * 一、核心结论:AI 编程进入「分工时代」 * 二、LLM 与 Agent 🔥 * 1. LLM(大语言模型) * 2. Agent(智能体) * 3. 对比 * 4. 🧠人脑 vs AI Agent 🤖 * 5. 映射图 * 三、MCP 与 Skill 🔥 * 1. MCP:神经系统协议(神经信号标准、信号如何传递)- 协议 * 2. MCP Server:肢体/器官(真正干活的执行实体)- 服务 * 3. Skill:器官的本能动作(Server本能动作)- 内置能力

By Ne0inhk
能做影视级可商业视频的AI工具,Seedance 2.0 全球首发实测

能做影视级可商业视频的AI工具,Seedance 2.0 全球首发实测

如果你是短片导演、影视团队,或者长期做内容的自媒体,一定有同感: AI 视频不是不好,而是太“难用”。 * 想复刻一个爆款运镜,结果画面乱飞 * 想做商用级视频,角色和产品每一帧都在变 * 想快点出片,却被排队、算力、复杂参数拖住 大多数 AI 视频工具的现状是: 看 Demo 很震撼,真到实操,全靠赌。 而 Seedance2.0 给我的第一感受是—— 它不是在“秀模型能力”,而是在解决真实创作流程中的控制问题,把“做视频”这件事,拉回到像 P 图一样直觉、可控。 一、模型重磅发布:Seedance2.0 到底解决了什么? Seedance2.0 是即梦最新一代视频模型,核心定位非常明确: 影视级质量 + 商业可用 + 一站式生成。

By Ne0inhk
华为昇腾310P 176T算力AI 智能计算模组规格书

华为昇腾310P 176T算力AI 智能计算模组规格书

目录产品介绍...................................................................................................................................... 31、产品简介............................................................................................................................. 32、产品特性............................................................................................................................. 33、应用领域......................................................................................

By Ne0inhk