这篇简单介绍下怎么将一个现有的 Flutter 项目转成 Flutter Web 项目。
开始之前先浇一盆冷水,我们理想中的一套代码、多端运行的愿望是要破灭了,至少目前版本的 Flutter Web SDK 是没法做到的。不过没关系,谷歌爸爸已经在 官网 中降低了我们的预期:
因此 Flutter Web 目前只是个半成品,踩到坑是必然的,但不妨碍我们试着玩一玩。正好手里有一个之前开发的 Flutter 项目,看看转成 Flutter Web 要做哪些事。
首先假定读者之前已经搭好了 Flutter 开发环境,如果没有的话可以先看看谷歌的文档。再此基础上我们先搭个 Flutter Web 的环境。
Flutter Web 要求 Flutter SDK 的版本至少要 1.5.4 ,先跑下 flutter upgrade 升级下 Flutter 的版本。
然后安装 Flutter Web 的编译工具 webdev :
flutter pub global activate webdev
复制代码
具体步骤和问题可以参考 官网 ,这里就不多说了。
然后我们开始迁移项目。
由于目前 Flutter Web 和 Flutter 是两个不同的 SDK ,两者在项目中只能二选一,所以要支持 Flutter Web 就不能用 Flutter SDK 。因此对于 Flutter Web 项目,目前只能新开一个项目,把原有项目中大部分搬过去。 VS Code 也提供了搭建新项目的脚手架:
先用这个方法创建一个新项目。可以看到 pubspec.yaml 中已经不再依赖 flutter 了,改为依赖 flutter_web :
name: hello_world_web
description: An app built using Flutter for web
environment:
# You must be using Flutter >=1.5.0 or Dart >=2.3.0
sdk: '>=2.3.0 <3.0.0'
dependencies:
flutter_web: any
flutter_web_ui: any
dev_dependencies:
build_runner: ^1.5.0
build_web_compilers: ^2.1.0
pedantic: ^1.7.0
dependency_overrides:
flutter_web:
git:
url: https://github.com/flutter/flutter_web
path: packages/flutter_web
flutter_web_ui:
git:
url: https://github.com/flutter/flutter_web
path: packages/flutter_web_ui
复制代码
然后把老项目中 lib 文件夹下的所有代码搬过去。这样以后肯定会有一堆编译问题,我们一个个来处理。
首先我们要把 import 方式全部改掉,比如以前的 flutter 要换成 flutter_web :
import 'package:flutter/material.dart'; /// 不再适用
import 'package:flutter_web/material.dart'; /// 现在用这种
import 'dart:ui'; /// 不再适用
import 'package:flutter_web_ui/ui.dart'; /// 现在用这种
复制代码
另外由于项目名也变了,比如之前是 hello_world ,现在是 hello_world_web ,所有相关的 import 也要改下。
这么做以后,如果你的项目没有任何第三方依赖的话,编译问题基本算是解决了。如果有第三方依赖,嘿嘿,这就比较麻烦了。我们的项目就用到了如下依赖:
percent_indicator: ^2.1.1
pull_to_refresh: ^1.5.1
fluttertoast: ^3.1.0
flutter_spinkit: "^3.1.0"
modal_progress_hud: ^0.1.3
sticky_headers: "^0.1.8"
复制代码
直接把这些依赖添加到 Flutter Web 项目中会报错:
Resolving dependencies...
Because percent_indicator >=1.0.6 depends on flutter any from sdk which is forbidden, percent_indicator >=1.0.6 is forbidden.
So, because iwords_web depends on percent_indicator ^2.1.1, version solving failed.
复制代码
也就是说,这些依赖库都是基于 Flutter 开发的,在 Flutter Web 项目中不能用。。。 于是去 pub.dev 上找有没有对应的 Web 版本依赖,结果发现一个都没有。。。
为了能最终看到跑起来的效果,再恶心的事情也得干。遂决定把所有的依赖库全部源码引入工程中,然后把依赖库逐个改成支持 Flutter Web 的版本,这是个纯体力活,此处省略1000字。。。
这一步做完,编译问题应该没有了。接下来要处理资源问题了。
以前是通过在 pubspec.yaml 中指定 assets 路径的方式,现在同样的方法试了试不起作用。然后官网查了一圈也没说资源怎么指定,最后在 Flutter Web 官方的 Sample 代码 中找到了方案:
于是把原项目中的 assets 文件夹搬到新项目的 web 文件夹下,然后引用资源的路径也调整了下:
/// 老路径
FadeInImage.assetNetwork(
placeholder:'assets/images/book_placeholder.png',
image: item.book.coverImageUrl,
fit: BoxFit.cover)
/// 新路径
FadeInImage.assetNetwork(
placeholder:'images/book_placeholder.png',
image: item.book.coverImageUrl,
fit: BoxFit.cover)
复制代码
这样图片资源就能显示出来了。
然后我们跑一把项目:
flutter pub get # 获取第三方依赖
webdev serve # 把编译好的js部署到web server
复制代码
如果 webdev serve 这一步出错的话,可以重启下机器试试。
然后默认是通过 localhost:8080 打开页面。如果需要指定不同端口号,可以用下面命令:
webdev serve web:3002
复制代码
打开页面后,发现所有的网络请求都失败,查了下是跨域问题,接口都是跨域访问的。最终确认是服务端需要做如下调整:
在服务端改接口之前,可以用 Charles 的 rewrite 功能来 mock 下,让所有接口都支持跨域:
好了,到这里,迁移过程基本完成。
还留了一些坑,等 Flutter Web 稳定了以后再看看:
最后简单梳理下迁移需要做的事情:
Flutter Web
import
完。
原文:http://www.cocoachina.com/articles/29430
通过技术的角度,来探讨如何提高网页加载速度的方法和技巧,一个网站速度的访问快慢将直接影响到用户体验,对于我们开发来说是应该解决的。
XSS攻击的全称Cross Site Scripting(跨站脚本攻击),为了避免和样式表CSS混淆而简写为XSS。XSS恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
通过js或css禁止蒙层底部页面跟随滚动:pc端推荐给body添加样式overflow: hidden;height: 100%;移动端利用移动端的touch事件,来阻止默认行为,若应用场景是全平台我们要阻止页面滚动,那么何不将其固定在视窗(即position: fixed),这样它就无法滚动了,当蒙层关闭时再释放。
渐进式 Web 应用是利用现代浏览器的特性,可以添加到主屏幕上,表现得像原生应用程序一样的 Web 应用程序。
Web前端技术由 html、css 和 javascript 三大部分构成,是一个庞大而复杂的技术体系,其复杂程度不低于任何一门后端语言。而我们在学习它的时候往往是先从某一个点切入,然后不断地接触和学习新的知识点,因此对于初学者很难理清楚整个体系的脉络结构。
Web开发是比较费神的,需要掌握很多很多的东西,特别是从事前端开发的朋友,需要通十行才行。今天,本文向初学者介绍一些Web开发中的基本概念和用到的技术,从A到Z总共26项,每项对应一个概念或者技术。
Web浏览器的主要功能是展示网页资源,即请求服务器并将结果展示在窗口中。地址栏输入URL到页面显示经历的过程、浏览器的主要组件、浏览器渲染...
增强现实(以下简称 AR)浪潮正滚滚而来,Web 浏览器作为人们最唾手可得的人机交互终端,正在大力发展 AR 技术。AR 可以简单的理解为一种实时将虚拟图像叠加在现实场景中的技术
先了解一下 workbox:不管你的站点是何种方式构建的,都可以为你的站点提供离线访问能力。就算你不考虑离线能力,也能让你的站点访问速度更加快。几乎不用考虑太多的具体实现,只用做一些配置...
用户是否操作了web页面,我们可以在一定时间内根据用户是否触发了某些事件进行判断。比如用户是否点击,是否按键,是否移动了鼠标等
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!