flutter开发web项目

article/2025/9/1 15:41:16



Flutter Web在美团外卖的实践 - 掘金

让项目支持web :flutter create .

运行:flutter run -d chrome

运行指定渲染方式:flutter run --web-renderer html -d chrome

打包:flutter build web --release --web-renderer html

官方链接:Flutter on the Web

参考视频:构建 Flutter web 应用 (From Mobile App to web App)_哔哩哔哩_bilibili

部署参考链接:「Flutter for Web 」创建与部署 - 简书

发布到GitHub上:使用Flutter Web和GitHub Actions构建发布自己的Github Pages网站 - 简书

前端项目自动部署GitHub Pages_哔哩哔哩_bilibili

docker官网:Docker 教程 | 菜鸟教程


去除链接URL中的"#"

1.在pubspec.yaml文件中添加如下代码:# 去除网页URL中的“#”(hash) https://flutter.cn/docs/development/ui/navigation/url-strategiesurl_strategy: 0.2.02.在main.dart文件中添加如下代码:
import 'package:url_strategy/url_strategy.dart';/// 去除URL中的“#”(hash),仅针对Web。默认为setHashUrlStrategy/// 注意本地部署和远程部署时`web/index.html`中的base标签,https://github.com/flutter/flutter/issues/69760setPathUrlStrategy();

dio网络请求配置:

if (!Utils.isWeb) {// https://developer.github.com/v3/#user-agent-requiredoptions.headers['User-Agent'] = 'Mozilla/5.0';}

Flutter Web使用手机浏览器调试

在android studio中只有电脑端的chrome,如果想用手机上的浏览器调试项目,需要本地部署一下:

flutter run --web-renderer html -d web-server --web-hostname 192.168.1.15 --web-port 8080 --release

ip地址换成你电脑的ip地址即可,然后手机和电脑在同一网络环境下,就可以输入上面的ip+端口号访问web项目了,比如:在手机浏览器输入:192.168.3.156:8080

flutter web渲染器相关

html : 通过平台的 canvas 和 Element 完成布局绘制;
canvaskit : 通过 Webassembly + Skia 绘制控件;

虽然都知道 canvavskit 更接近 Flutter 的设计理念,但是由于它构建的 wasm 文件大小和字体加载等问题带来的成本考虑,业界一般会选用更轻量化的 html 引擎

官方默认使用渲染器:
1.手机浏览器:HTML。CSS,Canvas元素和SVG元素。 该渲染器的下载大小较小。
2.桌面浏览器:Canvaskit。使用Skia编译为WebAssembly并使用WebGL渲染。 该渲染器与Flutter移动设备和台式机完全一致,具有更快的性能,并且不太可能在浏览器之间出现差异,但下载大小增加了大约2MB。
指定浏览器:
flutter run -d chrome --web-renderer htmlflutter run -d chrome --web-renderer canvaskit

参考:超详细,Flutter2.0构建Web应用的实际体验|技术点评 - 掘金

首次加载过慢问题优化(倒序)主要文件:CupertinoIcons.ttf  main.dart.js 和 MaterialIcons-Regular.otf

总结:

  • 去除无用的 icon 引用;(flutter3.10版本看介绍说减小了图标字体的文件大小,它会从Material和Cupertino中删除了未使用的字形)

  • 使用 tree-shake-icons 优化引用矢量图库;

  • 通过 deferred-components 实现懒加载分包;

  • 开启 gzip 等压缩算法压缩  main.dart.js ;

7.通过外部手段(没试过):开启 gzip 等压缩算法压缩  main.dart.js 

例如通过在部署时开启 gzip 或者 brotli 压缩,开始 gzip 后大概可以让 main.dart.js 下降到 400k 左右 

 6.MaterialIcons-Regular.otf优化

虽然在项目中我们会使用到 MaterialIcons 的一些矢量图标,但是每次加载都要全量加载一个 1.5 MB 的字体库文件显然并不符合逻辑,所以我们可以先运行 flutter build apk ,然后通过如下命令,将 Android 上已经 shake-icons 的 MaterialIcons-Regular.otf 资源复制到已经编译好的 web/ 目录下。

cp -r ./build/app/intermediates/flutter/release/flutter_assets/ ./build/web/assets

优化大小:1.5mb   优化后大小:3kb

 5.main.dart.js拆包&优化:通过 deferred-components 实现懒加载分包;

等待过程优化可在一定程度上提升等待体验,单治标不治本,要想加载快还得让加载的资源小,对于多页面应用,可以将整个 main.dart.js 拆分成多个小的包,在使用的过程中逐步加载,目前了解到美团有相应的技术,但实现细节未知,有待研究。可参考 github.com/flutter/flu…

参考:http://t.csdn.cn/hgaUO

大前端时代的乱流:带你了解最全面的 Flutter Web

Flutter 延迟组件原理与自定义 【包体积优化 _ 动态化http://t.csdn.cn/7j61V

4.等待过程优化

页面在 js 加载完成之前都是白屏,给人一种页面卡死的感觉,为此可以在 js 加载完成前增加加载动画不至于让页面一直白屏。参考App上管用的做法,可在数据加载出来之前插入骨骼屏,实现如下:

<iframe src="https://g.alicdn.com/algernon/alisupplier_content_web/0.9.1/skeleton/index.html"id="iFrame" frameborder="0" width="100%" height="100%" scrolling="no" onload="setIframeSize()"></iframe>
<script>function setIframeSize() {<!-- 骨骼屏尺寸设置,占满全屏 -->var iframe = document.getElementById("iFrame");iframe.height =  document.documentElement.clientHeight;}function removeIFrame() {var iframe = document.getElementById("iFrame");iframe.parentNode.removeChild(iframe);}<!--   onresize属性可以用来获取或设置当前窗口的resize事件的事件处理函数-->
<!--  onresize事件会在窗口或框架被调整大小时发生-->window.onresize = function() {setIframeSize();}</script><!-- load 完成之后移除骨骼屏 -->
<script type="text/javascript" onload="removeIFrame()"></script>

或者:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>gsy_flutter_demo</title><style>.loading {display: flex;justify-content: center;align-items: center;margin: 0;position: absolute;top: 50%;left: 50%;-ms-transform: translate(-50%, -50%);transform: translate(-50%, -50%);}.loader {border: 16px solid #f3f3f3;border-radius: 50%;border: 15px solid ;border-top: 16px solid blue;border-right: 16px solid white;border-bottom: 16px solid blue;border-left: 16px solid white;width: 120px;height: 120px;-webkit-animation: spin 2s linear infinite;animation: spin 2s linear infinite;}@-webkit-keyframes spin {0% {-webkit-transform: rotate(0deg);}100% {-webkit-transform: rotate(360deg);}}@keyframes spin {0% {transform: rotate(0deg);}100% {transform: rotate(360deg);}}</style>
</head>
<body><div class="loading"><div class="loader"></div></div><script src="main.dart.js" type="application/javascript"></script>
</body>
</html>

参考链接:https://juejin.cn/post/7068533637364334622

1.渲染引擎 Canvaskit 下载太慢,这个Canvaskit是从https://unpkg.com去加载的,需要翻墙

解决方案:1.使用镜像 2.下载canvaskit.js 和 canvaskit.wasm 这两个文件放到自己的服务器,或其它高速服务器  3.指定使用html渲染器

下载四个文件(参考:10.1.1.flutter-web内网 - 简书)

(1)canvaskit.js和canvaskit.wasm
下载地址: https://unpkg.com/browse/canvaskit-wasm@0.24.0/bin/
(2)KFOmCnqEu92Fr1Me5WZLCzYlKw.ttf
下载地址: https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Me5WZLCzYlKw.ttf
(3)css2?family=Noto_Sans+SC
下载地址: https://fonts.googleapis.com/css2?family=Noto+Sans+SC
(4)将以上四个文件放到web/assets/canvaskit/文件夹中 

通过命令行直接运行:(release/debug)

flutter run --web-renderer canvaskit --dart-define=FLUTTER_WEB_CANVASKIT_URL=web/assets/canvaskit/ --release -d chrome

打包命令

flutter build web --web-renderer canvaskit --dart-define=FLUTTER_WEB_CANVASKIT_URL=web/assets/canvaskit/ --release 

2.字体问题Flutter web默认使用Noto字体,一般电脑上都不会带有这个字体,所以会在线加载这个字体,导致加载缓慢还会产生乱码

解决方案:使用自定义字体,把字体资源放到项目中,然后使用字体:

flutter:fonts:- family: Ralewayfonts:- asset: assets/fonts/Raleway-Regular.ttf- asset: assets/fonts/Raleway-Medium.ttf- asset: assets/fonts/Raleway-SemiBold.ttf

3、去除无用的 icon 引用

若只是个人网页之类的简单web项目,可以删除一些系统的资源包,pubspec.yaml中cupertino_icons: ^1.0.2,uses-material-design: true注释掉,这样可以少加载这些资源文件。

参考:

10.1.1.flutter-web内网 - 简书

解决 Flutter Web 加载canvaskit.wasm过慢的方法 - 简书

 https://sb.sb/blog/css-cdn/
解决 Flutter Web 加载慢的问题_Amoour的博客-CSDN博客_flutter web 加载慢
Flutter Web 常见问题及兼容性处理 - 掘金

flutter web 的路径模式和hash模式

参考:最小单元 flutter for webURL导航与hashtag(#)的处理 - 简书

flutter web开发遇到的问题

1.flutter web项目上线后,点击刷新按钮(F5)报错404问题(使用nginx)

原因:我项目中使用的是路径模式,在刷新页面(或单个页面链接单独访问)时将会请求当前的链接,而Nginx无法找到对应的页面

解决:使用Nginx配置,让所有路由(url)下的页面重写到 index.html即可,在Nginx配置文件nginx.conf中加入如下配置。(index.html根据实际页面配置)

location / {try_files $uri $uri/ /index.html;
}

参考:Vue项目上线后,点击刷新按钮(f5)报错404的问题(使用nginx)_Honins的博客-CSDN博客_vue项目f5刷新404

2.文字不能选择

解决:使用SelectableText

3.图片不能拖拽(暂时没解决)

4.标题栏自带的返回按钮

解决:系统的AppBar(
        title: Text('景区购票'),
        automaticallyImplyLeading: false,//去掉自带的返回按钮
      )

参考:flutter web遇到的坑 - HemJohn - 博客园

在本地网络中,可以在任意浏览器中访问,不会存在跨域资源访问问题解决参考:Flutter工具之shelf_proxy


http://chatgpt.dhexx.cn/article/klwumoWR.shtml

相关文章

1 使用Web2Py框架搭建网站

更多文章请关注&#xff1a; https://eightplus.github.io/ IDE&#xff1a;PyCharm 1、创建web2py项目 在下图左侧选中Web2Py&#xff0c;在右侧填写项目路径和应用名称&#xff0c;我这里是第一次创建&#xff0c;所以直接点击"Create"创建项目&#xff0c;此时…

通俗易懂web3.0

目录 前言一、WEB1.0二、WEB2.0三、WEB3.0区别最后 前言 大家好&#xff0c;我是清风。互联网连接了人与人&#xff0c;在过去的30年中&#xff0c;互联网技术不断进化、演化&#xff0c;向纵深发展&#xff0c;政治、经济、社交、生活、工作已经几乎离不开互联网。我们经历了…

ctfshow-WEB-web2

ctf.show WEB模块第2关是一个SQL注入漏洞,请求方式是POST请求,注入点是单引号字符型注入,flag就藏在当前的数据库的flag表中,使用联合注入获取数据即可 在用户名的输入框中输入万能账号 a or true #,密码随便输 登录成功,万能账号生效了,并且把查询到的用户名显示到了页面中,既…

Web3和Web2有什么区别?为什么Web3是未来?(以“以太坊”为例解读)

Web3和Web2有什么区别&#xff1f;为什么Web3是未来&#xff1f; 最近&#xff0c;Web3的概念十分火爆&#xff0c;下面这张图也是很有趣的描述了Web的一些特质&#xff0c;在社交软件内广为流传&#xff0c;那Web3到底是什么呢&#xff1f; Web2 是指我们大家今天都知道的互联…

Web2与Web3开发的不同之处

Web2是引入交互功能的第二代互联网&#xff0c;也是我们今天所熟悉的。随着Web的不断发展&#xff0c;第三代互联网&#xff0c;也被称为Web3&#xff0c;正处于积极开发中。Web3引入了在区块链上运行的去中心化和无需许可的系统。但是Web2和Web3开发之间有什么区别呢&#xff…

软件项目管理:外包 outsourcing、采购 procurement、合同 contracts

文章目录 外包不同类型为什么选择外包好处坏处 采购 procurementplanning 阶段-弄清需求 & 市场 / 评估风险Source 阶段-确定供应商具体过程RFxState of Work (SOW)评估步骤 Evaluation process Manage 阶段 Contract 合同定义种类固定价格合同适用场景&#xff08;保守&am…

互联网中---外包的含义

外包&#xff0c;在我们这个行业是一个很常见的名词&#xff0c;对应着一个特殊的工种。 但是我发现很多朋友好像妖魔化了外包&#xff0c;觉得这玩意就是一个“坑”。 但是这个问题吧&#xff0c;得去辩证的看。很多人一提到“外包”就是非常的消极&#xff0c;觉得这个人大…

到底要不要去外包公司?这篇带你全面了解外包那些坑!

点击关注公众号&#xff0c;实用技术文章及时了解 转自&#xff1a;程序员小谭&#xff0c; 作者&#xff1a;谭叔 要不要去外包公司外包公司坑不坑我应聘上了某自研公司和某外包公司&#xff0c;该去哪一个 虽然我没在外包公司工作过&#xff0c;但根据行内评价和一些朋友的经…

外包项目注意事项问题

2019独角兽企业重金招聘Python工程师标准>>> 随着信息化的逐步深入&#xff0c;无论是企业、政府还是个人&#xff0c;对软件的依赖已经到了必不可少的地步。现在有越来越多的人认识到了软件在日常经营管理中的重要作用&#xff0c;因此外包的软件项目也在不断增长。…

银行项目外包专题系列之一:经常遇到的外包/驻场/实施/To B/POC这些概念

最近发现很多未毕业的学生或者已经毕业的同学在银行项目工作或者最近找不到合适的工作&#xff0c;只有外包公司来招聘自己去银行工作&#xff0c;但是自己对这个行业存在很多困扰和焦虑&#xff0c;于是准备写几篇这个文章进行分享。 今天分享一下外包、驻场、实施、To B、PO…

软件外包项目的管理

我们知道典型的外包项目场景&#xff0c;经常发生在大型国企。大型国企的业务系统非常庞大&#xff0c;但是本身的研发团队一方面建制不足、另一方面往往因为工作本身的特点、研发团队对技术的感知随着时间的发展&#xff0c;逐渐脱离趋势。 关于建制不足方面、其实表现在很多方…

Python Spider: 爬取项目外包网站TaskCity

对于想要做软件外包的小伙伴们来说&#xff0c;每天登陆外包网站&#xff0c;并且搜索合适的项目&#xff0c;是很累人并且十分枯燥的事情。使用Python爬虫&#xff0c;可以自动对外包网站上面最新的软件外包项目进行搜索、提取和保存。可以大大提高大家的工作效率。 该项目使…

软件开发外包项目常见的问题

Author&#xff1a;3# 一个专注于web技术的80后 核心就是一句话:软件开发要知其然知其所以然。 CSDN3#&#xff0c;CSDN官方首发&#xff0c;3#原创 博客&#xff1a; &#x1f449; 极客小俊GeekerJun &#x1f448; 前言 外包项目经常会遇见一些很不可控的问题, 根本原因在于…

国内外10大项目外包平台

国内外包平台 1.猪八戒网 网址: www.zhubajie.com 特点:以国内项目为主&#xff0c;主要为页面设计&#xff0c;logo设计等小型项目为主。 2.任务中国 网址: www.taskcn.com 特点: 是一个为消除劳务信息的地域差异、为广大有能力威客们建立的2010年后主流工作平台之一。 3.软件…

FPGA项目承接|FPGA项目外包|FPGA项目研发

您还为找不到合适的FPGA开发工程师心急如焚吗? 汇集了2000G的FPGA学习和研发技术资料,可以免费分享给FPGA技术爱好者,微信:www8928 您可以找燎原团队! 燎原团队致力于FPGA多核板卡设计开发,可以配合您的开发团队,提供稳定可靠的FPGA解决方案,现有专职+兼职团队20多位…

承接软硬件项目外包开发

多年来一直从事轨道交通、铁路专用电子设备开发&#xff0c;做软硬件开发培训&#xff0c;小批量委托生产&#xff0c;曾做过很多项目&#xff0c;单片机软件开发及硬件设计的经验丰富&#xff0c;具体项目信息如下&#xff1a; 1、采用单片机&#xff08;PIC&#xff09;设计架…

银行项目外包专题系列之二:公司没提升打杂,裸辞后收到银行外包,到底去还是不去

有小伙伴反馈&#xff1a; 【在上一家公司觉得没啥提升&#xff0c;整天忙着打杂&#xff0c;裸辞了&#xff0c;现在收到了银行外包的Offer&#xff0c;觉得银行外包可以去吗&#xff1f;】 这里说一下我对于这个问题的看法和理解&#xff0c;这个问题也是目前很多年轻人的现…

3年经验程序员聊聊外包项目,总结了6个典型的问题该如何解决

我是一名老程序员&#xff0c;接了项目&#xff0c;接外包项目已经有3年多的经验了。今天我想分享一些接项目的经验给大家。 第一&#xff0c;辞职去接外包&#xff0c;好吗&#xff1f;有很多人幻想辞职了全职去接外包&#xff0c;但我并不太建议这样做。我建议大家先把自己的…

成功管理外包项目的4个技巧

业务流程外包在商业世界中并不是什么新鲜事。在过去的几年里&#xff0c;它已成为一种趋势。原因是外包可以提高效率&#xff0c;提供成本优势&#xff1b; 外包后&#xff0c;企业可以专注于核心领域。 此外&#xff0c;它还提供对非常熟练的资源等的访问。 但即使外包&#…

软件项目外包的合作流程是怎样的?

关于“软件项目外包”&#xff0c;是指企业未搭建技术团队&#xff0c;而将项目下放给专门做软件开发服务的第三方公司的一种项目外包方式&#xff0c;原因是为了减少试错成本&#xff0c;节省总成本&#xff0c;利用软件公司的专业服务提高工作效率。 软件外包行业的发展为非…