Flutter Pigeon 是用于在 Flutter 和原生平台(Android/iOS)之间生成类型安全通信代码的工具。以下是基本使用步骤:
1. 添加依赖
在 pubspec.yaml 中添加:
dev_dependencies:
  pigeon: ^10.0.0
2. 创建 Pigeon 定义文件
新建 pigeons/message.dart:
import 'package:pigeon/pigeon.dart';
class SearchRequest {
  String? query;
}
class SearchReply {
  String? result;
}
@HostApi()
abstract class SearchApi {
  SearchReply search(SearchRequest request);
}
3. 生成代码
运行命令生成通信代码:
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"
4. 实现原生端
Android (在 MainActivity 中):
import com.example.app.Pigeon;
public class MainActivity extends FlutterActivity {
  private class SearchApiImpl implements Pigeon.SearchApi {
    @Override
    public Pigeon.SearchReply search(Pigeon.SearchRequest request) {
      Pigeon.SearchReply reply = new Pigeon.SearchReply();
      reply.setResult("Received: " + request.getQuery());
      return reply;
    }
  }
  @Override
  public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
    Pigeon.SearchApi.setup(flutterEngine.getDartExecutor(), new SearchApiImpl());
  }
}
iOS (在 AppDelegate.swift 中):
import Flutter
class SearchApiImpl: NSObject, SearchApi {
  func search(_ request: SearchRequest) -> SearchReply {
    let reply = SearchReply()
    reply.result = "Received: \(request.query ?? "")"
    return reply
  }
}
@UIApplicationMain
class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    let controller = window?.rootViewController as! FlutterViewController
    SearchApiSetup.setUp(binaryMessenger: controller.binaryMessenger, api: SearchApiImpl())
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}
5. Flutter 端调用
在 Flutter 中使用生成的接口:
import 'pigeon_api.dart';
final api = SearchApi();
final request = SearchRequest()..query = 'Hello';
final response = await api.search(request);
print(response.result); // 输出:Received: Hello
主要特点:
- 类型安全,避免手动处理 JSON
- 支持异步调用
- 自动生成双向通信代码
确保在生成代码后重新编译项目。通过这种方式,可以高效地在 Flutter 和原生代码之间进行类型安全的通信。