如上代码所示, 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 v
oid 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
#import
#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];
}
-(SearchReply )search:(SearchRequest)input error:(FlutterError *)error {
SearchReply result = [[SearchReply alloc] init];
result.result = [NSString stringWithFormat:@"%s%@","Hi ",input.query];
return result;
}
@end
Dart
如下代码所示,最后在 Dart 代码中,我们只需要通过 pigeon.dart
中的 Api
去调用 search
方法,就可以完成 dart 到原生的通信逻辑,最后在终端看到 Hi GSY
的输出。
void _incrementCounter() async{
Api
去调用 search
方法,就可以完成 dart 到原生的通信逻辑,最后在终端看到 Hi GSY
的输出。
void _incrementCounter() async{