Flutter中如何使用Pigeon实现iOS通信

在Flutter项目中,我想通过Pigeon实现与iOS原生平台的通信,但不太清楚具体操作步骤。请问应该如何配置Pigeon的Dart端和iOS端?是否需要额外的依赖或插件?能否提供一个简单的示例代码说明如何定义通信接口、生成代码以及调用原生方法?过程中有哪些常见坑需要注意?

2 回复

在Flutter中使用Pigeon实现与iOS通信的步骤:

  1. 创建Pigeon文件定义通信接口
  2. 运行pigeon命令生成对应代码
  3. 在iOS项目中实现生成的协议
  4. 在Flutter中调用生成的API

示例:

// 定义接口
@HostApi()
abstract class Api {
  String getMessage();
}

然后在iOS端实现对应方法即可完成双向通信。

更多关于Flutter中如何使用Pigeon实现iOS通信的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中使用 Pigeon 实现与 iOS 的通信,可以简化平台通道的调用过程。以下是步骤及示例代码:

步骤 1:添加依赖

pubspec.yaml 中添加 Pigeon 依赖:

dev_dependencies:
  pigeon: ^10.0.0

步骤 2:定义通信接口

创建一个 .dart 文件(如 pigeon_interface.dart)定义接口:

import 'package:pigeon/pigeon.dart';

// 定义从 Flutter 调用 iOS 的方法
@HostApi()
abstract class ExampleApi {
  int add(int a, int b);
}

// 定义从 iOS 调用 Flutter 的方法(可选)
@FlutterApi()
abstract class ExampleFlutterApi {
  void onEvent(String event);
}

步骤 3:生成代码

运行命令生成平台代码:

flutter pub run pigeon \
  --input pigeon_interface.dart \
  --dart_out lib/pigeon_api.dart \
  --objc_header_out ios/Runner/pigeon_api.h \
  --objc_source_out ios/Runner/pigeon_api.m

步骤 4:iOS 端实现

ios/Runner/AppDelegate.swift 中实现接口:

import Flutter

// 实现生成的协议
class ExampleApiImpl: NSObject, ExampleApi {
  func add(_ a: NSNumber, b: NSNumber) -> NSNumber? {
    return NSNumber(value: a.intValue + b.intValue)
  }
}

// 在 AppDelegate 中注册
@UIApplicationMain
class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    let controller = window?.rootViewController as! FlutterViewController
    
    // 注册 API
    let api = ExampleApiImpl()
    ExampleApiSetup.setUp(binaryMessenger: controller.binaryMessenger, api: api)
    
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

步骤 5:Flutter 端调用

在 Flutter 中使用生成的代码:

import 'pigeon_api.dart';

// 调用 iOS 方法
void callNativeMethod() async {
  final result = await ExampleApi().add(10, 20);
  print('Result from iOS: $result'); // 输出:Result from iOS: 30
}

说明

  • Pigeon 自动生成类型安全的代码,避免手动编写平台通道。
  • 支持基本数据类型、列表和映射。
  • 如需 iOS 调用 Flutter,需实现 ExampleFlutterApi 并注册。

通过以上步骤,即可实现 Flutter 与 iOS 的高效通信。

回到顶部