likes
comments
collection
share

Flutter 与Windows平台交互(Method&Event Channel)

作者站长头像
站长
· 阅读数 22

Flutter在IOS和ANDROID平台上已经有大量的中文文章了,但是桌面端还在BETA。作为一个爱折腾的废柴大三学生,写点东西帮帮有需要的人吧。(源码在文章末尾)

大家都知道Flutter提供了Platform Channel机制来和平台通信,但是官方文档仅仅提供了移动端的用法,通过对网上为屈指可数的文章梳理,这里总结了Win32平台下,两种Channel的用法。

Channel有关的内容都在services.dart内,使用前记得导入,不多说了,开码!

MethodChannel

  1. 首先在Flutter端创建一个MethodChannel,参数为该Channel的名称。

Flutter 与Windows平台交互(Method&Event Channel)

  1. 回到平台代码,Win32的代码flutter已经生成在了windows文件夹内,是一个Cmake的工程。我们需要手动编辑flutter_window.cpp文件,在FlutterWindow::OnCreate函数向Flutter Engine注册Channel。(为什么是这个文件?为什么是在这个位置?在之后的专栏我会写一篇关于Flutter Win32是如何启动的文章,点个关注就可以收到通知了🤭)

Flutter 与Windows平台交互(Method&Event Channel)

OnCreate的内容如下:

(看不懂不影响,只需知道代码走到了第二个if语句下面,表示engine启动成功和view渲染成功了)

Flutter 与Windows平台交互(Method&Event Channel)

  1. FlutterWindow::OnCreate的底部配置Channel信息,这里为了代码简洁,我们自己写个函数调用。

首先,引入必要的头文件,第一个是method_channel的定义,第二个是解码器。

Flutter 与Windows平台交互(Method&Event Channel)

接着,创造一个解码器,这里使用flutter提供的StandardMethodCodec,然后获得引擎的messenger,最后通过method_channel.hMethodChannel实现去处理注册逻辑。

Flutter 与Windows平台交互(Method&Event Channel)

最后,设置flutter::MethodChannelSetMethodCallHandler属性来配置调用内容。这里有几个要点要注意,compare对比的是Flutter端MethodChannel的invokeMethodresultSuccess调用返回的信息必须用flutter::EncodableValue包装,否则Flutter端只会收到true而不是你想传达的信息。Error同理,它会走到Flutter端的try catch语句块内,错误信息就是你用flutter::EncodableValue包装的内容。

Flutter 与Windows平台交互(Method&Event Channel)

Flutter调用代码如下:

Flutter 与Windows平台交互(Method&Event Channel)

控制台输出结果如下:

Flutter 与Windows平台交互(Method&Event Channel)

还有一件事:千万别在Native调用的地方写一些会导致阻塞的代码,这可能会导致PlatForm Thread阻塞,使得UI也就是你的Flutter端无法正常渲染界面,即画面卡死,鼠标一个圈圈一直转。

EventChannel

EventChannel就复杂了一些,上面的MethodChannel是Flutter调用Native,而到EventChannel这里,则更像是Native去主动调用Flutter。这里涉及到一些Stream的内容知识,不懂的可以到这个视频学习学习。

Flutter 教程 Async-4 Stream与StreamBuilder组件_王叔

MethodChannel的配置类似,步骤如下:

  1. Flutter端设置好EventChannel

Flutter 与Windows平台交互(Method&Event Channel)

  1. 同样在flutter_window.cpp内,向engine注册EventChannel。 首先,引入必要头文件,然后同样的注册步骤来一遍:

Flutter 与Windows平台交互(Method&Event Channel)

Flutter 与Windows平台交互(Method&Event Channel)

然后,设置event_channel_SetStreamHandler

好奇这个SetStreamHandler是什么可以去头文件看,不复杂,但是这边就不多做介绍。 这个SetStreamHandler的参数是一个StreamHandlerFunctions的指针,要求提供on_listenon_cancel的函数。(什么时候调用Cancel,什么时候返回的是Success还是Error,这部分内容可以去研究AnimationController的Cancel)

Flutter 与Windows平台交互(Method&Event Channel)

注意!! on_cancel和on_listen的类型是不一样的!!

这里为了防止阻塞,开了一个新的线程来发送Event。 Flutter 与Windows平台交互(Method&Event Channel)

  1. 最后,在Flutter端,简单的设置监听Stream

Flutter 与Windows平台交互(Method&Event Channel)

运行截图

Stream,涓涓细流,2S一个Event,芜湖! Flutter 与Windows平台交互(Method&Event Channel)

源码&Demo

不多说,上图,注释完备。

GitHub:Chinouo/flutter_channel_win32

只动了一个平台文件:flutter_window.cpp,请用flutter run启动。

Flutter 与Windows平台交互(Method&Event Channel)

转载自:https://juejin.cn/post/7023209343340249101
评论
请登录