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多入口设计实现相关推荐

  1. 【开发经验】在Flutter中使用dart的单例模式

    最近学Flutter,百度了一下午也没搜到Dart语言的单例怎么写,最后去看一个NotificationCenter的库的源码,才找到单例写法,经测试可用,贴一下代码. Flutter中,dart的单 ...

  2. flutter优缺点_混合开发框架最全对比,为什么我更推荐Flutter?

    点击上方的终端研发部,右上角选择"设为星标" 每日早9点半,技术文章准时送上 公众号后台回复"学习",获取作者独家秘制精品资料 转自:https://www.l ...

  3. 混合开发框架的对比,Flutter更胜一筹?

    Flutter开发简介与其他的混合开发的对比 为什么要使用Flutter? 跨平台技术简介 Hybrid技术简介 QT简介 Flutter简介 为什么要使用Flutter? Flutter有什么优势? ...

  4. 混合开发框架最全对比,为什么我更推荐Flutter?

    前言 Flutter开发简介与其他的混合开发的对比 为什么要使用Flutter? 跨平台技术简介 Hybrid技术简介 QT简介 Flutter简介 为什么要使用Flutter? Flutter有什么 ...

  5. flutter的引擎,Dart语言概括

    什么是Dart? Dart是谷歌开发的,类型安全的,面向对象的编程语言,被应用于Web.服务器.移动应用和物联网等领域. dart是谷歌在2011年推出的编程语言.谷歌希望使用dart来取代JavaS ...

  6. Flutter混合开发框架安装流程(亲测能用)

    简介 什么是Flutter?Google旗下的混合开发框架,一套代码能打包出androidAPP和ios应用.OK,就介绍这么多,下面直接讲安装流程. 安装流程 1.下载flutter sdk 首先你 ...

  7. Flutter学习之Dart语法特性

    一.前言 第一天把Flutter环境搭建了,并简单实现第运行第一个Flutter项目,感觉很不错,一些基本操作和原生体验差不多.用Flutter框架写过App项目的开发者都知道,Flutter是一个使 ...

  8. qt框架的开发模式_Flutter 混合开发框架模式探索

    Flutter 混合开发框架模式探索 由于 Google 官方提供的 Flutter 混合式开发方案过于简单,仅支持打开一个 Flutter View 的能力,而不支持路由间传参.统一的生命周期.路由 ...

  9. iPad大屏Flutter多引擎适配之路(详细)

    背景 在电商场景中iPad的大屏拥有比普通手机相比更大的屏幕,对于购物体验而言,如能充分利用好iPad的大屏体验,无疑提高用户购买体验,但一直以来在混合栈应用特别是Flutter混合栈中,在iPad大 ...

最新文章

  1. C++:求极值的 min_element、max_element和minmax_element算法
  2. hadoop报错:WARN mapred.JobClient: Error reading task outputNo route to host
  3. 前端文件表单/ajax上传实例代码
  4. 华为和荣耀蓝牙耳机为什么那么贵?
  5. Python 大数据分析疫情:如何实现实时数据爬取及 Matplotlib 可视化?
  6. 专访蒋彪:JavaEE是企业级开发首选
  7. 创建用户赋权限_JMeter接口测试实战之「创建用户」篇
  8. 2022最新开源分销商城小程序源码系统前端+后端+搭建教程
  9. steam游戏直连工具
  10. 【贪心算法】POJ-1328 区间问题
  11. promise是什么?
  12. 1.Dosbox的安装与使用
  13. Frida:一款可以绕过越狱检测的工具
  14. LTE学习笔记--PRACH
  15. 中望3D 2021 轴类零件灵活自动螺纹收尾
  16. 电子商务系统的建设方式及技术选择
  17. java中super用来定义父类,定义子类必须使用的关键字是 在java中子类若要继承父类,需要使用的关键字是什么...
  18. 如何利用Python实现工作中的自动化
  19. android实现调用科大讯飞语音识别功能详细步骤
  20. FFmpeg使用X264编码参数

热门文章

  1. php二叉树最短路径,二叉树最短路径
  2. 证券从业考试备考经验
  3. 文件上传下载导入导出
  4. 改进zhang方法图像细化(单像素)
  5. Android性能优化之加快应用启动速度
  6. uni map地图相关使用小计(多点标识,拖拽起点,地图画圆)
  7. win10+ubuntu双系统,重装win10后修复ubuntu引导的方法
  8. 【网络安全】我的第一次windows服务器杀毒经历
  9. linux c语言 exit函数,C语言中exit();怎么用?
  10. Config原理解析,项目搭建以及如何获取不同环境下的配置文件信息(一)