这篇简单介绍下怎么将一个现有的Flutter
项目转成Flutter Web
项目。git
开始以前先浇一盆冷水,咱们理想中的一套代码、多端运行的愿望是要破灭了,至少目前版本的Flutter Web SDK
是无法作到的。不过不要紧,谷歌爸爸已经在官网中下降了咱们的预期:github
technical preview
状态Flutter
主项目fork
出来的,目前还没准备好合入主项目Flutter API
都有对应的Flutter Web
实现Flutter Web
的代码跑起来很卡,性能优化工做才刚刚开始所以Flutter Web
目前只是个半成品,踩到坑是必然的,但不妨碍咱们试着玩一玩。正好手里有一个以前开发的Flutter
项目,看看转成Flutter Web
要作哪些事。web
首先假定读者以前已经搭好了Flutter
开发环境,若是没有的话能够先看看谷歌的文档。再此基础上咱们先搭个Flutter Web
的环境。跨域
Flutter Web
要求Flutter SDK
的版本至少要1.5.4
,先跑下flutter upgrade
升级下Flutter
的版本。浏览器
而后安装Flutter Web
的编译工具webdev
:性能优化
flutter pub global activate webdev
复制代码
具体步骤和问题能够参考官网,这里就很少说了。bash
而后咱们开始迁移项目。markdown
因为目前Flutter Web
和Flutter
是两个不一样的SDK
,二者在项目中只能二选一,因此要支持Flutter Web
就不能用Flutter SDK
。所以对于Flutter Web
项目,目前只能新开一个项目,把原有项目中大部分搬过去。VS Code
也提供了搭建新项目的脚手架:网络
先用这个方法建立一个新项目。能够看到pubspec.yaml
中已经再也不依赖flutter
了,改成依赖flutter_web
:app
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
复制代码
打开页面后,发现全部的网络请求都失败,查了下是跨域问题,接口都是跨域访问的。最终确认是服务端须要作以下调整:
OPTIONS mode
OPTIONS mode
的接口reponse header
须要支持跨域在服务端改接口以前,能够用Charles
的rewrite
功能来mock
下,让全部接口都支持跨域:
好了,到这里,迁移过程基本完成。
还留了一些坑,等Flutter Web
稳定了之后再看看:
最后简单梳理下迁移须要作的事情:
Flutter Web
项目,把代码搬过去import
方式调整完。