Flutter For Web实践

news2024/11/18 3:49:41

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)调试比较困难。

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

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

相关文章

kubernetes教程 --组件详细介绍

组件详细介绍 NameSpace 在 Kubernetes 中,名字空间(Namespace) 提供一种机制,将同一集群中的资源划分为相互隔离的组。 同一名字空间内的资源名称要唯一,但跨名字空间时没有这个要求。 名字空间作用域仅针对带有名字…

STM32单片机初学8-SPI flash(W25Q128)数据读写

当使用单片机进行项目开发,涉及大量数据需要储存时(例如使用了屏幕作为显示设备,常常需要存储图片、动画等数据),单靠单片机内部的Flash往往是不够用的。 如STM32F103系列,内部Flash最多只能达到512KByte&a…

git安装与学习1(CSDN_0010_202201014)

目录 1. Git下载 2. git安装 3. 生成并添加SSH公钥 3.1 生成公钥 3.2 添加公钥 4. 代码备份 4.1 创建远程仓库 4.2 创建本地仓库 1. Git下载 Git下载官网:Githttps://git-scm.com/ 详细的下载教程见: https://blog.csdn.net/weixin_47638941/ar…

CHAPTER 5 自动发现、自动注册、分布式监控、SNMP监控

自动发现与自动注册5.1 自动发现与自动注册5.1.1 简介5.1.2 两种模式5.2 自动发现--被动模式5.3 自动注册--主动模式5.4 分布式监控5.4.1 介绍5.4.2 配置zabbix proxy5.5 SNMP监控5.5.1 使用范围5.5.2 安装snmp程序5.5.3 配置snmp程序5.5.4 测试snmp5.5.5 在web界面进行配置5.1…

LeetCode 203. 移除链表元素

原题链接 难度:easy\color{Green}{easy}easy 题目描述 给你一个链表的头节点 headheadhead 和一个整数 valvalval ,请你删除链表中所有满足 Node.valvalNode.val valNode.valval 的节点,并返回 新的头节点 。 示例 1: 输入&a…

如何利用Power Virtual Agents机器人获取OneNote教学资源

今天我们继续来介绍如何利用PVA聊天机器人来获取OneNote教学资源。设计思路是在PVA聊天机器人的对话框中输入触发短语后,PVA聊天机器人会将指定的OneNote教学资源发送到学生的电子邮箱中。 首先,在PVA聊天机器人中创建主题。 创建一个“问题”后&#x…

【Spring AOP】Spring AOP快速使用

文章目录前言1、相关注解类注解方法注解2、execution 表达式例一【execution 表达式 的限制使用】例二【execution 表达式 的通配使用】3、相关pom依赖4、案例创建接口Aop使用 方式一【Before 、After 、AfterRuturning、AfterThrowing版】Aop使用 方式二【Around版】前言 Aop…

【笔记】通过labview调用halcon

使用原因:手眼标定使用halcon的九点标定,但是整体系统是用labview的,机器人得到二维坐标后,需经过halcon算子计算得到机器人坐标系下坐标,在进行运动。 下载路径: 链接:https://pan.baidu.com/s…

「计算机组成原理」数据的表示和运算(上)

文章目录一、进位计数制1.1 其他进制转十进制1.2 十进制转其他进制1.3 二进制、八进制和十六进制1.3 真值和机器数二、BCD码2.1 8421码2.2 余3码2.3 2421码三、整数的表示和运算3.1 无符号整数3.1.1 无符号整数的表示3.1.2 无符号整数的运算3.2 有符号整数3.2.1 有符号整数的表…

聚观早报 | 微信也要下场做“外卖”?;《羊了个羊》营收破亿

今日要闻:微信也要下场做“外卖”?;《羊了个羊》营收破亿;苹果将新XR头显上市推迟至6月;“交个朋友”被爆欠薪暴力裁员?;微软解释ChatGPT Bing AI推出速度缓慢的原因微信也要下场做“外卖”?腾讯…

C语言返回类型为指针的一些经典题目(上)

大家好,今天和大家分享一下C语言返回类型为指针的一些重要题目,看完你会恍然大悟。原来我对指针的了解还停留在指针只是一个地址的位置上,看完后你会对指针的用法进一步得到提升。目录一.关于指针类型的基础概念二.题目剖析一.关于指针类型的…

Java反序列化漏洞——CommonsCollections6链分析

一、前因因为在jdk8u71之后的版本中,sun.reflect.annotation.AnnotationInvocationHandler#readObject的逻辑发生了变化,导致CC1中的两个链条都不能使用,所有我们需要找一个在高版本中也可用的链条。/* Gadget chain: java.io.ObjectInputStr…

35岁危机

人们对社会的期望是不断变更的,无论拥有高技能的人还是普通的白领,这种期望都让人们不断地励磁进步,以期实现自己的理想。但是,当人们达到35岁时,多数人就会陷入一种状态,这被称之为“35岁危机”。 在35岁…

时间轮和时间堆管理定时器

高性能定时器 时间轮 由于排序链表定时器容器有这样一个问题:添加定时器的效率偏低。而即将介绍的时间轮则解决了这个问题。一种简单的时间轮如下所示。 如图所示的时间轮内,指针指向轮子上的一个slot(槽), 它以恒定…

Linux操作系统-线程互斥,线程同步,生产者消费者模型

线程互斥线程互斥及相关概念线程互斥(Mutual Exclusion)是指在多线程环境下,同一时刻只能有一个线程访问共享资源,以避免对该资源的不正确访问,造成数据不一致等问题。例如,如果有多个线程都要同时对同一个…

web端元素各种尺寸示意图

1.偏移尺寸 offsetHeight 元素在垂直方向上占用的尺寸(height,border,水平滚动条高度) offsetWidth 元素在垂直方向上占用的尺寸(height,border,水平滚动条高度) offsetTop 元素上边框外侧距离包含元素上边框内侧的尺寸 offsetLeft 元素左边框外侧距离包含元素左边框内侧的尺寸…

Python-第八天 Python文件操作

Python-第八天 Python文件操作一、文件的编码1. 什么是编码?2. 为什么需要使用编码?二、文件操作1.文件的操作步骤2. 打开文件3.mode常用的三种基础访问模式4.关闭文件三、文件的读取1.文件对象有如下读取方法:2.练习:单词计数三、…

nextTick 的使用和原理(面试题)

答题思路: nextTick 是做什么的?为什么需要它?开发时什么时候使用?介绍一下如何使用nextTick原理解读,结合异步更新和nextTick生效方式 1. nextTick是做什么的? nextTick是等待下一次DOM更新刷新的工具方法…

电子电器架构——怎样在请求/响应 ID确定的情况下修改发送FD 的CAN ID?

我是穿拖鞋的汉子,魔都中一个坚持长期主义的工程师! 老规矩,分享一段喜欢的文字,避免成为高知识低文化的人: 能不传话,最好不要传话;能不套话,最好不要套话;能不涉入“背后的批评”,最好不要涉入。让自己像沙滩,多大的浪来了,也是轻抚着沙滩,一波波地退去。而不要…

Ubuntu 快速切换到指定目录

现有以下场景,假设我在本地有/home/pc/Downloads/temp/Project 目录,我想快速在终端进入Project目录,需要怎么操作呢 文件管理器 由于我知道这个目录在哪个位置,那我就可以打开文件管理器,进入到这个目录&#xff0c…