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

Flutter For Web实践

1 什么是Flutter

Flutter是Google开源的一套UI工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动APP、web、桌面和嵌入式平台。Flutter和其他的跨平台解决方案的实现方式上有比较大的差异。

我们以React Native(下文简称RN)跨平台解决方案为例。在RN中,开发者使用JavaScript(JS)语言来开发,中间会有一层桥接层(Bridge),桥接层的主要作用就是提供一套完整的接口,使得JS代码可以直接使用移动端提供的UI组件和相关的API方法,并通过将这些组件进行组合,来最终实现整个页面的展示。

在这里插入图片描述
Flutter却没有使用移动端平台提供各种UI组件,而是将UI组件的具体实现上移到Flutter的Framework层中,然后调用平台提供的底层绘制引擎来直接绘制在Framework中生成的各种UI组件。这样可以在最大程度上保证同一套代码在不同平台、不同设备的UI展示和用户体验的一致性。不过除了UI绘制以外,Flutter在其他原生能力的桥接上面与其他的跨平台方案基本类似。

在这里插入图片描述
在Flutter的整个解决方案中,Flutter For Web和Flutter For Mobile的实现方式又有些不同。因为Flutter For Web是需要最终嵌入到浏览器中进行绘制和展示的。因此它的很多能力依赖于浏览器对外提供的接口和能力。但是和iOS、Android不同,浏览器并没有提供一套广泛使用、完备、高效的绘制接口,这就使得Flutter For Web和Flutter For Mobile在架构上还是有比较大的差别的。

2 Flutter For Web

Flutter For Web的目的就是想要在 单代码库 的情况下,使Flutter拥有Web支持的能力。这样使用Flutter开发的应用不但能部署到iOS、Android手机上,还可以部署到任意的Web服务器上、嵌入到浏览器中,而不需要特殊浏览器插件的支持。

Flutter For Web和Flutter For Mobile的上层实现基本类似,但是在下层的实现有很大的差别。Flutter For Mobile中的绘制是使用了Engine中的Dart、Skia和Text,然后再调用iOS和Android提供的底层绘制能力来实现的。
在这里插入图片描述
对于浏览器环境,没有提供一套完备的绘制接口,因此在绘制过程中,会使用Cavans、Dom或者两者混合的方式来进行绘制。
在这里插入图片描述
在Flutter For Web的实际的开发和绘制流程中,首先开发者使用Dart语言进行开发,开发完毕在编译的过程中会通过dart2js的库,将dart实现的代码转换成对应的js代码。在js代码中,会将一些简单的可以通过HTML和CSS来实现的UI组件通过HTML和CSS来进行绘制,而一些复杂的UI组件则会使用Canvas来直接进行绘制,然后通过生成Dom树,最终在浏览器中进行渲染。
在这里插入图片描述
但是由于很多复杂的组件在dart2js的转换过程中难以使用HTML+CSS进行绘制,因此会导致很多组件最终是直接通过Canvas绘制的,同时这也会导致使用Dart开发的Web应用在效率上会存在一些问题。这也是Flutter For Web现存的一个问题,官方也一直在优化和寻找解决方案过程中。

3 代码结构

对于增加了对Flutter For Web支持的Flutter应用,在代码目录中增加了一个Web文件夹,其中index.html 文件是整个Web应用的入口。其中引用了一个JS文件是main.dart.js,但在工程目录中找不到该文件。其实这个文件是Flutter工程编译后生成的js文件,如果曾编译成功过这个工程,会在编译后的build文件夹中看到该js文件。

和普通的Flutter应用一样,主要的功能实现还是在工程中的lib文件夹中。但是如果需要有资源文件、js 文件等 web 所需资源,可以放到Web这个文件夹中。

4 编译后的产物

Flutter For Web应用编译后的产物位于build文件夹下的web目录中。其中assets和icon文件夹中是Web应用的资源文件。index.html文件,是整个Web应用的入口,而main.dart.js是dart代码编译后产生的js文件。

其中main.dart.js文件的大小是2.6M,对于一个功能不是特别复杂的web应用来说是很大的一个JS文件了。因此首次加载的时候,可能会需要很长的时间,这也是官方需要进一步优化的地方。

5 Flutter For Web开发遇到的问题

1.有部分库在Flutter web中不支持。

例如:dart.io无法在web中使用,dart.io支持非web应用程序的文件、套接字、HTTP和其他I/O操作。

2.有部分库只能Flutter web中使用。

例如:dart:html是关于html相关操作的库,如document、ua、cookie等。

又如:dart:js是dart和JS进行交互的库,可以给js方法传参,甚至还可以将js的参数带回等待。

因此这就会给我们通过一套代码来实现多平台的兼容,带来了不少的挑战。

6 与移动客户端开发的区别

虽然使用Flutter进行web开发和进行移动端开发在绝大多数情况下没什么区别,但是两者在开发中还是有不少需要注意的地方。

现在支持Flutter web的第三方库相对较少,绝大多数的库还是暂时只支持移动端开发。

Flutter web中的Cookie管理实际上是由浏览器来管理的,因此无法像客户端开发一样,自由设置cookie。

跨域访问的问题:一个web页面通过JavaScript发起的ajax请求,URL的域名必须和当前页面完全一致,这能有效的阻止跨站攻击。

7 性能

Flutter For Web 目前都是单页面应用。最简单的web应用编译后main.dart.js 的大小也会轻松过 1M,这可能会导致首次加载很慢。其次,因为页面中的很多组件其实是使用 canvas 直接绘制的,和通过HTML+CSS的web应用相比绘制的速度也会变慢,从而导致性能问题。PC 端首次加载的速度略慢,而手机端会有超过 2S 的延迟。复杂列表滑动的时候帧率也只有十几帧/秒,所以此处还有待官方后面对性能进行优化。

8 总结

优点

  • (1)一个代码库可以同时支持手机端和Web端;

  • (2)自适应的布局;

  • (3)支持PWA;

  • (4)绝大多数的官方组件支持Web;

-(5)降低人力成本、提高开发效率。

缺点

  • (1)性能问题,虽然在不断优化;

  • (2)对SEO并不友好;

  • (3)社区比较小,开发者较少;

  • (4)SDK体积大、加载时间长;

  • (5)调试比较困难。

相关文章:

Flutter For Web实践

1 什么是Flutter Flutter是Google开源的一套UI工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动APP、web、桌面和嵌入式平台。Flutter和其他的跨平台解决方案的实现方式上有比较大的差异。 我们以React Native(下文简称RN&…...

【神级Python代码】作为技术xiao白如何制作一款超炫酷的黑客主题代码雨?牛逼就完了。(源码分享学习)

前言 哈喽,我是木子,今天给大家制作一款超级炫酷的代码啦。 提到《黑K帝国》,字符雨可谓是让人印象深刻。 所有文章完整的素材源码都在👇👇 粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。 ​…...

供应链挑战迎刃而解!桑迪亚国家实验室使出“量子杀手锏”

桑迪亚国家实验室的科学家Alicia Magann(右),Kenneth Rudinger(左上),Mohan Sarovar(左下)和Matthew Grace(未附图)开发了基于反馈的量子优化算法&#xff08…...

java程序设计-ssm博客管理系统

博客管理系统是一个用于创建、管理和发布博客文章的应用程序。它通常包括一个后台管理界面,用于管理用户、文章、评论、标签等数据。同时,它还包括一个前端界面,用于展示博客文章并提供交互功能,例如评论和分享。 博客管理系统可…...

从0到1一步一步玩转openEuler--17 openEuler DNF(YUM)检查更新

文章目录17.1 检查更新17.2 升级17.3 更新所有的包和它们的依赖DNF是一款Linux软件包管理工具,用于管理RPM软件包。DNF可以查询软件包信息,从指定软件库获取软件包,自动处理依赖关系以安装或卸载软件包,以及更新系统到最新可用版本…...

SpringBoot-自动配置-@Import注解与@EnableAutoConfiguration注解

Import注解 Enable* 底层依赖于 Import 注解导入一些类,使用 Import 导入的类会被 Spring 加载到 IOC 容器中Import 提供了4种用法: 1.导入Bean2.导入配置类3.导入ImportSelector实现类;一般用于加载配置文件中的类4.导入ImportBeanDefinitio…...

【笔记】C#一维数组、多维数组和交错数组的区别总结

文章目录前言数组的概念1,一维数组:2,多维数组:3,交错数组:区别总结结语前言 😄大家好,我是writer桑, 这是自己整理的 C# 数组笔记,方便自己学习的同时分享出…...

【SpringBoot】分布式日志跟踪—通过MDC实现全链路调用日志跟踪

一.MDC 1.MDC介绍 MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程场景下记录日志的功能。MDC 可以看成是一个与当前线程绑定的Map,可以往其中添加键值对。MDC 中包含的内容可以被同…...

【设计模式】创建型模式

简单工厂模式 系列综述: xxxxxxxxx 文章目录对象创建型模式简单(静态)工厂模式工厂方法模式参考博客😊点此到文末惊喜↩︎ 对象创建型模式 简单(静态)工厂模式 抽象原理 抽象产品基类 :定义了…...

Spark Catalyst 查询优化器原理

这里我们讲解一下SparkSQL的优化器系统Catalyst,Catalyst本质就是一个SQL查询的优化器,而且和 大多数当前的大数据SQL处理引擎设计基本相同(Impala、Presto、Hive(Calcite)等)。了解Catalyst的SQL优化流程&…...

贝叶斯分析法在市场调研中的应用

一、市场调研的需求场景 在营销活动的用研调研时,我们经常会去问用户在不同平台的品类付费情况,以对比大促期间本品和竞品分别在哪些品类上具有市场优势,他们之间的差距具体在哪里、差距有多大。假如根据调研问卷结果,我们知道拼多多用户有30%的人在大促购买生鲜类,而淘宝…...

JavaEE——MyBatis将查询结果集封装进POJO实体类

简单介绍 在之前的我们比较详细的介绍过MyBatis的配置信息的时候,在SQL映射文件中说过我们可以直接将结果集映射到我们的POJO实体类中,省去了我们自己处理查询结果集的时间和代码,接下来我们就来演示将单条数据和多条数据映射到我们POJO实体…...

C++11 包装器function

文章首发公众号:iDoitnow C提供了多个包装器,它们主要是为了给其他编程接口提供更一致或更合适的接口。C11提供了多个包装器,这里我们重点了解一下包装器function。 对于function, C 参考手册给出的定义为: 类模板 std::function…...

XCP实战系列介绍14-基于Vector_Davinci工具的XCP配置介绍(三)

本文框架 1.概述2. 其他模块配置2.1 XCP初始化3. 手工代码部分3.1 周期函数添加3.2 DAQ Event调用3.3 XCP模块本身代码3.4 标定量的添加1.概述 在对XCP的配置部分介绍中我们计划分别对通讯部分配置、XCP模块本身配置及其他相关模块配置三篇进行介绍,在前两篇我们介绍了XCP配置…...

计算机图形学:中点BH算法对任意斜率的直线扫描转换方法

作者:非妃是公主 专栏:《计算机图形学》 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、问题提出二、…...

(十一)、用户中心页面【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

1,个人中心页面 1.1 新建个人中心页面 1.2 纯净版个人中心页面代码&#xff1a; <template><view class"user"><view class"top"><view class"group"><view class"userinfo"><!-- 顶部 左侧 头像 …...

LA@复数和复矩阵@实对称阵相关定理

文章目录复数&#x1f388;复矩阵和复向量共轭矩阵性质定理实对称阵的相关定理复数&#x1f388; 复数 (数学) (wikipedia.org) 加法&#xff1a;(abi)(cdi)(ac)(bd)i)减法&#xff1a;(abi)−(cdi)(a−c)(b−d)i)乘法&#xff1a;(abi)(cdi)acbciadibdi2(ac−bd)(bcad)i除法&…...

cmd set命令笔记

使用 set是cmd最基础的命令&#xff0c;每个人都会用&#xff0c;但其实它还是有些知识的。 set 用来接收入参 set /p var请选择&#xff08;1或2或3&#xff09;: echo %var%可以接收输入的参数。 set /p var请选择&#xff08;1或2或3&#xff09;: echo %var% 语法 he…...

IB学校获得IBO授权究竟有多难?

IB 学校认证之路&#xff0c;道阻且长 The road to IB school accreditation is long and difficult一所学校能获得IB授权必须经过IBO非常严格的审核&#xff0c;在办学使命&教育理念、组织架构、师资力量&授课技能、学校硬件设施和课程体系上完全符合标准才可获得授权…...

火山引擎 DataTester:A/B 测试,让企业摆脱广告投放“乱烧钱”

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 在广告投放的场景下&#xff0c;一线广告优化师通常会创建多个计划&#xff0c;去测试不同的广告素材效果。这套方法看似科学&#xff0c;实际上却存在诸多问题&…...

5大优化技巧:让ComfyUI-Manager在低配置设备上流畅运行

5大优化技巧&#xff1a;让ComfyUI-Manager在低配置设备上流畅运行 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various cust…...

Agentfiles:统一管理AI编码助手技能文件的Obsidian插件

1. 项目概述&#xff1a;一个为AI编码助手打造的“技能管理中心” 如果你和我一样&#xff0c;同时在使用Claude Code、Cursor、Windsurf这些新一代的AI编码助手&#xff0c;那你一定也面临过同样的困扰&#xff1a;每个工具都有自己的一套“技能”&#xff08;Skills&#xf…...

别再只盯着原理图了!用Python+OpenCV动手模拟激光三角测距(斜射/直射对比)

用PythonOpenCV模拟激光三角测距&#xff1a;斜射与直射的实战对比 激光三角测距技术听起来高大上&#xff0c;但真正理解它的精髓往往需要跳出公式推导的泥潭。作为一名长期在工业检测领域摸爬滚打的技术人员&#xff0c;我发现用代码模拟物理过程是最有效的学习方式。本文将…...

别再手动算归一化了!用Origin9.1的‘列公式’功能一键搞定数据预处理

用Origin9.1列公式功能高效实现数据归一化&#xff1a;从原理到实战 科研数据处理中&#xff0c;归一化是消除量纲影响、提升分析结果可比性的关键步骤。传统手动计算不仅耗时费力&#xff0c;还容易因公式输入错误导致结果偏差。Origin9.1的"列公式"功能&#xff08…...

知网AI率80%降到15%教程,比话降AI知网算法专精+售后保障!

知网AI率80%降到15%教程&#xff0c;比话降AI知网算法专精售后保障&#xff01; 如果你是硕博毕业生、学校送知网检测、答辩前查出 AI 率 80%——这篇文章直接给你完整操作教程。从「拿到 80% 报告」到「学校送审通过」的完整路径&#xff0c;每一步该做什么、花多少时间、花多…...

别再乱用STOP模式了!STM32L4三种STOP模式深度对比与选型实战

STM32L4低功耗设计实战&#xff1a;STOP模式选型与能效优化全解析 在物联网终端设备与便携式仪器开发中&#xff0c;每微安电流的节省都直接关系到产品的市场竞争力。最近为一个农业传感器项目做方案评审时&#xff0c;发现团队在STOP模式选择上存在严重误区——工程师们习惯性…...

5分钟掌握暗黑破坏神2存档编辑:免费Web工具完整指南

5分钟掌握暗黑破坏神2存档编辑&#xff1a;免费Web工具完整指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 还在为暗黑破坏神2中反复刷装备而烦恼吗&#xff1f;想快速体验不同职业的build却不想从头练级&#xff1f;d2s-ed…...

射频衰减系统设计:PIN二极管与电流源DAC应用

1. 射频衰减系统设计基础在无线通信系统中&#xff0c;精确控制信号强度是确保系统性能的关键要素。射频衰减器作为信号链中的"音量旋钮"&#xff0c;其性能直接影响接收机动态范围、发射机功率控制精度等核心指标。传统机械式衰减器虽然精度高&#xff0c;但体积大、…...

解码Voron 2.4:开源高速CoreXY 3D打印机的架构哲学与工程实践

解码Voron 2.4&#xff1a;开源高速CoreXY 3D打印机的架构哲学与工程实践 【免费下载链接】Voron-2 Voron 2 CoreXY 3D Printer design 项目地址: https://gitcode.com/gh_mirrors/vo/Voron-2 Voron 2.4作为开源3D打印机领域的标杆产品&#xff0c;代表了CoreXY架构在高…...

从ANSI到EBCDIC:跨越地域与时代的字符编码全景解析

1. 字符编码的前世今生&#xff1a;从ASCII到EBCDIC 第一次在Windows记事本里保存文件时&#xff0c;看到"ANSI"这个选项我就懵了——这玩意儿和ASCII有什么关系&#xff1f;后来在跨国项目里处理日文数据时&#xff0c;更被SJIS和EUC-JP搞得焦头烂额。字符编码就像…...