当前位置:首页 > 闲鱼技术 > 正文内容

Flutter Plugin调用Native APIs

xianyu3年前 (2021-03-06)闲鱼技术228
01 开篇.png


作者:闲鱼技术-储睿
关键词:Flutter, Flutter Plugin, Platform Channel, Method Channel, Flutter Package, Flutter插件

微信号:pps688888
添加微信, 免费测试软件
复制微信号

Flutter是Google使用Dart语言开发的一套移动应用开发框架。它不同于其他开发框架: 
(1)因为Flutter使用AOT预编译代码为机器码,所以它的运行效率更高。 
(2)Flutter的UI控件并没有使用底层的原生控件,而是使用Skia渲染引擎绘制而成,因为不依赖底层控件,所以多端一致性非常好。 
(3)Flutter的扩展性也非常强,开发者可以通过Plugin与Native进行通信。

闲鱼开发Flutter过程中,经常会需要各种Native的能力,如获取设备信息、使用基础网络库等,这时会使用Plugin来做桥接。本文将对Plugin进行详细的介绍,希望能给Flutter开发者一些帮助。


摘要:

本文首先对Flutter Plugin以及原理进行了介绍,然后对Plugin所依赖的Platform Channel进行了讲解,随后对“获取剩余电量Plugin”进行了分解,最后给大家分享一下之前踩过的坑。

1. Flutter Plugin

在介绍Plugin前,我们先简单了解一下Flutter:

02 框架.png

Flutter框架包括:Framework和Engine,他们运行在各自的Platform上。

Framework是Dart语言开发的,包括Material Design风格的Widgets和Cupertino(iOS-style)风格的Widgets,以及文本、图片、按钮等基础Widgets;还包括渲染、动画、绘制、手势等基础能力。

Engine是C++实现的,包括Skia(二维图形库);Dart VM(Dart Runtime);Text(文本渲染)等。

实际上,Flutter的上层能力都是Engine提供的。Flutter正是通过Engine将各个Platform的差异化抹平。而我们今天要讲的Plugin,正是通过Engine提供的Platform Channel实现的通信。

2. Platform Channel

2.1 Flutter App调用Native APIs:

03 Channel.png

通过上图,我们看到Flutter App是通过Plugin创建的Platform Channel调用的Native APIs。


2.2 Platform Channel 架构图:

04 Channel.png

Platform Channel:

  • Flutter App (Client),通过MethodChannel类向Platform发送调用消息;
  • Android Platform (Host),通过MethodChannel类接收调用消息;
  • iOS Platform (Host),通过FlutterMethodChannel类接收调用消息。

PS:消息编解码器,是JSON格式的二进制序列化,所以调用方法的参数类型必须是可JSON序列化的。

PS:方法调用,也可以反向发送调用消息。

Android Platform

FlutterActivity,是Android的Plugin管理器,它记录了所有的Plugin,并将Plugin绑定到FlutterView。

iOS Platform

FlutterAppDelegate,是iOS的Plugin管理器,它记录了所有的Plugin,并将Plugin绑定到FlutterViewController(默认是rootViewController)。

3. 获取剩余电量Plugin:

05 Plugin.png

3.1 创建Plugin

首先,我们创建一个Plugin(flutter_plugin_batterylevel)项目。Plugin也是项目,只是Project type不同。 
(1)IntelliJ欢迎界面点击 Create New Project 或者 点击 File>New>Project…; 
(2)在左侧菜单选择 Flutter, 然后点击 Next; 
(3)输入 Project name 和 Project location,Project type 选择 “Plugin”; 
(4)最后点击 Finish。

06 Project.png

Project type: 
(1)Application,Flutter应用; 
(2)Plugin,暴漏Android和iOS的API给Flutter应用; 
(3)Package,封装一个Dart组件,如“浏览大图Widget”。

PS:Plugin有Dart、Android、iOS,3部分代码组成。

3.2 Plugin Flutter部分

3.2.1 MethodChannel:Flutter App调用Native APIs

首先,我们实例_methodChannel(Channel名称必须唯一),然后调用invokeMethod()方法。invokeMethod()有2个参数: 
(1)方法名,不能为空; 
(2)调用方法的参数,该参数必须可JSON序列化,可以为空。

3.2.2 EventChannel:Native调用Flutter App

3.3 Plugin Android部分

3.3.1 Plugin 注册

在FlutterActivity的onCreate()方法中,注册Plugin。

(1)Channel名称:必须与Flutter App的Channel名称一致; 
(2)MethodChannel和EventChannel初始化的时候都需要传递Registrar,即FlutterActivity; 
(3)设置MethodChannel的Handler,即MethodCallHandler; 
(4)设置EventChannel的Handler,即EventChannel.StreamHandler;

3.3.2 MethodCallHandler & EventChannel.StreamHandler

MethodCallHandler实现MethodChannel的Flutter App调用Native APIs;
EventChannel.StreamHandler实现EventChannel的Native调用Flutter App。

MethodCallHandler: 
(1)public void onMethodCall(MethodCall call, Result result);

EventChannel.StreamHandler: 
(1)public void onListen(Object obj, EventChannel.EventSink eventSink); 
(2)public void onCancel(Object obj);

3.4 Plugin iOS部分

3.4.1 Plugin 注册

iOS的Plugin注册流程跟Android一致。只是需要注册到AppDelegate(FlutterAppDelegate)。

FlutterMethodChannel和FlutterEventChannel被绑定到FlutterViewController。

3.4.2 FlutterStreamHandler:

4. 加载Plugin

现在我们已经有了Plugin,但是如何把它加载到Flutter App项目中呢?

It’s Pub. Pub是Dart语言提供的Packages管理工具。

说到Package,它有2种类型: 
(1) Dart Packages:只包含Dart代码,如“浏览大图Widget”。 
(2) Plugin Packages:包含的Dart代码能够调用Android和iOS实现的Native APIs,如“获取剩余电量Plugin”。

4.1 将一个Package添加到Flutter App中

(1)通过编辑pubspec.yaml(在App根目录下)来管理依赖; 
(2)运行flutter packages get,或者在IntelliJ里点击Packages Get; 
(3)import package,重新运行App。

管理依赖有3种方式:Hosted packages、Git packages、Path packages。

4.2 Hosted packages(来自pub.dartlang.org)

如果你希望自己的Pulgin给更多的人使用,你可以把它发布到 pub.dartlang.org。

发布Hosted packages:

加载Hosted packages:

编辑pubspec.yaml:

4.3 Git packages(远端)

如果你的代码不经常改动,或者不希望别人修改这部分代码,你可以用Git来管理你的代码。
我们先创建?一个Plugin(flutter_remote_package),并将它传到Git上,然后打个tag。

加载Git packages:

编辑pubspec.yaml:

PS:ref可以指定某个commit、branch、或者tag。

4.4 Path packages(本地)

PS:如果你的代码没有特殊的场景需要, 可以直接把Package放到本地,这样开发和调试都很方便。

我们在Flutter App项目根目录下(flutter_app),创建文件夹(plugins),然后把插件(flutter_plugin_batterylevel)移动到plugins下。

07 目录结构.png

加载Path packages:

编辑pubspec.yaml:

5. 踩过的坑

5.1 用XCode编辑Plugin

我们已经在pubspec.yaml里添加了依赖,但是打开iOS工程,却看不到Plugin?

这时需要执行pod install (或pod update)。

5.2 iOS编译没问题,但是运行时找不到Plugin

[self.window setRootViewController:[[FlutterViewController alloc]

initWithNibName:nil bundle:nil]]];

[self.window setBackgroundColor:[UIColor whiteColor]

];

[self.window makeKeyAndVisible]

;   return [super application:application didFinishLaunchingWithOptions:launchOptions]; } @end

[GeneratedPluginRegistrant registerWithRegistry:self]默认注册到self.window.rootViewController的。

所以需要先初始化rootViewController,再注册Plugin。

5.3 Native调用Flutter失败

Flutter App启动后,Native调用Flutter失败?

这是因为Plugin Channel的初始化大概要1.5秒,而且这是一个异步过程。虽然Flutter页面显示出来了,但是Plugin Channel还没初始化完,所以这时Native调用Flutter是没反应的。

5.4 iOS Plugin注册到指定的FlutterViewController

闲鱼首页是Native页面,所以Window的rootViewController不是FlutterViewController,直接注册Plugin会注册失败。我们需要将Plugin注册到指定的FlutterViewController。

FlutterAppDelegate.h

08 FlutterAppDelegate.png

我们需要在AppDelegate重写上面两个方法,方法内返回需要指定的FlutterViewController。

延展讨论

Flutter作为应用层的UI框架,底层能力还是依赖Native的,所以Flutter App调用Native APIs的应用场景还是挺多的。

在Plugin方法调用过程中,可能会遇到传递复杂参数的情况(有时需要传递对象),但是Plugin的参数是JSON序列化后的二进制数据,所以传参必须是可JSON序列化的。我觉得,应该有一层对象映射层,来支持传递对象。

说到Plugin传参,Plugin有个很牛逼的能力,就是传递textures(纹理)。闲鱼的Flutter视频播放,实际上是用的Native播放器,然后将textures(纹理)传递给Flutter App。

<

扫描二维码推送至手机访问。

版权声明:本文由中客网络发布,如需转载请注明出处。

本文链接:http://www.zzzmc.cc/15.html

分享给朋友:

相关文章

闲鱼自动发布软件有什么实际作用吗?

闲鱼自动发布软件有什么实际作用吗?

  不少人在玩闲鱼时都比较“佛系”,只挂几件不用的二手商品,卖不卖的出去都无所谓。但也有人早已经看中了这个平台的商机,门槛低流量又高,逐渐转型为专业卖家。为了更好的管理店铺,提升曝光量和销售量,一般都会借助专业的工具,比如闲鱼自动发布软件,那么这个软件到底怎么用,真的有那么实用和神奇吗?   如果销售的产品比较多,一件件的挂上去需要花费不少时间,并且上新时间也会影响到曝光量,比如在平台流量比较多的晚上八点后,如果你有事情不能照顾店铺,可能就错过了这波曝光机会,但是有了闲鱼自动发布软件就轻松多了,只要提前设定好发布的产品和即将发布的时间,你就可以在用户量比较多的时间段自动发布,无论此时你在...

如何打造超级卖家,提升闲鱼排名?

如何打造超级卖家,提升闲鱼排名?

  其实现在的闲鱼技术还在不断地提高,想要霸占了闲鱼综合关键词首页,必须要提高闲鱼排名。为了能够使得闲鱼商家的店铺运营更加轻松,其实大家可以采取一些技巧或者是操作策略来实现闲鱼排名的提高。   普通的产品如果没有突出自己的特点的话,排名情况自然是并不高,如何想要提高闲鱼排名,需要从权重、图片、标题、价位等多方面来着手,也可以考虑刷单等操作的方式,只要不触碰闲鱼各项检测和风险自然就不会有问题。   闲鱼排名——权重   闲鱼权重高,排名自然就高,如果闲鱼排名上去了,流量自然也不会缺。其实很多时候宝贝没有流量就是因为权威的因素,大家可以找身边的真人朋友来帮忙提高权威,因为闲鱼的检...

为何应用闲鱼技术时离不开辅助软件

为何应用闲鱼技术时离不开辅助软件

  描述:目前随着越来越多的商家开始重视闲鱼平台,不少用户都在关注闲鱼技术同时使用具备具体功能的辅助软件,而且目前的趋势是随着闲鱼平台的机制算法不断调整,还会有更多关于闲鱼运营优化的技术出现,作为用户则要根据自己的账户情况酌情选择。   目前闲鱼技术的应用已经非常广泛,其中主要针对的就是提升闲鱼账号的权重以及优化产品排名,但是也正是这些优化技术的普及让不少用户都在使用辅助软件,而接下来就来说说使用辅助软件的意义以及要注意的事情。   产品优化以及引流等工作更加琐碎   目前提到闲鱼技术基本上都是围绕提高产品流量和账号权重的,而具体的操作方法更多是枯燥且高频率的。比如想要提高产...

在闲鱼上要怎么描述宝贝?这样描述能够获得高曝光量

在闲鱼上要怎么描述宝贝?这样描述能够获得高曝光量

  在闲鱼上要怎么描述宝贝?这样描述能够获得高曝光量      2020年09月04日   闲鱼助手   78 views   0   【闲鱼浏览量】随着在闲鱼上卖货的竞争越来越大,很多卖家都绞尽脑汁完善商品。完善商品的其中一项就是宝贝描述,想要宝贝获得高曝光亮,你一定要这样描述商品。   一:商品名称。商品的名称一定要足够直接了当,闲鱼官方分配流量是靠机器人分配流量,如果你没有直接描述名称的话,那么机器人不知道应该把你的商品分配到哪一种类,没有被分配,就不会获得流量。谨记这一点:你一定要明确商品名称。   【闲鱼浏览量】二:商品的新旧程度。商品...

如果闲鱼没有曝光,我们该怎么办

如果闲鱼没有曝光,我们该怎么办

  现在有越来越多的人成为闲鱼卖家,每个人都想做赚钱的闲鱼,但很多人没有方法,导致没有浏览,所以他们的商品不能出售。那么我们国家应该如何解决这个社会问题?今天,我会带给你如何改善你的闲散的鱼浏览。   第一,我们重新去发布商品,因为自己的商品没有浏览量,我们重新删除了再发布,这样的话,闲鱼的排名就会靠前,我们的浏览量也会慢慢的提高,但是我们在发布商品时,也有一些小技巧,我们应该去错开上班时间去发布,在别人下班的时候发布自己的商品,这样别人下班时间可以浏览闲鱼,如果自己的闲鱼排名靠前,浏览到你商品的几率就会变大,这样我们的浏览量也会大大的提高。   二,我们的教师可以修改付款并给予各...

怎么才能做好闲鱼账号

怎么才能做好闲鱼账号

  自己新开一个咸鱼账号,但是如何经营它呢?这也需要很多的实践和理论相结合的去学习。   第一个就是找到一个商品,找到之后发布这个商品,如果你的商品上架之后,别人赞过你的商品,或者给你留言,这都可以增加你的浏览量,然后让你的商品上推荐。但是不要卖一些违规的商品,或者是虚拟的商品,还有一些假货,所以如果你要想在闲鱼上运营,就必须去遵守闲鱼的规则。一定要有耐心,因为新开一个账号的话,首先它的年限没有这么长,而且虽说浏览量都是平均的吧,但是你的信用度或者权重不高,你的流量也不会太多。   第二个就是如何给自己的商品做客服,要知道,有一些他们并不是很想买,但就是想要问问的人,你可以通过一个...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。