AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
[TOC] > [home](https://pub.dev/packages/pigeon) > [示例](flutter/packages/pigeon/example) ## 概述 **Pigeon** 是由 Google 官方提供的 Flutter 插件,用于在 **Flutter 与平台原生代码之间进行类型安全的通信**。 它基于 **代码生成(Codegen)**,相比 `MethodChannel` 更安全、可维护性更高,适合构建中大型 Flutter 与原生交互项目。 **原生问题** 在 Flutter 中调用原生功能(如相机、蓝牙、音频录制等)时,需要与平台层(Kotlin/Java/Swift/ObjC)通信。 ## 对比 **传统方式使用 `MethodChannel`:** * 传参需要手动序列化为 Map * 容易写错 key 或类型 * 编译期无类型检查 **Pigeon 的优势:** ✅ 类型安全(自动生成 Dart/Java/Swift 接口) ✅ 无需手动编码解码参数 ✅ 一套接口同时生成 Dart/Android/iOS 代码 ✅ 支持 Flutter 插件通信(适合插件开发者) ## 支持的平台 * ✅ Flutter(Dart) * ✅ Android(Java/Kotlin) * ✅ iOS/macOS(Swift/ObjC) * ✅ Windows/Linux(通过 Dart FFI) * ✅ Flutter Web(通过 JS interop,实验性) ## 高级用法 * 支持回调接口(@FlutterApi) * 支持异步返回(Future) * 支持嵌套结构体、List、Map * 支持插件开发和跨模块通信 * 可用于 Windows / Linux / Web(FFI / JS) ## 示例 **创建 pigeon 接口文件(推荐放在 pigeons/ 目录)** ``` // pigeons/message.dart import 'package:pigeon/pigeon.dart'; @ConfigurePigeon(PigeonOptions( dartOut: 'lib/messages.g.dart', kotlinOut: 'android/app/src/main/kotlin/com/example/pigeon_example/Messages.kt', kotlinOptions: KotlinOptions(package: 'com.example.pigeon_example'), swiftOut: 'ios/Runner/Messages.swift', swiftOptions: SwiftOptions(), )) class Book { late String title; late int pageCount; } @HostApi() abstract class BookApi { Book getBook(int id); void saveBook(Book book); } ``` **运行代码生成命令** ``` flutter pub run pigeon --input pigeons/message.dart ``` 这会生成: * `lib/messages.g.dart`(Flutter 侧接口) * `Messages.kt`(Android 接口) * `Messages.swift`(iOS 接口) **在原生端实现接口** ``` // Android 实现(Kotlin): class BookApiImpl: BookApi { override fun getBook(id: Long): Book { return Book("Flutter 开发指南", 300) } override fun saveBook(book: Book) { Log.d("BookApi", "保存书籍:${book.title}") } } ``` ``` // 并在 MainActivity.kt 中注册: BookApi.setUp(flutterEngine.dartExecutor.binaryMessenger, BookApiImpl()) ``` ``` // iOS 实现(Swift): class BookApiImpl: BookApi { func getBook(id: Int64) -> Book { return Book(title: "iOS 编程实战", pageCount: 250) } func saveBook(book: Book) { print("保存书籍:\(book.title)") } } ``` **在 Dart 中调用** ``` final api = BookApi(); void fetchBook() async { final book = await api.getBook(1); print('书名: ${book.title}, 页数: ${book.pageCount}'); } ```