Flutter如何实现Pigeon通信
我正在使用Flutter开发一个需要与原生平台通信的App,听说Pigeon是个不错的方案但不太清楚具体实现方法。请问应该如何正确配置和使用Pigeon来实现Flutter与iOS/Android平台之间的通信?能否提供一个完整的使用示例,包括Dart端和原生端的代码实现?另外想了解Pigeon相比MethodChannel有哪些优势,以及在性能方面有什么需要注意的地方?
2 回复
Flutter中使用Pigeon实现通信的步骤:
- 在pubspec.yaml添加pigeon依赖
- 编写Dart接口定义文件
- 运行pigeon命令生成平台代码
- 在Flutter端实现生成的Dart接口
- 在平台端(Android/iOS)实现对应接口
- 通过生成的API进行通信
Pigeon通过代码生成简化了平台通道通信,提供类型安全的接口调用。
更多关于Flutter如何实现Pigeon通信的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
Flutter 使用 Pigeon 实现平台通道通信,简化 Flutter 与原生(Android/iOS)之间的数据交互。Pigeon 通过生成类型安全的代码,避免手动编写通道名称和处理序列化。
实现步骤
-
添加依赖 在
pubspec.yaml中添加:dev_dependencies: pigeon: ^10.0.0 -
定义通信接口 创建
pigeons/message.dart文件:import 'package:pigeon/pigeon.dart'; // 定义从 Flutter 到原生的请求 class SearchRequest { String? query; } // 定义原生返回的响应 class SearchReply { String? result; } // 声明 API 接口 [@HostApi](/user/HostApi)() abstract class Api { SearchReply search(SearchRequest request); } -
生成代码 运行命令生成平台代码:
flutter pub run pigeon \ --input pigeons/message.dart \ --dart_out lib/pigeon_api.dart \ --objc_header_out ios/Runner/pigeon.h \ --objc_source_out ios/Runner/pigeon.m \ --java_out android/app/src/main/java/com/example/app/Pigeon.java \ --java_package "com.example.app" -
Flutter 端调用 在 Flutter 中使用生成的
Api类:import 'pigeon_api.dart'; final api = Api(); final reply = await api.search(SearchRequest(query: "Flutter")); print(reply.result); -
Android 端实现 在
MainActivity中实现Pigeon.Api:import com.example.app.Pigeon class MainActivity : FlutterActivity(), Pigeon.Api { override fun onAttachedToEngine(binding: FlutterPluginBinding) { Pigeon.Api.setup(binding.binaryMessenger, this) } override fun search(request: Pigeon.SearchRequest): Pigeon.SearchReply { return Pigeon.SearchReply.Builder().setResult("Android: ${request.query}").build() } } -
iOS 端实现 在
AppDelegate中实现Api协议:import Flutter import UIKit class AppDelegate: FlutterAppDelegate, Api { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { let controller = window?.rootViewController as! FlutterViewController ApiSetup.setUp(binaryMessenger: controller.binaryMessenger, api: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } func search(_ request: SearchRequest) -> SearchReply { return SearchReply(result: "iOS: \(request.query)") } }
优势
- 类型安全:避免运行时错误。
- 自动序列化:无需手动处理数据转换。
- 代码生成:减少重复代码。
通过以上步骤,即可高效实现 Flutter 与原生平台间的通信。

