Flutter如何实现Pigeon通信

我正在使用Flutter开发一个需要与原生平台通信的App,听说Pigeon是个不错的方案但不太清楚具体实现方法。请问应该如何正确配置和使用Pigeon来实现Flutter与iOS/Android平台之间的通信?能否提供一个完整的使用示例,包括Dart端和原生端的代码实现?另外想了解Pigeon相比MethodChannel有哪些优势,以及在性能方面有什么需要注意的地方?

2 回复

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

  1. 在pubspec.yaml添加pigeon依赖
  2. 编写Dart接口定义文件
  3. 运行pigeon命令生成平台代码
  4. 在Flutter端实现生成的Dart接口
  5. 在平台端(Android/iOS)实现对应接口
  6. 通过生成的API进行通信

Pigeon通过代码生成简化了平台通道通信,提供类型安全的接口调用。

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


Flutter 使用 Pigeon 实现平台通道通信,简化 Flutter 与原生(Android/iOS)之间的数据交互。Pigeon 通过生成类型安全的代码,避免手动编写通道名称和处理序列化。

实现步骤

  1. 添加依赖pubspec.yaml 中添加:

    dev_dependencies:
      pigeon: ^10.0.0
    
  2. 定义通信接口 创建 pigeons/message.dart 文件:

    import 'package:pigeon/pigeon.dart';
    
    // 定义从 Flutter 到原生的请求
    class SearchRequest {
      String? query;
    }
    
    // 定义原生返回的响应
    class SearchReply {
      String? result;
    }
    
    // 声明 API 接口
    [@HostApi](/user/HostApi)()
    abstract class Api {
      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. Flutter 端调用 在 Flutter 中使用生成的 Api 类:

    import 'pigeon_api.dart';
    
    final api = Api();
    final reply = await api.search(SearchRequest(query: "Flutter"));
    print(reply.result);
    
  5. Android 端实现MainActivity 中实现 Pigeon.Api

    import com.example.app.Pigeon
    
    class MainActivity : FlutterActivity(), Pigeon.Api {
        override fun onAttachedToEngine(binding: FlutterPluginBinding) {
            Pigeon.Api.setup(binding.binaryMessenger, this)
        }
    
        override fun search(request: Pigeon.SearchRequest): Pigeon.SearchReply {
            return Pigeon.SearchReply.Builder().setResult("Android: ${request.query}").build()
        }
    }
    
  6. iOS 端实现AppDelegate 中实现 Api 协议:

    import Flutter
    import UIKit
    
    class AppDelegate: FlutterAppDelegate, Api {
        override func application(
            _ application: UIApplication,
            didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
        ) -> Bool {
            let controller = window?.rootViewController as! FlutterViewController
            ApiSetup.setUp(binaryMessenger: controller.binaryMessenger, api: self)
            return super.application(application, didFinishLaunchingWithOptions: launchOptions)
        }
    
        func search(_ request: SearchRequest) -> SearchReply {
            return SearchReply(result: "iOS: \(request.query)")
        }
    }
    

优势

  • 类型安全:避免运行时错误。
  • 自动序列化:无需手动处理数据转换。
  • 代码生成:减少重复代码。

通过以上步骤,即可高效实现 Flutter 与原生平台间的通信。

回到顶部