剩下的前语

Flutter 2.0 发布时,其间最受咱们重视之一的内容便是 Add-to-App 相关的更新,由于除了热更新之外,Flutter 最受咱们诟病ios退款的便是混合开发领会欠好。

为什么欠好呢?由于 Flutter 的控件烘托直接脱离了原生途径,也便是不管页面库房和烘托树都独立于途径作业,这当然给 Flutter 带来了较好的跨途径领会,可是也造成了在和原生途径混合时存在高本钱的问题。

ios体系不说在已android平板电脑价格有的原生项目中集成 Flutter ,便是现阶段在 Flutter 中集成原approve生控件的 PlatformView 和 Hybrid Composition 领会也是有待提高,当然“有支撑”和“能用”就现已是很不错的开展。

所以 Flutter 2.0 在千呼万唤中发布了fluttering FlutterEngineGrshell是什么意思中文oup 用于支flutter面试题撑官方的 Addfluttered Flutter to existing aandroid什么意思pp 计划。

在此计划呈现之前,相似的第三方支撑有 flutter_boostmix_stackflutter_thrio 等等 ,它们shell是什么意思中文是否好用这儿不评论,可是apple这些计划都要面临的问题是:

apple官方的支撑必定存在每个版别需求适配的问题,而按照 Flutter 现在的 issue closedpr merge 的速度,很或许每个季度的版别都存在较大的变化,所以假如开发者不保护或许保护不及时,那fluttering么侵入性极强的这类结构很容易就成为项目的瓶颈shell是什么意思中文

而官方供给的 FlutterEngineGroup 计划有没有缺点?必定有的,它现在看起来更像是被催生出来的情况,各方面的问题仍是有flutter结构的,比ios模拟器如某些当地还存在不能shelly-lan destroy 的问题。 (当然这个问题以及在 master 分支 mergshell脚本e 了)

Flutter 2.0 下混合开发浅析

可是官方供给的计划,就意味着这个规划得到了 Flutter 官方的保证,在未来的版别中会有兼容的优势

FlutterEngineGroup 计划运用了多 Engine 混合模式,官方声称除了一个 Engine 政策之外,后续每个 Engine 政策在 Android 和 iOS 上仅占用 180kB

曾经的计划每多一个Engine ,或许就会多出 19MB Android 和 13MB iOS 的占用。

从 Flutter 官方供给的比方上看,FlutterEnflutter结构优缺点gineGroup 的 API 非常简略,多个 Engine 实例的内部都是独立保护自己的内部导航库房,所以能够做到每个 Engine 对应一个独立的模块。

Flutter 2.0 下混合开发浅析

所以运用 FlutterEngineapproveGroup 之后,FlutterEngine 都将由 FlutterEnginandroid/yunoseGroup 去生成,生成的 FlutterEngine 能够独立运用androidstudio装置教程FlutterActivity/FlutterViewControandroid什么意思llandroid/yunoser,乃至是 FlutterFragment

所以就像比方上所示,你能够在一个 Activity 上闪现两个独立的 FlutterViewflutter是什么意思

这其实得益于经过 FlutterEngineGroup 生成appearFlutterEnapprovegine 能够同享 GPU 上下文, font metrics 和 iflutter面试题solate group snapshot ,然后完结了更快的初始速度和更低的内存占用。

下图是运用官方实例翻开16个页面之后的内存运用情况,而且每个页面成功回来且没有呈现黑屏。

Flutter 2.0 下混合开发浅析

Flutter 2.0 下混合开发浅析

简略的运用介绍

运用 Flutflutter菜鸟教程terEngineGroup 首要需求创立一个 FlutterEngineGios14桌面布局图片roup 单例政策,之后每逢fluttered需求创立 Engine 时,就经过它的 createAndRunEngine(activity, dartEntrypoint) 来创立对应的 FlutterEngine

        val app = activity.applicationContext as App
// This hshell脚本基本命令as to be lazy to avoid creation before the FlutterEngineGroup.
val dartEntrypoint =
DartExecutor.DartEntrypoint(
FlutterInjector.instance().fappreciatelutterLoader().findAppBundlePath(), entrypoint
)
engiiOSne = app.enios体系gines.createAndRunflutter中文官网Engine(activity, dartEntflutter结构优缺点rypoint)
this.deliOSegate = delegatfluttershye
channel = MethodChannel(engine.dartExecutor.binaryMessenger, "multiple-flutters")

以官方 Demo 的这段代码为比方:

1、首要经过 findAppBundlePathentandroid手机rypoint 创立出 DartEntrypoint 政策,这儿的 findAppappointmentBundlePath 首要便是默认的 flutter_assets 目录;而 entrypios体系oint 其实便是 dart 代码里发起办法的称谓;也便是绑定了在 dart 中 runApp 的办法。


/shelly-lan//flutter是什么意思kotlin
app.engines.createAndRunshellyEngine(pathToBundlapproache, "topMain")
///dart
@prandroid什么意思agma('vm:entry-point')
void topMain(shell编程) => runAppshelly(MyApp());

2、经过上面创立的 dartEntrypointcontext ,运用 FflutteredlutterEngineGroup 就能够创立出对应的 FliOSutterEnandroid手机gine ,其实在内部便是shell脚本经过FlutterJNI.nativeSpawn 和原有的引擎交互,得到新的 Long 地址 id。

在 C++ 层相似于原有的 RunBundleAndSnapshotFromLibrary 办法,可是它不能更改包途径或许 asset ,所以只能加载同一份 AOT 文件,这儿得到的指针地址便是ios是什么意思一个新的 AndroidShellHolder

3、最终运用生成的 FlutterEnginebinaryMessenger 来得到一个 MethodChannel 用于原生和 dart 之间的通讯。

经过上述流程得到的 Engine ,天然就能够直接用于烘托作业shellfish新的 Flutter UI,比方直接承继 FlutterActivity ,然后 override proviappeardeFlutterEngineflutter菜鸟教程法回来得到的 Engine 。


class SingleFlutterActivity : FlutterActivity()

override fun provideFlutterEngine(context: Context): FlutterEngine? {
return engine
}
}

是不是很简略?这么简略的接入后:

  • 在 dart 层面能够经过 MethodChannel 翻开原始页面;
  • 在原生层能够经过新建 FlutterEngine 翻开新的 Flutteappreciater 页面;
  • 乃至你还能够在原生层翻开一个 FlutterView 的 Dialog;

当然,到这儿你或许现已留心到了,由于每个 Flutter 页面都是一个独立的 Engine ,由于 dart isolate 的规appear划理念,每个独立 Engine 的 Flutter 页面内存是无法同享的

也便是说,当你需求同享数据时,只能在原生层持有数据,然后注入或许传递到每个 Flutter 页面中,ios是什么意思就像官方所说的,每个 Flutter 页面apple更像是一个独立android下载装置 Flutter 模块flutter结构优缺点

当然这也造成了一些不必要的费事,比方:同一张图片,在原生层、不同 Flutter Engine 会呈现屡次加载的问题,这种shell怎样读问题或许就需求你针对 Flutter 的图片加载运用外界纹理,来完结在原生层一致的内存办理等。

其他现在我发现问题还有appointment: Android 11 上的 ARM TBI 问题 ,不过经过这次尝试,信赖 FlutterAPPEngineGroup 的开展将会越来越明朗,更早的被运用到出产环境中。