剩下的前语
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_boost
、 mix_stack
、 flutter_thrio
等等 ,它们shell是什么意思中文是否好用这儿不评论,可是apple这些计划都要面临的问题是:
非apple官方的支撑必定存在每个版别需求适配的问题,而按照 Flutter 现在的
issue closed
和pr merge
的速度,很或许每个季度的版别都存在较大的变化,所以假如开发者不保护或许保护不及时,那fluttering么侵入性极强的这类结构很容易就成为项目的瓶颈。shell是什么意思中文
而官方供给的 FlutterEngineGroup
计划有没有缺点?必定有的,它现在看起来更像是被催生出来的情况,各方面的问题仍是有flutter结构的,比ios模拟器如某些当地还存在不能shelly-lan destroy
的问题。 (当然这个问题以及在 master
分支 mergshell脚本e 了)
可是官方供给的计划,就意味着这个规划得到了 Flutter 官方的保证,在未来的版别中会有兼容的优势。
FlutterEngineGroup
计划运用了多 Engine 混合模式,官方声称除了一个 Engine 政策之外,后续每个 Engine 政策在 Android 和 iOS 上仅占用 180kB 。
曾经的计划每多一个Engine ,或许就会多出 19MB Android 和 13MB iOS 的占用。
从 Flutter 官方供给的比方上看,FlutterEnflutter结构优缺点gineGroup
的 API 非常简略,多个 Engine 实例的内部都是独立保护自己的内部导航库房,所以能够做到每个 Engine 对应一个独立的模块。
所以运用 FlutterEngineapproveGroup
之后,FlutterEngine
都将由 FlutterEnginandroid/yunoseGroup
去生成,生成的 FlutterEngine
能够独立运用androidstudio装置教程于 FlutterActivity
/FlutterViewControandroid什么意思llandroid/yunoser
,乃至是 FlutterFragment
:
所以就像比方上所示,你能够在一个
Activity
上闪现两个独立的 FlutterViewflutter是什么意思 。
这其实得益于经过 FlutterEngineGroup
生成appear的 FlutterEnapprovegine
能够同享 GPU 上下文, font metrics 和 iflutter面试题solate group snapshot ,然后完结了更快的初始速度和更低的内存占用。
下图是运用官方实例翻开16个页面之后的内存运用情况,而且每个页面成功回来且没有呈现黑屏。
简略的运用介绍
运用 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、首要经过 findAppBundlePath
和 entandroid手机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、经过上面创立的 dartEntrypoint
和 context
,运用 FflutteredlutterEngineGroup
就能够创立出对应的 FliOSutterEnandroid手机gine
,其实在内部便是shell脚本经过FlutterJNI.nativeSpawn
和原有的引擎交互,得到新的 Long 地址 id。
在 C++ 层相似于原有的
RunBundleAndSnapshotFromLibrary
办法,可是它不能更改包途径或许 asset ,所以只能加载同一份 AOT 文件,这儿得到的指针地址便是ios是什么意思一个新的AndroidShellHolder
。
3、最终运用生成的 FlutterEngine
的 binaryMessenger
来得到一个 MethodChannel
用于原生和 dart 之间的通讯。
经过上述流程得到的 Engine ,天然就能够直接用于烘托作业shellfish新的 Flutter UI,比方直接承继 FlutterActivity
,然后 override proviappeardeFlutterEngine
方flutter菜鸟教程法回来得到的 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
的开展将会越来越明朗,更早的被运用到出产环境中。