Flutter 在原生插件的开发上默认是需要开发者重复地写模版代码来接入,而近期 Flutter 团队最近发布了一个 package: https://pub.flutter-io.cn/packages/pigeon , 主要是用来解决和优化 native 插件开发上 platform channel 相关的问题。

该项目目前处于实验性阶段。

该项目主要通过 Dart 脚本去自动生成通用的模板代码,项目刚刚发布测试所以也相对简陋,而官方表示 pigeon 仅仅用于生成 Flutter 和宿主平台的模版代码,没有任何运行时的要求,所以也不需要担心引入的冲突。

接入

集成 pigeon 首先需要在 dev_dependencies 引入 pigeon 依赖。

dev_dependencies:flutter_test:sdk: flutterpigeon: ^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.SearchReplysetResult 返回 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 {@Overridepublic Pigeon.SearchReply search(Pigeon.SearchRequest request) {Pigeon.SearchReply reply = new Pigeon.SearchReply();reply.setResult(String.format("Hi %s!", request.getQuery()));return reply;}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);GeneratedPluginRegistrant.registerWith(this);Pigeon.Api.setup(getFlutterView(), new MyApi());}
}

iOS

在 iOS 上首先要先把生成的 pigeon.hpigeon.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 *)applicationdidFinishLaunchingWithOptions:(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{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 去通信,并且 SearchReplySearchRequest 也是按照我们起初创建的 message.dart 中的对象去生成。

而对于 message.dart 官方目前也有一些要求,比如:

  • 该文件不能包含任何方法或函数定义。
  • 数据类型需要时 platform channel 支持的。
  • Api必须是一个“抽象类”,可以使用“HostApi()”或 FlutterApi() 作为元数据。
  • Api类的方法声明应该有一个参数和一个返回
    其类型在文件中定义的值。

通过这套规则,在实现原生插件时我们可以少些很多重复代码,当然上述是直接在 Flutter App 工程中集成接入 pigeon ,正常流程应该是在插件工程中去使用。

同时官方也表示 pigeon 目前是实验性的,未来可能会被删除或者出现 Api 变动,Flutter 也 欢迎大家试一下在 GitHub 上提供反馈:https://github.com/flutter/packages,希望这只“鸽子”未来会有放飞的一天。

资源推荐

  • 本文 demo :https://gitee.com/CarGuo/test_pigeon
  • Github :https://github.com/CarGuo
  • 开源 Flutter 完整项目:https://github.com/CarGuo/GSYGithubAppFlutter
  • 开源 Flutter 多案例学习型项目: https://github.com/CarGuo/GSYFlutterDemo
  • 开源 Fluttre 实战电子书项目:https://github.com/CarGuo/GSYFlutterBook
  • 开源 React Native 项目:https://github.com/CarGuo/GSYGithubApp

Flutter 官方尝试放只“鸽子”来简化Native插件开发相关推荐

  1. 研究生被录取后放导师鸽子,学校要上报教育部失信名单取消其推免资格

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:知乎,生物学霸,科奖中心 &q ...

  2. 如何科学养一只鸽子为你飞鸽传书——程序间异步通信_莫韵乐的Linux英雄传

    如何科学养一只鸽子为你飞鸽传书--程序间异步通信 程序间异步通信--其本质都只是将信息从A端到B端的传递,只要通信双方都做好发出信息和接收信息的准备就可以实现飞鸽传书 接下来看一下怎样如何科学养一只鸽 ...

  3. 想放酒店鸽子?酒店:尽管放,预测不到算我输

    来源|HyperAI超神经 文|神经小兮 如今, 各大 OTA(Online Travel Agency)平台极大地方便了人们的出行,酒店住宿.景点门票等,只需要动动手指就可以轻松完成预订. ▲国内外 ...

  4. FLutter 官方推荐的二个动画插件lottie和Rive(flare)动画

    FLutter 官方推荐的二个动画插件lottie和rive(flare)动画 lottie 动画:Lottie是一个Android和iOS的移动库,它解析Adobe After Effects动画, ...

  5. Flutter入门:如何只关闭自身页面

    flutter的路由管理很方便,push和pop就可以了,但是pop只能关闭栈顶的页面,在某些需求中就显得力不从心了. 比如我们有一个倒计时弹窗(flutter中弹窗其实也是页面),倒计时结束后关闭. ...

  6. Flutter:尝试撸一个具有惯性跟阻力的旋转控件或用传感器控制其旋转

    来源 一直都想写一个可以转动的Widget,并且可以近似的模拟生活中的惯性跟阻力,因为设计到一些数学公式,作者还去请教了我的高中老师,最后学了点传感器,就直接外加个可选择传感器控制了 效果 实现方法 ...

  7. Flutter 官方做了一款游戏,开源的

    在 Google I/O'19 期间,Flutter 团队和 2Dimensions 联合发布了一款运营 / RPG 游戏: Flutter Developer Quest.除了作为游戏本身在游戏性上 ...

  8. 用 3 只“鸽子”,告诉你闪电网络如何改变加密消息传递方式!

    作者 | COLIN HARPER 译者 | 火火酱 责编 | 徐威龙 封图| CSDN 下载于视觉中国 "通过使用微支付通道网络,借助当今现代台式计算机上可用的计算能力,比特币可以扩展到每 ...

  9. 中国专利查询官方网站俩只

    第一推荐国家知识产权(www.cnipa.gov.cn/)的专利检索及分析系统(http://pss-system.cnipa.gov.cn/sipopublicsearch/portal/uiInd ...

最新文章

  1. 2022入坑图像分割,我该从哪儿入手?
  2. Linq多表查询条件批量删除
  3. 30分钟LINQ教程【转】
  4. 非常好的bert中文预训练资料
  5. 根据文法画出语法树_几种常用的英语教学法误导了语法教学
  6. 在程序员的道路上,义无反顾的努力,有思想的人,很多,好的想法,需要学习。(以此共勉)...
  7. GAN对抗生成网络原始论文理解笔记
  8. 深度学习之生成式对抗网络 GAN(Generative Adversarial Networks)
  9. linq to sql 行转列_SQL 难题:行转列
  10. 在c语言中数据类型高低,C语言的数据类型
  11. http 标准超时时间_Go 中 http 超时问题的排查
  12. Flutter状态管理学习手册(三)——Bloc
  13. 中医预约挂号系统,代煎取药功能原来这样用?
  14. U盘被写保护不能重新格式化
  15. 存储服务器2012R2系统怎么搞文件共享,server2012r2文件共享局域网权限设置的方法...
  16. win10服务器怎么备份系统,详细教你win10怎么备份系统
  17. ubuntu18 防火墙关闭_ubuntu18开启/关闭防火墙
  18. 测开基础串讲-Java基础-测开常用API之Random类
  19. 仿京东或淘宝的订单中心页面
  20. Linux系统中的超级用户,普通用户,特殊用户(特殊用户)3种类型

热门文章

  1. Laya游戏开发经验总结
  2. 踉踉跄跄的大战深海Boss -----观《深海大战》
  3. Vm挂载虚拟硬盘(手把手教程)
  4. vscode编辑器,相对路径文件读取失败
  5. HelloWorld-文本文档记事本、dos命令运行Java语言
  6. 苹果推送nodejs+apn
  7. 不是python文件操作的相关函数_python-9-文件相关操作_相关函数_扩展模式
  8. windows服务器知多少
  9. 蓝桥杯 15决赛 A2 四阶幻方(剪枝)
  10. python sqlite3 fetchall_使用python sqlite3的fetchall无法显示结果?