当前位置: 首页 > news >正文

Flutter混合栈管理方案对比

        1.Google官方(多引擎方案)

        Google官方建议的方式是多引擎方案,即每次使用一个新的FlutterEngine来渲染Widget树,存在的主要问题是每个引擎都要有比较大的内存等资源消耗,虽然Flutter 2.0之后的FlutterEngineGroup通过在引擎间共享GPU 上下文、font metrics 和 isolate group snapshot,开销已大大降低,但是仍然没有解决每个FlutterEngine是一个单独isolate,不同FlutterEngine间的通信将会是非常麻烦的问题。

        2.大名鼎鼎的闲鱼flutter_boost(单引擎方案)

        Flutter Boost采用的是直接共享Flutter engine对象,在页面切换时, Flutter View与Flutter Engine进行attach与detach操作。Flutter boost早期版本Dart侧维护了一个Navigator栈的结构,基于栈的操作依赖对Flutter框架的一个属性修改,具有侵入性,并且由于pop出的页面就会销毁,在多个平级逻辑页面切换,无法使其它flutter平级页面状态得到保持。最新版本主要变化是, 不再用栈式结构来管理Flutter页面, 改为在native侧和Flutter侧对所有页面都进行缓存。页面的创建与销毁与对应的native容器的生命周期保持一致。这一改变解决了侵入性问题,并且所有页面的状态都可以保持。

        简言之, Flutter boost最新版本的核心逻辑是,页面导航的核心仍然由native进行驱动,根据native侧的页面生命周期事件,通过channel通知Flutter侧响应页面上屏等逻辑。 对于每个Flutter页面, 在native侧, 则都有一个FlutterViewContainer实例与之对应,  在dart侧则是一个BoostContainer实例,其缓由FlutterContainerManager进行管理,两者通过通信,保持生命周期一致。哪个页面需要显示,在native侧就是将对应的vc push进导航栈,同时将flutter引擎attach到对应的FlutterViewController。

       但Flutter boost方案仍然存在一些问题:

        (1)开源版本不够稳定, 适配Flutter新版本非常慢

        (2)未完全剥离对阿里业务框架的依赖,里面包含很多与导航无关的代码依赖

        3.哈喽单车团队的flutter_thrio(单引擎/多引擎均支持)

        flutter_thiro是哈喽单车团队提供的一个解决方案,其与flutter_boost的主要不同是,flutter_boost的导航切换都是由native侧驱动,每次页面切换native侧都会创建一新的页面放到导航栈中,而flutter_thrio在native之间及native和flutter之间的页面切换同样由native侧驱动,但flutter页面内部的切换由flutter自带的Navigator来管理,native侧导航栈不创建对应的页面容器。这样做的好处是可以节省部分内存,但需要通过一层包装处理隔离这种导航实现方式上的差异,实现上会更复杂一些。

        

       ​​​​ 不过flutter_thrio整体封装相当不错,所有的页面切换逻辑非常统一,均采用基于url进行页面跳转。同时既支持单引擎工作模式,也支持多引擎工作模式,同时不存在对引擎代码的侵入式修改,不过该方案开源代码已经有两年多没有更新,如果遇到问题,可能需要自行维护。

        4.字节跳动团队的Isolate复用方案和腾讯心悦团队的TRouter方案

        这两个方案均未开源介绍来看都存在flutter引擎侵入式修改,比如今日头条的方案就是通过修改 Flutter Engine 源码,使多 FlutterView 实例对应的多 Flutter Engine 能够在底层共享 Isolate。即在上层看来有多个Flutter Engine 实例,但在底层只有一个唯一的Isolate,这样就可以在解决多引擎内存占用大的问题的同时,保持数据仍然可以在引擎间共享。这类侵入性比较强的方案存在的主要问题是,接入方案就需要接入相关的自定义flutter引擎代码,后续在可维护性上以及对flutter版本升级的兼容性上都存在较大不确定性。

相关文章:

Flutter混合栈管理方案对比

1.Google官方(多引擎方案) Google官方建议的方式是多引擎方案,即每次使用一个新的FlutterEngine来渲染Widget树,存在的主要问题是每个引擎都要有比较大的内存等资源消耗,虽然Flutter 2.0之后的FlutterEngineGroup通过在…...

Asp .Net Core 集成 Newtonsoft.Json

简介 Newtonsoft.Json是一个在.NET环境下开源的JSON格式序列化和反序列化的类库。它可以将.NET对象转换为JSON格式的字符串,也可以将JSON格式的字符串转换为.NET对象。这个类库在.NET开发中被广泛使用,因为它功能强大、易于使用,并且有良好的性能。 使用Newtonsoft.Json,…...

GPT对话知识库——ARM-Cortex架构分为哪几个系列?每个系列有几种工作模式?各种工作模式之间的定义和区别?每种架构不同的特点和应用需求?

目录 1,问: 1,答: 2,问: 2,答: Cortex-A系列 Cortex-R系列 Cortex-M系列 3,问: 3,答: ARM Cortex-A架构 ARM Cortex-R架构…...

795. 前缀和(acwing)

文章目录 795.前缀和题目描述前缀和 795.前缀和 题目描述 输入一个长度为n的整数序列。 接下来再输入m个询问,每个询问输入一对l, r。 对于每个询问,输出原序列中从第l个数到第r个数的和。 输入格式 第一行包含两个整数n和m。 第二行包含n个整数&a…...

1910_野火FreeRTOS教程阅读笔记_prvStartFirstTask函数

1910_野火FreeRTOS教程阅读笔记_prvStartFirstTask函数 全部学习汇总: g_FreeRTOS: FreeRTOS学习笔记 这是教程中的一个函数,通过汇编来实现的。注释部分以及结合后面的讲解部分,可能还是有一点点细节的地方让初学者疑惑。我结合我自己的理解…...

图论练习5

Going Home Here 解题思路 模板 二分图最优匹配,前提是有完美匹配(即存在一一配对)左右集合分别有顶标,当时,为有效边,即选中初始对于左集合每个点,选择其连边中最优的,然后对于每…...

[C++] Volatile 和常量Const优化

Volatile的作用 volatile 表明某个变量的值可能在外部被改变&#xff0c;因此对这些变量的存取不能缓存到寄存器&#xff0c;每次使用时需要重新存取。 Const 和 Volatile的示例 示例1 int main() {const int a 1;int* pa const_cast<int*>(&a);*pa 4;cout &l…...

嵌入式学习day32 网络

htons()&#xff1b;//host to network short 将端口号转换为网络通信中的大端存储 eg:htons(50000); ntohs()&#xff1b;//host to network short 将大端存储转换为主机端口号 inet_addr();将IP地址转换为二进制 eg:inet_addr(192.168.1.170)&#xff1b; inet_ntoa()…...

算法D33 | 贪心算法3 | 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

1005.K次取反后最大化的数组和 本题简单一些&#xff0c;估计大家不用想着贪心 &#xff0c;用自己直觉也会有思路。 代码随想录 Python: class Solution:def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:nums.sort(keylambda x: abs(x), reverseT…...

html地铁跑酷

下面是一个简单的HTML代码来展示一个地铁跑酷游戏&#xff1a; <!DOCTYPE html> <html> <head><title>地铁跑酷</title><style>#player {position: absolute;top: 0;left: 0;width: 50px;height: 50px;background-color: red;}</style…...

利用GPT开发应用001:GPT基础知识及LLM发展

文章目录 一、惊艳的GPT二、大语言模型LLMs三、自然语言处理NLP四、大语言模型LLM发展 一、惊艳的GPT 想象一下&#xff0c;您可以与计算机的交流速度与与朋友交流一样快。那会是什么样子&#xff1f;您可以创建哪些应用程序&#xff1f;这正是OpenAI正在助力构建的世界&#x…...

Golang Ants 构建协程池

构建的协程池实现两个目标&#xff1a; 1、限制协程池里开启的协程数量 2、当任务数大于协程数时&#xff0c;一个协程可以同时处理多个任务 3、监控是哪个协程ID处理了具体的任务 package mainimport ("fmt""runtime""strconv""string…...

【金三银四】面试题汇总(持续编写中)

Java八股文面试题汇总&#xff08;持续编写中~&#xff09; Java基础集合JUCJVM 数据库MySQLRedis 框架篇SSMSpringBoot 数据结构与算法数据结构与算法--汇总篇27道基础算法题&#xff0c;学完让你对算法有豁然开朗的感觉&#xff08;推荐小白&#xff09; 消息中间件RabbitMQK…...

Hive的数据存储

Hive的数据存储在HDFS的&#xff1a;/user/hive/warehouse中 The /user folder in HDFS is a directory typically used to store user-specific data and configurations. It serves as the home directory for Hadoop users, analogous to the /home directory in Unix-like …...

ORACLE 如何使用dblink实现跨库访问

dbLink是简称&#xff0c;全称是databaselink。database link是定义一个数据库到另一个数据库的路径的对象&#xff0c;database link允许你查询远程表及执行远程程序。在任何分布式环境里&#xff0c;database都是必要的。另外要注意的是database link是单向的连接。在创建dat…...

Sentinel 面试题及答案整理,最新面试题

Sentinel的流量控制规则有哪些&#xff0c;各自的作用是什么&#xff1f; Sentinel的流量控制规则主要包括以下几种&#xff1a; 1、QPS&#xff08;每秒查询量&#xff09;限流&#xff1a; 限制资源每秒的请求次数&#xff0c;适用于控制高频访问。 2、线程数限流&#xf…...

Qt在windows编译hiredis依赖库

目录 0 前言1 Qt安装遇到的问题2 hiredis源码下载2.0 redis源码下载2.1 hiredis源码下载2.2 编译hiredis源码2.3 遇到的问题列表参考资料0 前言 当前参与的项目需要用Qt对redis进行操作,以前没玩过这块,顺手记下笔记梳理起来~ 1 Qt安装 安装版本下载:https://download.qt…...

【工作向】protobuf编译生成pb.cc和pb.py文件

序言 首先通过protoc --version查看protoc版本&#xff0c;避免pb文件生成方和使用方版本不一致 1. 生成pb.cc 生成命令 protoc -I${proto_file_dir} --cpp_out${pb_file_dir} *.proto参数&#xff1a; -I表示 proto 文件的路径&#xff1b; --cpp_out 表示输出路径&#xff…...

android 快速实现 垂直SeekBar(VerticalSeekBar)

1.话不多说上源码&#xff1a; package com.example.widget;import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.view.MotionEvent;/*** Class to create a vertical slider*/ public class VerticalSeekBar…...

算法刷题day23:双指针

目录 引言概念一、牛的学术圈I二、最长连续不重复序列三、数组元素的目标和四、判断子序列五、日志统计六、统计子矩阵 引言 关于这个双指针算法&#xff0c;主要是用来处理枚举子区间的事&#xff0c;时间复杂度从 O ( N 2 ) O(N^2) O(N2) 降为 O ( N ) O(N) O(N) &#xf…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...