该项目主要通过 Dart 脚本去自动生成通用的模板代码,项目刚刚发布测试所以也相对简陋,而官方表示 pigeon 仅仅用于生成 Flutter 和宿主平台的模版代码,没有任何运行时的要求,所以也不需要担心引入的冲突。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ezwABOzu-1637902861943)(https://user-gold-cdn.xitu.io/2020/3/18/170ecbb7278740cb?imageView2/0/w/1280/h/960/ignore-error/1)]
接入
集成 pigeon 首先需要在 dev_dependencies 引入 pigeon 依赖。
dev_dependencies: flutter_test: sdk: fl
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
utter pigeon: ^0.1.0-experimental.3
之后在项目内创建一个 dart 文件,按照官方提供的建议我们在项目根目录创建了一个 pigeons 的目录,然后创建一个 message.dart 文件。
import ‘package:pigeon/pigeon_lib.dart’;
class SearchRequest { String query; }
class SearchReply { String result; }
@HostApi() abstract class Api { SearchReply search(SearchRequest request); }
如上代码所示, message.dart 文件中通过 @HostApi() 注解标示了通信对象和接口,之后我们只需要执行如下命令,就可以生成对应代码到工程中。
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 --java_out android/app/src/main/java/com/shuyu/testpigeon/Pigeon.java --java_package “com.shuyu.testpigeon”
如上所示命令行:
- 通过
--input 引入了我们创建的 message.dart 文件; - 通过
--dart_out 输出了 dart 模板文件; - 通过
--objc_header_out 和 --objc_source_out 输出了 object-c 文件; - 通过
--java_out 输出了 java 文件;
命令执行后 dart 文件输出到 lib 目录下, object-c 文件输出到了 ios/Runner 目录下,java 文件输出到指定的 com.shuyu.testpigeon" 包名路径下,之后就可以开始正式接入。
Android
首先看 Android 项目,在生成的 Pigeon.java 中包含了 Api 接口用于开发者实现交互逻辑,同时开发者可以通过 SearchRequest 获取 dart 发送过来的请求,通过 SearchReply 返回数据给 dart 。
所以在 MainActivity 中通过实现 Api 接口就可以完成数据交互,如下代码所示:
- 通过继承
Pigeon.Api 实现了 MyApi 对象; - 在
search 方法中通过 request.getQuery() 获取 dart 的请求数据,并且通过 Pigeon.SearchReply 的 setResult 返回 String.format("Hi %s!", request.getQuery()) ,在收到的 dart 文本之前加上 Hi 并返回; - 最后通过
Pigeon.Api.setup(getFlutterView(), new MyApi()); 就可以完成引用;
package com.shuyu.testpigeon;
import android.os.Bundle; import io.flutter.app.FlutterActivity; import io.flutter.plugins.GeneratedPluginRegistrant;
public class MainActivity extends FlutterActivity {
private class MyApi implements Pigeon.Api { @Override public Pigeon.SearchReply search(Pigeon.SearchRequest request) { Pigeon.SearchReply reply = new Pigeon.SearchReply(); reply.setResult(String.format(“Hi %s!”, request.getQuery())); return reply; } }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GeneratedPluginRegistrant.registerWith(this); Pigeon.Api.setup(getFlutterView(), new MyApi()); } }
iOS
在 iOS 上首先要先把生成的 pigeon.h 和 pigeon.m 文件 link 到 Xcode 工程里,之后如下代码所示在 AppDelegate.h 引入 Api 协议。
#import <Flutter/Flutter.h> #import <UIKit/UIKit.h> #import “pigeon.h”
@interface AppDelegate : FlutterAppDelegate
@end
如下代码所示,接下来在 AppDelegate.m 中实现 search 接口,然后在收到的 dart 文本之前加上 Hi 并返回,最后调用 ApiSetup 方法将完成注册。
#include “AppDelegate.h” #include “GeneratedPluginRegistrant.h”
@implementation AppDelegate
- (BOOL)application:(UIApplication )application
didFinishLaunchingWithOptions:(NSDictionary )launchOptions { [GeneratedPluginRegistrant registerWithRegistry:self]; // Override point for customization after application launch. FlutterViewController controller = (FlutterViewController)self.window.rootViewController; ApiSetup(controller.binaryMessenger, self); return [super application:application didFinishLaunchingWithOptions:launchOptions]; }
ontroller.binaryMessenger, self); return [super application:application didFinishLaunchingWithOptions:launchOptions]; }
|