混合开发框架|Flutter多引擎dart多入口设计实现
Flutter多引擎&dart多入口设计
- Flutter项目混合架构
- FlutterFragment普通实现设计
- 解释截图中代码片逻辑含义
- 系统FlutterFragment自带普通设计实现
- 自定义FlutterFragment
- Flutter多引擎设计
- Flutter dart入口设计
仿照工行投资理财页面,使用Flutter实现。通过此讲述混合开发中,项目设计中,需求下如何创建多个Flutter引擎。Flutter引擎如何对应各自的dart入口,并实现每个Flutter引擎下路由切换页面。从而完成Flutter项目架构的设计搭建。
Flutter项目混合架构
FlutterFragment普通实现设计
系统有提供用来容放Flutter UI的容器
,即FlutterFragment继承自androidx.fragment.app.Fragment
。FlutterFragment作为FlutterEngine控制面提供Android资源和生命周期事件,并会attach到Activity。FlutterFragment终以内部方法public <T extends FlutterFragment> T build()
反射获取Fragment实例。并作为当前Activity页面一部分显示出来。
说白了,就是使用混合开发。从原生项目转入到Flutter项目中,是将Flutter项目UI作为原生项目(如Activity)显示页面的一部分(撑满整个页面)来实现。
解释截图中代码片逻辑含义
红圈5, withCachedEngine(id) 中的 id ,有被FlutterEngineCache.getInstance().put(id, flutterEngine)
和.get(id)
用到,表示会将该id作为缓存FlutterEngine实例的键值对key。
追踪代码withCachedEngine(id)
的执行,在FlutterFragment源码中,静态内部类构造方法CachedEngineFragmentBuilder
中,id会被赋值给FlutterFragment全局变量String engineId
。之后在反射获取FlutterFragment实例逻辑的同时,储到FlutterFragment的Bundle中。
FlutterFragment中方法getCachedEngineId
,对外提供获取该id
。
FlutterActivityAndFragmentDelegate
在Activity启动过程会执行onAttach方法,内部会执行到方法setupFlutterEngine
中通过该id获取已缓存的FlutterEngine实例。这个是id的使用目的。
红圈5, shouldAttachEngineToActivity(true) 设置true,目的则是同上面逻辑分析,执行到onAttach方法时,则会执行下面代码片【使用获取到的已缓存的FlutterEngine实例,将已附着插件资源的Flutter引擎附着到Activity中,且生命周期与Activity同步】
Log.v(TAG, "Attaching FlutterEngine to the Activity that owns this delegate.");
flutterEngine.getActivityControlSurface().attachToActivity(this, host.getLifecycle());
系统FlutterFragment自带普通设计实现
- FlutterEngine实例的创建,缓存。如红圈3和4.
- 使用引擎实例配置默认(初始态)的路由path,如
/fragment-icbc
。如红圈1。 - 使用引擎实例配置进入到Flutter-dart代码的入口。如红圈2。
- 创建MethodChannel实例,并传入设置通道名称name。
MethodChannel实例.setMethodCallHandler
配置Flutter端向原生端的通信监听。
以上配置完成后,在Flutter项目源码中,dart代码入口文件main.dart。使用路由实例.push(name: window.defaultRouteName);
,即可将Flutter项目首页展示原生项目已配置的默认(初始态)路由path对应的页面。
自定义FlutterFragment
源码展示
Flutter多引擎设计
Flutter的多引擎设计,利用Flutter中引擎的缓存容器FlutterEngineCache实现。
// 这里定了方法:用来初始化创建,新建flutter引擎实例。
private fun initFlutterEngine(context: Context, moduleName/**缓存到FlutterEngineCache的key*/: String) {var flutterEngine = FlutterEngine(context, FlutterLoader(), FlutterJNI())// ...省略 MethodChannel 的配置..flutterEngine.dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint(FlutterLoader().findAppBundlePath(), moduleName/**因为入口方法名,配置在这里了!*/))
}
// DartExecutor.java
// 系统源码中,有介绍 `dartEntrypointFunctionName`是dart入口方法名,且在DartEntrypoint构造方法中传入并赋值。
/** The name of a Dart function to execute. */
@NonNull public final String dartEntrypointFunctionName;
对已创建的Flutter引擎,之后使用FlutterEngineCache缓存起来。此时moduleName
则对应dart入口方法名!
【注:Native和Flutter通信,MethodChannel配置的name须一致。】
Flutter dart入口设计
在Flutter项目入口文件main.dart中,仿照默认初始入口定义规范
void main() {runApp(const FinanceApp());
}
在同一Flutter项目,自定义其他dart入口
// 定义新的dart入口,需要使用注解 @pragma('vm:entry-point')。其他不变。
@pragma('vm:entry-point')
void finance() {runApp(const FinanceApp());
}
混合开发框架|Flutter多引擎dart多入口设计实现相关推荐
- 【开发经验】在Flutter中使用dart的单例模式
最近学Flutter,百度了一下午也没搜到Dart语言的单例怎么写,最后去看一个NotificationCenter的库的源码,才找到单例写法,经测试可用,贴一下代码. Flutter中,dart的单 ...
- flutter优缺点_混合开发框架最全对比,为什么我更推荐Flutter?
点击上方的终端研发部,右上角选择"设为星标" 每日早9点半,技术文章准时送上 公众号后台回复"学习",获取作者独家秘制精品资料 转自:https://www.l ...
- 混合开发框架的对比,Flutter更胜一筹?
Flutter开发简介与其他的混合开发的对比 为什么要使用Flutter? 跨平台技术简介 Hybrid技术简介 QT简介 Flutter简介 为什么要使用Flutter? Flutter有什么优势? ...
- 混合开发框架最全对比,为什么我更推荐Flutter?
前言 Flutter开发简介与其他的混合开发的对比 为什么要使用Flutter? 跨平台技术简介 Hybrid技术简介 QT简介 Flutter简介 为什么要使用Flutter? Flutter有什么 ...
- flutter的引擎,Dart语言概括
什么是Dart? Dart是谷歌开发的,类型安全的,面向对象的编程语言,被应用于Web.服务器.移动应用和物联网等领域. dart是谷歌在2011年推出的编程语言.谷歌希望使用dart来取代JavaS ...
- Flutter混合开发框架安装流程(亲测能用)
简介 什么是Flutter?Google旗下的混合开发框架,一套代码能打包出androidAPP和ios应用.OK,就介绍这么多,下面直接讲安装流程. 安装流程 1.下载flutter sdk 首先你 ...
- Flutter学习之Dart语法特性
一.前言 第一天把Flutter环境搭建了,并简单实现第运行第一个Flutter项目,感觉很不错,一些基本操作和原生体验差不多.用Flutter框架写过App项目的开发者都知道,Flutter是一个使 ...
- qt框架的开发模式_Flutter 混合开发框架模式探索
Flutter 混合开发框架模式探索 由于 Google 官方提供的 Flutter 混合式开发方案过于简单,仅支持打开一个 Flutter View 的能力,而不支持路由间传参.统一的生命周期.路由 ...
- iPad大屏Flutter多引擎适配之路(详细)
背景 在电商场景中iPad的大屏拥有比普通手机相比更大的屏幕,对于购物体验而言,如能充分利用好iPad的大屏体验,无疑提高用户购买体验,但一直以来在混合栈应用特别是Flutter混合栈中,在iPad大 ...
最新文章
- android 中国通信乱码问题
- Servlet3.0学习总结(三)——基于Servlet3.0的文件上传
- pycharm安装包时各种报错,且pip无法安装
- 新手学python书籍推荐_新手学python看哪本书
- .NET Core中的CSV解析库
- Java 程序员必须掌握的 Linux 命令
- 透传模式(透明传输SeriaNet)详解
- Python入门-散点图绘制
- linux 二进制安装mysql
- mac 上 php 验证码不显示图片
- Mybatis-学习笔记(7)缓存机制
- Arx常用代码《转》
- java ajax是什么东东_Ajax是什么意思,它是在做什么用的?
- 基于随机游走的PersonalRank
- 真!AI低代码平台——瀚码编程小助手“叨叨“正式上线!
- 深富策略:盘面太墨迹 期待来根大阳线
- 设计一个排序和查找系统。能够实现对给定的一组学生的借书证信息(如:卡号、姓名、系别、班号等)进行排序和查找。
- 微信支付一直抱签名错误,但是校验通过。
- ansys workbench中fluent划分网格出现如下错误:The mesh file exporter failed during translation.
- 2020计算机数电实验二
热门文章
- 图形API学习工程(4):梳理:以Vulkan为中心梳理当前初始化阶段的代码
- Copy of ShortCut to
- 点石互动--zac之:SEO教程写作计划
- 久石让《龙猫》豆豆龙 钢琴视奏版
- js中冒泡和捕获/阻止冒泡和捕获事件
- 图像目标区域质心计算
- Python 多线程入门和简单的基于多线程的流量泛洪攻击
- mybatis学习四(代码生成器MGB)
- 麻雀搜索算法(SSA)文章复现:《基于混沌麻雀搜索算法的无人机航迹规划方法_汤安迪》
- 在不同领域中典型的计算机应用实例,浅析案例教学法在《计算机应用基础》教学中应用.doc...