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 和原生代码之间进行类型安全的通信。