Skip to main content

pigeon

手动处理平台通道

  1. 事件流通道需要手动进行, 目前 pigeon 无法生成.
  2. 方法通道可以使用 pigeon 生成

Pigeon 的用法

相关资料如下:

  1. macOS 平台上需要手动修改生成后的文件, 详见 github issue: https://github.com/flutter/flutter/issues/73738

    manually replaced #import <Flutter/Flutter.h> with #import <FlutterMacOS/FlutterMacOS.h>

  2. https://github.com/flutter/packages/tree/main/packages/pigeon

  3. 添加 dev 依赖: flutter pub add -d pigeon

Pigeon 是一个代码生成器, 用于 Flutter 和平台间的类型安全的通信, 快速且易用.

注意: 由于这些类型不易变, 正常情况下可以直接放到 git 中管理, 官方 plugin 仓库也是这样做的.

Pigeon 用法简介

  1. 添加 dev 依赖
  2. 在 lib 文件夹外面建立所需的 dart 文件(用于定义两边沟通的接口)
  3. 通过 flutter pub run pigeon 在对应文件上生成
  4. 将生成的平台端语言对应代码添加到平台的编译阶段中
  5. 在平台端实现生成的协议, 用于处理向平台端的调用
  6. 调用生成的 Dart 方法

示例

  1. 定义一个 Flutter 向平台调用的接口文件:

    import 'package:pigeon/pigeon.dart';

    // 在平台和 Flutter 间传递的数据结构定义
    class Book {
    String? title;
    String? author;
    }

    // @HostApi() 标记这个接口是需要在平台端实现的接口协议.
    // 可以使用 @FlutterApi() 定义 Flutter 端接口
    ()
    abstract class BookApi {
    List<Book?> search(String keyword);
    }
  2. 调用 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