Flutter 与Windows平台交互(Method&Event Channel)
Flutter在IOS和ANDROID平台上已经有大量的中文文章了,但是桌面端还在BETA。作为一个爱折腾的废柴大三学生,写点东西帮帮有需要的人吧。(源码在文章末尾)
大家都知道Flutter提供了Platform Channel机制来和平台通信,但是官方文档仅仅提供了移动端的用法,通过对网上为屈指可数的文章梳理,这里总结了Win32平台下,两种Channel的用法。
Channel有关的内容都在services.dart内,使用前记得导入,不多说了,开码!
MethodChannel
- 首先在Flutter端创建一个
MethodChannel,参数为该Channel的名称。

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

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

- 在
FlutterWindow::OnCreate的底部配置Channel信息,这里为了代码简洁,我们自己写个函数调用。
首先,引入必要的头文件,第一个是method_channel的定义,第二个是解码器。

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

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

Flutter调用代码如下:

控制台输出结果如下:

还有一件事:千万别在Native调用的地方写一些会导致阻塞的代码,这可能会导致PlatForm Thread阻塞,使得UI也就是你的Flutter端无法正常渲染界面,即画面卡死,鼠标一个圈圈一直转。
EventChannel
EventChannel就复杂了一些,上面的MethodChannel是Flutter调用Native,而到EventChannel这里,则更像是Native去主动调用Flutter。这里涉及到一些Stream的内容知识,不懂的可以到这个视频学习学习。
Flutter 教程 Async-4 Stream与StreamBuilder组件_王叔
与MethodChannel的配置类似,步骤如下:
- Flutter端设置好
EventChannel

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


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

注意!! on_cancel和on_listen的类型是不一样的!!
这里为了防止阻塞,开了一个新的线程来发送Event。

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

运行截图
Stream,涓涓细流,2S一个Event,芜湖!

源码&Demo
不多说,上图,注释完备。
GitHub:Chinouo/flutter_channel_win32
只动了一个平台文件:flutter_window.cpp,请用flutter run启动。

转载自:https://juejin.cn/post/7023209343340249101