# md **Repository Path**: binglanse/md ## Basic Information - **Project Name**: md - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-24 - **Last Updated**: 2026-04-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Pigeon Example App (HarmonyOS 分支) 这是一个演示如何在 Flutter 应用程序中使用 Pigeon 进行平台通信的示例项目,特别针对 HarmonyOS 平台进行了优化和适配。 ## 项目简介 本示例展示了如何在 Flutter 应用中直接使用 Pigeon(而不是在插件中),演示了以下功能: - **Host API**: Flutter 调用原生平台方法 - **Flutter API**: 原生平台调用 Flutter 方法 - **Event Channel**: 原生平台向 Flutter 发送事件流 ## 支持的平台 - ✅ Android (Kotlin/Java) - ✅ iOS (Swift) - ✅ macOS (Objective-C) - ✅ Windows (C++) - ✅ Linux (GObject) - ✅ **HarmonyOS (ArkTS)** - 重点支持 ## 项目结构 ``` app/ ├── lib/ │ ├── main.dart # Flutter 应用主入口 │ └── src/ │ ├── messages.g.dart # Pigeon 生成的消息代码 │ └── event_channel_messages.g.dart # Pigeon 生成的事件通道代码 ├── pigeons/ │ ├── messages.dart # Pigeon 消息定义文件 │ └── event_channel_messages.dart # Pigeon 事件通道定义文件 ├── android/ # Android 平台实现 ├── ios/ # iOS 平台实现 ├── macos/ # macOS 平台实现 ├── windows/ # Windows 平台实现 ├── linux/ # Linux 平台实现 └── ohos/ # HarmonyOS 平台实现 ├── AppScope/ # 应用配置 ├── entry/ │ ├── src/main/ets/ # ArkTS 源码 │ │ ├── entryability/ # 应用入口 │ │ ├── pages/ # 页面 │ │ └── plugins/ # Pigeon 生成的代码和实现 │ └── build-profile.json5 # 构建配置 └── hvigor/ # 构建工具配置 ``` ## 核心功能演示 ### 1. Host API - Flutter 调用原生平台 Flutter 可以调用原生平台的方法: - `getHostLanguage()`: 获取宿主平台语言名称(返回 "Kotlin"、"Swift"、"ArkTS" 等) - `add(a, b)`: 执行加法运算 - `sendMessage(message)`: 发送消息数据 示例代码: ```dart final ExampleHostApi _api = ExampleHostApi(); // 调用加法 Future add(int a, int b) async { try { return await _api.add(a, b); } catch (e) { return 0; } } // 发送消息 Future sendMessage(String messageText) { final MessageData message = MessageData( code: Code.one, data: {'header': 'this is a header'}, description: 'uri text', ); return _api.sendMessage(message); } ``` ### 2. Flutter API - 原生平台调用 Flutter 原生平台可以调用 Flutter 端的方法: ```dart class _ExampleFlutterApi implements MessageFlutterApi { @override String flutterMethod(String? aString) { return aString ?? ''; } } // 在 main() 中设置 MessageFlutterApi.setUp(_ExampleFlutterApi()); ``` ### 3. Event Channel - 事件流通信 原生平台可以持续向 Flutter 发送事件流: ```dart Stream getEventStream() async* { final Stream events = streamEvents(); await for (final PlatformEvent event in events) { switch (event) { case IntEvent(): yield '${event.data}, '; case StringEvent(): yield '${event.data}, '; } } } ``` ## 如何使用 ### 前置要求 - Flutter SDK (>=3.6.0) - Android Studio / Xcode / Visual Studio (根据目标平台) - **DevEco Studio** (用于 HarmonyOS 开发,推荐版本 3.1+) - HarmonyOS SDK (API level 9+) ### 安装依赖 ```bash flutter pub get ``` ### 运行应用 #### Android ```bash flutter run ``` #### iOS ```bash cd ios pod install cd .. flutter run ``` #### Windows ```bash flutter run -d windows ``` #### Linux ```bash flutter run -d linux ``` #### HarmonyOS **方法一:使用 DevEco Studio** 1. 打开 DevEco Studio 2. 选择 "Open Project",导航到 `ohos` 目录 3. 等待项目同步完成 4. 连接 HarmonyOS 设备或启动模拟器 5. 点击运行按钮 **方法二:使用命令行** ```bash 2784635👂 b ``` ### 更新生成的代码 如果修改了 `pigeons/` 目录下的 Pigeon 定义文件,需要重新生成平台代码: ```bash cd ../.. dart tool/generate.dart ``` 这将根据 `pigeons/messages.dart` 和 `pigeons/event_channel_messages.dart` 中的定义,自动生成各平台的通信代码,包括 HarmonyOS 的 ArkTS 代码。 ## HarmonyOS 特定配置 ### Pigeon 配置 在 `pigeons/messages.dart` 中,HarmonyOS 相关配置: ```dart @ConfigurePigeon(PigeonOptions( // ... 其他平台配置 ... arkTSOut: 'ohos/entry/src/main/ets/plugins/Messages.ets', arkTSOptions: ArkTSOptions(), // ... )) ``` ### HarmonyOS 实现 HarmonyOS 平台使用 ArkTS 实现 Pigeon 接口: ```typescript // ohos/entry/src/main/ets/plugins/MessagePlugin.ets class HostApiImp extends ExampleHostApi { getHostLanguage(): string { return 'ArkTS'; } add(a: number, b: number): number { return a + b; } sendMessage(message: MessageData): boolean { return true; } } ``` ### 事件通道实现 HarmonyOS 平台的事件通道实现: ```typescript class EventSender { private count: number = 0; private timer: number | null = null; private eventSink: EventSink | null = null; private isActive: boolean = false; start(eventSink: EventSink): void { setTimeout(() => { this.eventSink = eventSink; this.isActive = true; this.timer = setInterval(() => { if (!this.isActive || !this.eventSink) { this.forceStop(); return; } try { if (this.count >= 100) { this.forceStop(); return; } if (this.count % 2 === 0) { const intEvent = new IntEvent(); intEvent.setData(this.count); this.eventSink.success(intEvent); } else { const stringEvent = new StringEvent(); stringEvent.setData(`${this.count}`); this.eventSink.success(stringEvent); } this.count++; } catch (error) { this.forceStop(); } }, 1000); }, 2000); } // ... 其他方法 ... } ``` ## Pigeon 定义文件说明 ### messages.dart 定义了主要的 API 接口: ```dart @HostApi() abstract class ExampleHostApi { String getHostLanguage(); int add(int a, int b); @async bool sendMessage(MessageData message); } @FlutterApi() abstract class MessageFlutterApi { String flutterMethod(String? aString); } ``` ### event_channel_messages.dart 定义了事件通道: ```dart @EventChannelApi() abstract class EventChannelMethods { PlatformEvent streamEvents(); } ``` ## 平台实现示例 ### Android (Kotlin) ```kotlin private class PigeonApiImplementation : ExampleHostApi { override fun getHostLanguage(): String { return "Kotlin" } override fun add(a: Long, b: Long): Long { return a + b } override fun sendMessage(message: MessageData, callback: (Result) -> Unit) { callback(Result.success(true)) } } ``` ### iOS (Swift) ```swift private class PigeonApiImplementation: ExampleHostApi { func getHostLanguage() throws -> String { return "Swift" } func add(_ a: Int64, to b: Int64) throws -> Int64 { return a + b } func sendMessage(message: MessageData, completion: @escaping (Result) -> Void) { completion(.success(true)) } } ``` ### HarmonyOS (ArkTS) ```typescript class HostApiImp extends ExampleHostApi { getHostLanguage(): string { return 'ArkTS'; } add(a: number, b: number): number { return a + b; } sendMessage(message: MessageData): boolean { return true; } } ``` ## 应用界面 应用启动后会显示: 1. 宿主平台语言名称(如 "Hello from ArkTS!") 2. 事件流数据(显示从原生平台发送的整数和字符串事件) ## 开发建议 1. **类型安全**: Pigeon 提供编译时类型检查,避免运行时错误 2. **代码生成**: 修改定义文件后记得重新生成代码 3. **错误处理**: 使用平台特定的错误处理机制 4. **异步操作**: 使用 `@async` 注解标记异步方法 5. **HarmonyOS 特有**: 注意 ArkTS 语法和 HarmonyOS API 的使用 ## 相关资源 - [Pigeon 官方文档](https://pub.dev/packages/pigeon) - [Flutter 平台通道文档](https://docs.flutter.dev/development/platform-integration/platform-channels) - [HarmonyOS Flutter 开发指南](https://gitcode.com/openharmony-sig/flutter_packages) - [DevEco Studio 官方文档](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/tools_overview) ## 许可证 本项目遵循 BSD 3-Clause 许可证。