Flutter III 之你不知道的 PlatformView 的混乱之治

news2024/11/25 15:19:12

如果你是从 2018 年开始使用 Flutter ,那么相信你对于 Flutter 在混合开发的支持历程应该会有一个深刻的体会,如果你没尽力过这个时期,不要担心,通过我过往 PlatformView 的相关文章,你也可以有一个清晰的感受:

  • Flutter 3.0下的混合开发演进

  • 告别 VirtualDisplay ,拥抱 TextureLayer

  • Flutter 深入探索混合开发的技术演进

  • HybridComposition 和 VirtualDisplay 的实现与未来演进

  • Hybrid Composition 深度解析

  • Android PlatformView 和键盘问题

总而言之,目前 Flutter 对于 PlatformView 的支持,特别是在 Android 平台上,只能用一个字来形容:「乱」。

这个「乱」不只是体现在 API 和底层实现方案上,更表现在你遇到 issue 时,不确定到底是因为什么引起的困惑上,因为目前 Flutter 在 Android 平台的 PlatformView 会根据不同的 SDK 版本和场景进行「兜底」兼容,存在各种历史包袱。

其实我已经不是很想写这方面的内容了,但是奈何总有人问,那么本篇就来个总结式科普。

目前活跃在 Android 平台的 PlatformView 支持主要有以下三种:

  • Virtual Display (VD)
  • Hybrid Composition (HC)
  • Texture Layer Hybrid Composition (TLHC)

可以看到官方都已经为大家定义好了简称 VD、HC、TLHC ,有了简称也方便大家提 issue 时沟通,毕竟每次在讨论时都用全称很费劲:

因为你需要不停指出你用的是什么模式,然后在什么模式下正常or不正常,另外知道这些简称最大的作用就是看 issue 时不迷糊

那么,接下来主要简单介绍它们的区别:

VD

VD简单来说就是使用 VirtualDisplay 渲染原生控件到内存,然后利用 id 在 Flutter 界面上占用一个相应大小的位置,最后通过 id 关联到 Flutter Texture 里进行渲染。

问题也很明显,因为控件不会真实存在渲染的位置,所以此时的点击和对原生控件的操作,其实都是需要由 Flutter 这个 View 进行二次转发,另外因为控件是渲染在内存里,所以和键盘交互需要通过二级代理处理,这就产生了各种键盘输入的异常问题。

键盘问题突出在不同版本的 Android 兼容上。

HC

1.2 版本开始支持 HC,简单说就是直接把原生控件覆盖在 Flutter 上进行堆叠,如果出现 Flutter Widget 需要渲染在 Native Widget 上,就采用新的 FlutterImageView 来承载新图层。

好处是原生视图是直接显示渲染,坏处就是在 Android 10 之前存在 GPU->CPU->GPU的性能损耗。

另外因为此时原生控件是直接渲染,所以需要在原生的平台线程上执行,这和 Flutter 的 UI 线程就存在线程同步问题,所以在此之前一些场景下会有画面闪烁 bug 。

TLHC

3.0 版本开始支持 TLHC 模式,最初的目的是取代上面这两种模式,奈何最终只能共存下来,该模式下控件虽然在还是布局在该有的位置上,但是其实是通过一个 FrameLayout 代理 onDraw 然后替换掉 child 原生控件的 Canvas 来实现混合绘制。

所以看到此时上图 TextView 里没有了内容,因为 TextView 里的 Canvas 被替换成 Flutter 在内存里创建的 Canvas

但是这种实现天然不支持 SurfaceView ,因为 SurfaceView 是双缓冲机制,所以通过 parent 替换 Canvas 的实现并不支持。

总结

上述就是这目前三种模式的简单描述和对比,如果看不明白,可以通过前面的历史文章进行了解,总结下以下它们的主要问题:

  • VD : 控件不是被真实渲染,容易有触摸和键盘等问题
  • HC: 直接堆叠控件,会有性能开销和线程同步问题,某些场景容易出现闪烁和卡顿
  • TLHC:不支持 SurfaceView ,对于使用 SurfaceView 的播放器、地图等插件会有兼容性问题。

所以这也是为什么 1.2 HC 出来之后,VD 还在继续被投入使用,以至于 TLHC 发布之后,依然没能完全取代 VD 和 HC 的主要原因,因为目前它们都不是最优解。

而从目前的情况下,PlatformView 也成了 Android 平台的沉重包袱,因为多种底层模式在同时工作,并且还在互相「兼容」。

API

那么回归到 API 上,在目前 3.0+ 的 Flutter 上同样对应有三个 API ,但是这三个 API 并不是直接对应上述三种模式:

  • initAndroidView :默认情况下会使用 TLHC 模式,当 SDK 低于 23 或者存在 SurfaceView 的时候,会使用 VD 模式兼容
  • initSurfaceAndroidView : 默认情况下会使用 TLHC 模式,当 SDK 低于 23 或者存在 SurfaceView 的时候,会使用 HC 模式兼容
  • initExpensiveAndroidView: 强行完全使用 HC 模式

看到没有,这里有一个问题就是:你其实没办法主动控制是 TLHC 还是 VD ,对于 HC 你倒是可以强行指定

另外,不知道你注意到没有,不管是 initAndroidView 还是 initSurfaceAndroidView ,它们都可能会在升级到新版本时使用 TLHC 模式,也就是如果你的 Plugin 没有针对性做更新,那么可能会在不知觉的情况下换了模式,从而有可能出现 bug

例如 TLHC 模式:

  • 对于 SurfaceView 的不支持存在一些特殊情况,假设一开始 PlatformView 创建时不存在 SurfaceView ,但是后续又添加了 SurfaceView ,那么该模式将无法正常工作 #109690。
  • 对于 TextureView 场景,有时候会出现不正常更新的异常情况#103686 。

现在你看出 PlatformView 的混乱了吧?从底层实现的不统一,到 API 再不同版本下不同的行为变化,这就是目前 Android 在 PlatformView 支持下的混乱生态,同时如果你对于目前 PlatformView 存在的问题刚兴趣,可以查阅以下相关 issue:

  • #103686
  • #109690
  • #112712
  • #130692

所以,目前的 Android PlatformView 就给我一种既视感,好比魔兽世界里的平行分支:

  • 地狱咆哮喝下了恶魔之血,绿皮吼爷打爆深渊领主玛诺洛斯
  • 地狱咆哮拒绝喝恶魔之血,橙皮吼爷打爆深渊领主玛诺洛斯

虽然都是打爆了玛诺洛斯,虽然吼爷结局都一样扑街,但是中间的剧情走向还是有着极大的分歧,所以只能寄希望未来的世界线可以正常「收束」,能有一位「伯瓦尔」来结束这个混乱之治的时代。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/774536.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python 乘法口诀

下面是一个用Python打印乘法口诀表的代码: print("乘法口诀表:")for i in range(1, 10):for j in range(1, i1):print(f"{j} {i} {i*j}", end"\t")print()

AI绘画创意文字全流程揭秘,你的终极文字艺术实操宝典

本教程收集于:AIGC从入门到精通教程汇总 AIGC技术不断更新迭代,国内出现了越来越多的新玩法,比如最近大家都在热议的AI绘画创意文字。 过去的一周,我把这些新玩法都研究了一遍,并总结了一套完整的制作流程。 主流的…

马斯克重返人工智能赛道,官宣成立xAI

KlipC报道:马斯克宣布成立xAI人工智能公司。 KlipC的合伙人Andi Duan表示:“马斯克称xAI公司的目标是了解宇宙的真实本质,同时也向ChatGPT等热门人工智能应用发起挑战。 Duan先生指出自OpenAI去年年底推出ChatGPT以来,马斯克就在A…

全网首发!精选32个最新Python实战项目(附源码),拿走就用!

Python是目前最好的编程语言之一。由于其可读性和对初学者的友好性,已被广泛使用。那么要想学会并掌握Python,可以实战的练习项目是必不可少的。接下来,我将给大家介绍32个非常实用的Python项目,帮助大家更好的学习Python。大家也…

C/C++ 辗转相除与更相减损求最大公约数公倍数

古人有两种求最大公约数的方法 最小公倍数 (a * b) / 最大公约数 1.辗转相除(欧几里得-《几何原本》) 我认为辗转相除的的稳定性要强过更相减损,因为减法在数差距较大时效率会较低。 辗转相除注意考虑0的问题&#x…

AIGC全新升级!Share Creators现已提供更加强大的AIGC功能及体验!

AIGC全称AI Generated Content,即人工智能生产的内容,被认为是继PGC、UGC之后的新型内容创作方式。在技术上,AIGC能够以优于人类的制造能力和知识水平承担信息挖掘、素材调用、复刻编辑等基础性机械劳动,从技术层面实现以低边际成本、高效率的方式满足海…

科技云报道:成立11年,青云的变与不变

科技云报道原创。 成立于2012年的青云科技,迎来了自己的11周年。 对于高速发展的云计算行业来说,“十年”这一节点更是承载了太多的命题。 过去11年,青云在云计算巨头和IT大厂的环伺之下一路拼杀,终以“混合云第一股”的身份登上…

Rancher 系列文章-RHEL7.8 离线有代理条件下安装单节点 Rancher

一 基础信息 1.1 前提 本次安装的为 20220129 最新版:Rancher v2.6.3VM 版本为 RHEL 7.8, 7.9 或 8.2, 8.3, 8.4(Rancher 官网要求)VM YUM 仓库:已配置对应版本的 RHEL 和 EPEL YUM 仓库VM 提供 root 权限已配置 ntp(防止因为时…

Microsoft Edge 浏览器的怎么传文件

可以替代微信的文件传输助手,不再需要每次传输文件时登录微信,在手机和电脑上点击”Drop”即可。

如何备份与恢复MySQL数据库数据

目录 一、MySQL备份 备份方式 完全备份 差异备份 增量备份 二、常见的备份方法 物理冷备 专用备份工具 mysqldump 或 mysqlhotcopy 启用二进制日志进行增量备份 第三方工具备份 三、MySQL完全备份 四、数据库完全备份分类 物理冷备份与恢复 mysqldump备份与恢复 …

海外应用商店的ASO优化表现跟踪

花更少的时间整合App Store数据,花更多的时间去解锁有助于我们实现高下载量的目标。了解我们应用商店表现的真实水平,以便我们可以自信地完善和调整应用营销策略。 全面跟踪所有重要的应用指标,踪各个国家/地区的展示次数、商店浏览量、安装…

小程序web-view本地测试:redirect_uri参数错误

要检查这些地方, 1: 2: 3:这里要加http、https this.testURL https://open.weixin.qq.com/connect/oauth2/authorize?appidwx54d162c2a94191f1&redirect_uri${encodeURIComponent(http://xxxxx)}&response_typecode&a…

Slim-neck by GSConv 论文学习

1. 解决了什么问题? 目标检测是计算机视觉中一个重要任务。在边缘设备上,大模型很难取得实时的效果。而使用大量深度可分离卷积的模型则很难取得高准确率。如下图,深度可分离卷积的缺点就是:输入图像的通道信息在计算时被分隔开了…

RocketMQ 5.0本地源码启动3Nameserve+2broker集群

这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党 背景 由于RocketMQ 5.x主从同步的方式改动非常大,集群部署的方式也改动很大,所以打算本地启动一个小集群,进行debug研究源码学…

PCB反复评审难题,终极解决办法有了?

随着电子产品的高速发展,PCB生产中大量使用BGA、QFP、PGA和CSP等高集成度器件,PCB的复杂程度也大大增加,随之而来的PCB的设计和制造难、测试困难、焊接不良、器件不匹配和维修困难等生产问题,导致整个产品工期延误,产品…

整合 JXLS模版导出excel表格

1、引入 包 - <!--easypoi --> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-spring-boot-starter</artifactId> <version>3.3.0</version> <…

Day57|647. 回文子串 、516.最长回文子序列

647. 回文子串 1.题目&#xff1a; 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&#xff0c;即使是…

学生宿舍智能电表限电原理

学生宿舍智能电表限电石家庄光大远通电气有限公司生产销售系列学生公寓智能管理模块、学生公寓智能控电水电联控系统及相关公寓安全用电产品&#xff0c;产品销往全国各地&#xff0c;广泛应用于各种学校公寓物业及商业地产公司&#xff0c;为企事业单位物业管理提供便捷的水电…

性能优化:如何彻底解决SharedPreferences造成的卡顿

背景 在上线 ANR 监控平台后&#xff0c;线上收集到了较多的ANR日志 &#xff0c;从火焰图信息上看&#xff0c;函数阻塞在了QueuedWork 相关函数上 &#xff0c;本文主要介绍的这一现象的原因以及如何解决这一问题。 本文介绍的解决方案&#xff0c;已放到github 上https://g…

[Android] Android Studio 找不到一些包,编辑器显示红色

起因 此前写了一个项目里面用了 org.apache.commons.cli 这个库&#xff0c;在本地一段时间&#xff0c;因为其他业务影响就没有编写。今天突发奇想加点东西&#xff0c;发现—— 原本完好的项目&#xff0c;通过Android studio打开之后&#xff0c;org.apache.commons引入…