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