pigeon
手动处理平台通道
- 事件流通道需要手动进行, 目前 pigeon 无法生成.
- 方法通道可以使用 pigeon 生成
Pigeon 的用法
相关资料如下:
-
macOS 平台上需要手动修改生成后的文件, 详见 github issue: https://github.com/flutter/flutter/issues/73738
manually replaced #import <Flutter/Flutter.h> with #import <FlutterMacOS/FlutterMacOS.h>
-
https://github.com/flutter/packages/tree/main/packages/pigeon
-
添加 dev 依赖:
flutter pub add -d pigeon
Pigeon 是一个代码生成器, 用于 Flutter 和平台间的类型安全的通信, 快速且易用.
注意: 由于这些类型不易变, 正常情况下可以直接放到 git 中管理, 官方 plugin 仓库也是这样做的.
Pigeon 用法简介
- 添加 dev 依赖
- 在 lib 文件夹外面建立所需的 dart 文件(用于定义两边沟通的接口)
- 通过
flutter pub run pigeon
在对应文件上生成 - 将生成的平台端语言对应代码添加到平台的编译阶段中
- 在平台端实现生成的协议, 用于处理向平台端的调用
- 调用生成的 Dart 方法
示例
-
定义一个 Flutter 向平台调用的接口文件:
import 'package:pigeon/pigeon.dart';
// 在平台和 Flutter 间传递的数据结构定义
class Book {
String? title;
String? author;
}
// @HostApi() 标记这个接口是需要在平台端实现的接口协议.
// 可以使用 @FlutterApi() 定义 Flutter 端接口
()
abstract class BookApi {
List<Book?> search(String keyword);
} -
调用 pigeon 生成:
flutter pub run pigeon \
--input pigeons/message.dart \
--dart_out lib/pigeon.dart \
--objc_header_out ios/Runner/pigeon.h \
--objc_source_out ios/Runner/pigeon.m \
--experimental_swift_out ios/Runner/Pigeon.swift \
--java_out ./android/app/src/main/java/dev/flutter/pigeon/ Pigeon.java \
--java_package "dev.flutter.pigeon"如果针对现在情况:
flutter pub run pigeon \
--input pigeons/schema.dart \
--dart_out lib/pigeon.dart \
--objc_header_out macos/Runner/pigeons/pigeon.h \
--objc_source_out macos/Runner/pigeons/pigeon.m
异步接口生成详见官方 plugin 示例: https://github.com/flutter/plugins/blob/main/packages/image_picker/image_picker_ios/pigeons/messages.dart