Flutter 即将放弃 Html renderer ,你是否支持这个提议?

这篇具有很好参考价值的文章主要介绍了Flutter 即将放弃 Html renderer ,你是否支持这个提议?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在之前的《Flutter Web 的未来,Wasm Native 即将到来》 中我们知道,Flutter 通过推进 WasmGC 的落地来支持 Dart Native ,从而让 Flutter Web 在浏览器上实现原生的 Wasm Native 的支持, 这也是 Flutter Web 最终决定的技术路线,也就是 CanvasKit 才是Flutter Web 的未来 。

Flutter 即将放弃 Html renderer ,你是否支持这个提议?,Android开发,flutter,html,前端

因为将 Flutter Widget 转化为 Html 标签渲染的方式,其实本质上违背了 Flutter Engine 的跨平台方式。

在这个基础上,官方认为与基于 WebGL 的 CanvasKitSkwasm 渲染器相比,HTML 渲染器复杂、性能表现不佳且图形表现力有限等原因,同时 CanvasKit 渲染器又即将引来突破性的更新,而未来 Html renderer 能提供的价值远低于维护成本和开发人员面临的复杂性,毕竟在多个渲染器之间进行兼容和解决问题的成本太高,所以官方提议弃用并删除 Flutter Web 的 Html renderer。

在历史问题上,Html renderer 经常会出现渲染效果和其他平台不一致的问题,因为 HTML renderer 必须通过 HTML 的方式去模拟其他平台的某些功能,如渐变、文本布局、像素着色器等,而这些适配十分占用开发资源,并且效果也存在微妙的差异。

为什么要移除 Html renderer

事实上 Html renderer 是从 2018 年开始作为 Flutter Web 的第一个渲染器,HTML renderer 其实是 HTML、CSS、Canvas 2D、SVG 和 WebGL 的组合产品,在早期它也具备了一些优势:

  • Size 更小,加载更快,并且可以通过deferred-components 的方式进行懒加载拆包 。
  • PlatformView 的支持零成本,因为支持介入更多的 “HTML” 而已,在 HTML 中嵌套 HTML 很简单。
  • 支持 CORS 图像 ,因为是基于 <img> 标签实现,但是这对于 Flutter 而言有好有坏,因为 Flutter 没有处理图像的像素,所以和其他平台相比,无法控制帧和应用一些像素效果
  • HTML 可以更轻松访问本地字体,无需从网络获取字体,这对比 WebGL 是一个比较大的优势,目前从长远来看,W3C 提案例如[canvas-formatted-text](https://github.com/WICG/canvas-formatted-text) 理论可以彻底解决这个问题。

那既然有这么多优势,为什么还要移除?

前面提到过,由于 Flutter 一直以来都是以 Canvas 为基准通过 Engine 来实现跨平台,并且保证不同平台上的控件得到一致的渲染效果,而 Html renderer 的渲染方式明显违背了初衷,在兼容适配的过程中产生了许多额多的开发成本。

其次,将 HTML、CSS、Canvas 2D、SVG 和 WebGL 组合到单个渲染器中并不容易,对于 Flutter 本身的 API ,他丧失了很多原本应该具备的能力,比如:

  • Path.combine
  • drawAtlas, drawRawAtlas
  • dilate, erode, compose image filters
  • conic path segments
  • linearToSrgbGamma, srgbToLinearGamma color filters
  • saveLayer
  • FragmentProgram, FragmentShader
  • strokeMiterLimit
  • Paint.imageFilter
  • Scene.toImage, Scene.toImageSync
  • Image features that require access to pixel data

而有些功能虽然有实现,但它们的实现存在着性能缺陷,例如:

  • BlendMode
  • Gradient
  • drawVertices
  • drawPoints
  • drawPicture
  • Picture.toImage
  • MaskFilter.blur (throws in Safari)

由于 HTML renderer 无法支持 Flutter 的 API,这就会让 Framework 、 Plugin 和 App 需要在开发时兼容和维护一些特殊的代码如 kIsWeb 检查。

最后,Flutter 团队需要对 HTML 特定问题进行分类,它还使非 HTML 问题的分类变得更加复杂,因为处理问题的第一步经常需要区分是哪个渲染器受到影响。

当然,在此之前社区对于 HTML renderer 还存在一些误解,例如:

  • HTML 支持 Accessibility:事实上,Flutter 得 Semantic DOM 设计完全支持 Flutter 的辅助功能,对于全部渲染器 CanvasKit、Skwasm 和 HTML 都是一样可以适配支持无障碍能力。
  • 它提供 SEO:与 Accessibility 一样,渲染树不适合作为 SEO 的来源,因为它不以逻辑方式呈现内容,爬虫最多只能看到一些使用 HTML 或 SVG 绘制的文本片段,但最终出现在 2D 画布中的文本对于爬虫来说是不可见的,所以目前 Flutter 官方也正在研究使用语义树作为 SEO 数据的来源。

新的 CanvasKit

在此之前, CanvasKit 最饱受争议的就是它的大小和加载速度,最初引入 CanvasKit 时,Flutter 需要 3.2MB 的额外负载才能渲染第一帧,并且很多移动端设备并不支持 WebGL 2。

例如有人提到了,他们的网站是使用 CanvasKit 构建,而在跟踪用户流失情况是发现 33% 的潜在客户在加载应用是离开,这三个罪魁祸首似乎是 dart.main.js 1.6mbcanvaskit.wasm 1.5mb 以及启动 Engine 所需的时间:

Flutter 即将放弃 Html renderer ,你是否支持这个提议?,Android开发,flutter,html,前端

而现在在经过多次优化和时间沉淀后:

  • CanvasKit 的大小已经缩小到 1.5MB,新的渲染器 Skwasm 还可以其进一步缩小到 1MB 左右

  • WebGL 2.0 在每个主要浏览器中[至少支持3个版本](https://caniuse.com/?search=WebGL 2.0)

    Flutter 即将放弃 Html renderer ,你是否支持这个提议?,Android开发,flutter,html,前端

  • 新的 Web API 可提高基于 WebGL 的渲染效率,包括:

    • 支持 WebCodecs(特别是 ImageDecoder)
    • SharedArrayBuffer,启用共享内存多线程
    • WasmGC

预计在 10 mbps 网速下,启动开销为 0.8 秒,并且由于 CanvasKit 是可缓存资源,因此它可以在开始时与其他资源并行加载,实践使用中的开销可以小于 0.8 秒。

而在新的 CanvasKit 下,Flutter 正在推动进一步的优化支持,例如:

  • 可以在获取静态资源时支持并行加载,在获取 canvaskit.wasm 的同时同步获取数据 main.dart.js

  • Bootstrap API 支持在后台加载 Flutter 时为应用创建纯 HTML 登录页面,当用户完成与登陆页面的交互时,大部分 Flutter Web loading 已经完成

  • iOS 中的大部分缓慢都是由于缺乏 ImageDecoder API,因此目前还需要找到比当前单线程 wasm 编解码器解决方案更好的图像解码器。

当然,对于 CanvasKit 来说,目前还需要推进的问题还有:

  • CORS 图像
  • 更好的 PlatformView
  • iOS (即 Safari/WebKit)适配

而对于 CanvasKit 来说,无法解决的问题就是不支持没有 GPU 的硬件,因为对于 Flutter 来说,GPU 是至关重要的一环,特别未来对于 Impeller 的支持上。

最后

其实 Flutter web一直是 Flutter 里的另类而有特殊的存在,Flutter 来源于前端 Chrome 团队,起初 Flutter 的创始人和整个团队几乎都是来自 Web,但是由于前期技术局限的原因,为了适配 Web,Flutter Web 成了 Flutter 所有平台里“最另类又奇葩”的落地。

Flutter 即将放弃 Html renderer ,你是否支持这个提议?,Android开发,flutter,html,前端

而如今官方在明确了以 CanvasKit 和 Wasm Native 为核心路线的情况下看,Html Renderer 退出历史舞台是必然的趋势,而差别就在于它的过渡期需要多久?

目前看来 CanvasKit 还有诸多这样那样的不足,例如原生层面还不支持 SVG ,需要通过 flutter_svg 来做支持,对于 Web 来说其实支持 SVG 应该是一件“非常简单”的事情。

另外例如 CanvasKit 还有一些比较边缘的兼容问题,例如这个页面是采用 wasm 渲染的 Flutter Web 页面,但是当我们用插件翻译页面内容时,可以看到只有标题被翻译了,主体内容并没有,因为此时 Flutter Web 的主体内容都是 Canvas 绘制,没有 html 内容,所以无法被识别翻译,另外如果你保存或者打印网页,也是输出不了完整 body 内容。

Flutter 即将放弃 Html renderer ,你是否支持这个提议?,Android开发,flutter,html,前端

所以目前来看,CanvasKit 还是有许多需要打磨的地方,不过不可否认的是,它正在变得更好。

那么,你支持这次移除并启用 Html renderer 的提议吗

更多可见:https://github.com/flutter/flutter/issues/145954文章来源地址https://www.toymoban.com/news/detail-845383.html

到了这里,关于Flutter 即将放弃 Html renderer ,你是否支持这个提议?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AI创作系统ChatGPT网站源码,AI绘画,支持GPT联网提问/即将支持TSS语音对话功能

    SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型+国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧!

    2024年02月03日
    浏览(53)
  • sql server 修改表前 先判断是否有这个列

    在这个示例中: TABLE_NAME = \\\'Users\\\'  表示我们正在检查 Users 这张表。 COLUMN_NAME = \\\'userNum\\\'  表示我们在查找名为 userNum 的列。 ADD userNum INT;  是在确认该列不存在后实际执行的语句,它将向 Users 表中添加一个名为 userNum 的整数类型(integer)字段。

    2024年01月23日
    浏览(30)
  • 首个支持RWA交易的订单簿DEX-PoseiSwap,即将开启IEO

    随着 DeFi 世界的发展,越来越多的链上协议支持以合成资产的方式,将传统金融资产以加密资产的形式映射至链上,包括美股、黄金期货等等,虽然这种方式进一步帮助投资者,以非许可的形式丰富了投资标的,但这种方式缺乏合规性保障。与此同时,链上 DEX 基本都是以

    2024年02月08日
    浏览(46)
  • Flutter页面刷新失败?看看是不是这个原因

    我用flutter开发了一个页面,页面上有一些自己写的控件A,A控件里有一个button,我点击这个A控件里的button的时候,直接在onPressed里调用setState发现页面并没有刷新。 要实现控件A所在页面的整体刷新要怎么实现呢? 在Flutter中,要实现点击控件A中的按钮后刷新整个页面,你可

    2024年02月05日
    浏览(33)
  • Ubuntu24.04即将发布,支持Linux内核6.8。该版本会有哪些亮点?

    更多内容在 Canonical 计划 2024 年 4 月发布 Ubuntu 24.04 LTS 发行版,将获得长达 12 年的支持。Ubuntu 24.04 LTS,代号“Noble Numbat”,是Ubuntu发行版的最新长期支持(LTS)版本。12年的支持意味着你会得到  五年的维护+安全更新,然后作为Ubuntu Pro延长维护周期的一部分,再更新五年 。

    2024年04月12日
    浏览(45)
  • 小米平板6Max14即将发布:自研G1 电池管理芯片,支持33W反向快充

    明天晚上7点(8 月 14 日),雷军将进行年度演讲,重点探讨“成长”主题。与此同时,小米将推出一系列全新产品,其中包括备受瞩目的小米MIX Fold 3折叠屏手机和小米平板6 Max 14。近期,小米官方一直在积极预热新款平板电脑,为用户带来更多惊喜。 根据官方海报显示,小

    2024年02月12日
    浏览(43)
  • flutter报错Cannot hit test a render box that has never been laid out

    出现这个问题的原因可能是因为你把一个ListView或者GridView放到了一个没有设置大小的容器里面导致的,所以意思是不能渲染那一个没有布局过的容器。我这里遇到的错误是因为我把GridView放到了一个Container里面,并且我没有设置Container宽高。 就导致了那个错误: ======== Exce

    2024年01月19日
    浏览(32)
  • 检查一个Java List是否包含某个JavaBean对象的特定值,并且获取这个值

    在这个例子中,我们使用了Java 8的 Optional 类来处理可能不存在的结果。如果找到了匹配的Bean对象,我们可以使用 get() 方法获取它,并打印出其名称。如果没有找到匹配的Bean对象, isPresent() 方法将返回 false ,我们将打印出相应的消息。

    2024年01月24日
    浏览(38)
  • html中如何给input输入框这个一个默认值

    在HTML中,要给 input 输入框设置一个默认值,你可以使用 value 属性。下面是一个简单的例子,展示了如何为一个文本输入框设置一个默认值: 在这个例子中, input 元素的 type 属性设置为 text ,表示这是一个文本输入框。 value 属性被设置为 这是默认值 ,这意味着当页面加载

    2024年02月21日
    浏览(31)
  • Flutter PC桌面端 控制应用尺寸是否允许放大缩小

    桌面端中,登录、注册、找回密码页面不允许用户手动放大缩小,主页面允许 window_manager 使用教程请参照这篇博客:Flutter桌面端开发——window_manager插件的使用 题外话: 之前使用的是 bitsdojo_window 插件,使用方法请参照博客 bitsdojo_window 这个插件中,如果想要用户不允许操作

    2023年04月20日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包