【Flutter小记5】Isolate && ffi && Method Channel 使用简介与总结
一. Method Channel:
在做部分定制功能的需求,我们总避免不了要与原生平台做交互
iOS 平台 : dart -> oc / swift
Android 平台: dart -> java/kotlin
那么Flutter 为我们提供了比较便捷的 Method Channel 方式来与原生代码进行交互,具体不赘述,看官方文档:
撰写双端平台代码(插件编写实现) - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter
注意:使用Method Channel 前记得先:
WidgetsFlutterBinding.ensureInitialized();
二. dart 中的 isolate 线程
有时候我们为了不影响UI展示的流畅度,会新起一个线程,做一些事情。dart 提供 isolate 线程,至于isolate 的基础使用,大家请自行搜索,这里不赘述。
强调一点:Method Channel 方式有个最大的弊端:
只能在主线程使用,那么如果我们想在另起一个 isolate上使用是不允许的!
三:ffi
由于dart 提供了ffi (可以直接与c/c++交互) ,类似Android 的jni ,但是要按照要求书写交互代码,如果不使用插件ffigen来生成,谁写谁难受...
ffi 主要优势:
1. 与c/c++直接交互
2. 可以直接在任意 isolate 线程中使用
3. 如果使用 c++ 来编写部分功能逻辑,那么Android 与 iOS 代码则通用
总结几点使用需要注意与推荐:
1. 如果项目高频计算量的,很推荐使用 isolate + ffi + c/c++ 来做:(例如 opencv 或者 tflite 相关的逻辑。)独立线程不影响Flutter 主UI线程,且代码执行效率高!
2. 如果使用ffi ,那么:
a) 推荐使用 ffigen ,只需要编写c++ 的.h文件,使用 dart run ffigen 即可生成dart 与 c++ 交互代码!非常推荐! Himi手写过,手写真的有点烦...!
b) ffi 返回值使用结构体时,尽量不要使用结构体指针数组!可以嵌套结构体,但是不要嵌套结构体指针数组,不然很容易异常!