Flutter 在原生插件的开发上默认是须要开发者重复地写模版代码来接入,而近期 Flutter 团队最近发布了一个 package: pub.flutter-io.cn/packages/pi… , 主要是用来解决和优化 native 插件开发上 platform channel 相关的问题。java
该项目目前处于实验性阶段。android
该项目主要经过 Dart 脚本去自动生成通用的模板代码,项目刚刚发布测试因此也相对简陋,而官方表示 pigeon 仅仅用于生成 Flutter 和宿主平台的模版代码,没有任何运行时的要求,因此也不须要担忧引入的冲突。ios
集成 pigeon 首先须要在 dev_dependencies
引入 pigeon
依赖。git
dev_dependencies:
flutter_test:
sdk: flutter
pigeon: ^0.1.0-experimental.3
复制代码
以后在项目内建立一个 dart 文件,按照官方提供的建议咱们在项目根目录建立了一个 pigeons
的目录,而后建立一个 message.dart
文件。github
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()
注解标示了通讯对象和接口,以后咱们只须要执行以下命令,就能够生成对应代码到工程中。api
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"
复制代码
如上所示命令行:bash
--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"
包名路径下,以后就能够开始正式接入。app
首先看 Android 项目,在生成的 Pigeon.java
中包含了 Api
接口用于开发者实现交互逻辑,同时开发者能够经过 SearchRequest
获取 dart 发送过来的请求,经过 SearchReply
返回数据给 dart 。async
因此在 MainActivity
中经过实现 Api
接口就能够完成数据交互,以下代码所示:ide
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 上首先要先把生成的 pigeon.h
和 pigeon.m
文件 link 到 Xcode 工程里,以后以下代码所示在 AppDelegate.h
引入 Api
协议。
#import <Flutter/Flutter.h>
#import <UIKit/UIKit.h>
#import "pigeon.h"
@interface AppDelegate : FlutterAppDelegate<Api>
@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 代码中,咱们只须要经过 pigeon.dart
中的 Api
去调用 search
方法,就能够完成 dart 到原生的通讯逻辑,最后在终端看到 Hi GSY
的输出。
void _incrementCounter() async{
SearchRequest request = SearchRequest()..query = "GSY";
Api api = Api();
SearchReply reply = await api.search(request);
print("###### ${reply.result}");
}
复制代码
咱们能够看到在 igeon.dart
文件中其实就是经过 dev.flutter.pigeon.Api.search
标示的 StandardMessageCodec
去通讯,而且 SearchReply
和 SearchRequest
也是按照咱们起初建立的 message.dart
中的对象去生成。
而对于 message.dart
官方目前也有一些要求,好比:
经过这套规则,在实现原生插件时咱们能够少些不少重复代码,固然上述是直接在 Flutter App 工程中集成接入 pigeon
,正常流程应该是在插件工程中去使用。
同时官方也表示 pigeon
目前是实验性的,将来可能会被删除或者出现 Api 变更,Flutter 也 欢迎你们试一下在 GitHub 上提供反馈:github.com/flutter/pac…