FlutterWeb实战:03-与流行前端框架集成

与流行前端框架集成

前端有非常多的框架、工具、库,这些都要比 Dart Web 成熟、丰富。所以在将 Fluttter 编译成 Web 以后,若能使用现有的前端技术实现 web 端的特殊需求,肯定事半功倍。

搭建框架

在开始之前,确保你已经安装好了 node 和 npm

使用 create-react-app 初始化项目

首先使用 create-react-app 创建一个前端项目

npx create-react-app flutter_web

这些创建以下文件

  .eslintrc.jsbuild/node_modules/package.jsonpublic/src/yarn.lock

这是一个标准的前端项目,不过不用担心,我们不会使用任何 react 技术。

项目配置

为了能自定义 webpack 打包配置,需要安装一个名为 react-app-rewired 的插件,以替换 react-scripts 脚本

使用 react-app-wired 替换

安装 react-app-wired

npm install -g react-app-rewired

在根目录创建 config-overrides.js 文件,增加以下内容

const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = function override(config, env) {// Remove the default HtmlWebpackPluginconfig.plugins = config.plugins.filter((plugin) => !(plugin instanceof HtmlWebpackPlugin));// Add your own HtmlWebpackPlugin instance with your own optionsconfig.plugins.push(new HtmlWebpackPlugin({template: 'public/index.html',minify: {removeComments: false,collapseWhitespace: false,removeRedundantAttributes: true,useShortDoctype: true,removeEmptyAttributes: true,removeStyleLinkTypeAttributes: true,keepClosingSlash: true,minifyJS: false,minifyCSS: true,minifyURLs: true,},}));return config;
};

这里面引入一个名为 html-webpack-plugin 的插件,配置了需要压缩的内容。

替换 package.json 中 scripts 部分

  "scripts": {
-   "start": "react-scripts start",
+   "start": "react-app-rewired start",
-   "build": "react-scripts build",
+   "build": "react-app-rewired build",
-   "test": "react-scripts test",
+   "test": "react-app-rewired test","eject": "react-scripts eject"
}

初始化 Flutter

在当前项目目录下,执行以下命令初始化 Flutter 项目

flutter create --platforms web .

这将创建一个 Flutter 项目,并添加了 web 平台支持。

以下目录由 flutter 创建

Recreating project ....pubspec.yaml (created)lib/main.dart (created)web/analysis_options.yaml (created)

集成

现在,虽然两个项目共用一个目录,但我们需要修改一些配置,才将 flutter 项目与前端项目集成在一起工作。

编辑 package.json 文件中scripts/build 处的内容,改为

“rm -rf build && rm -rf web && react-app-rewired build && mv build web”,

同时删除不需要的依赖, 增加 react-app-rewired 依赖

  "dependencies": {
-    "cra-template": "1.2.0",
-    "react": "^19.0.0",
-    "react-dom": "^19.0.0","react-scripts": "5.0.1"},"eslintConfig": {"extends": [
-      "react-app",
-      "react-app/jest"]},
+ "devDependencies": {
+   "react-app-rewired": "^2.2.1"
+  }

运行 npm installyarn install, 更新依赖。

这行命令的作用是,构建时先清理当前项目目录 build 和 web 目录,构建完成后将前端构建目录改名为 web,以提供给 flutter 进一步构建使用。

最终,经过一番折腾, package.json 文件中的内容如下面所示

{"name": "flutter_web","version": "0.1.0","private": true,"dependencies": {"react-scripts": "5.0.1"},"scripts": {"start": "react-app-rewired start","build": "rm -rf build && rm -rf web && react-app-rewired build && mv build web","test": "react-app-rewired test","eject": "react-app-rewired eject"},"eslintConfig": {"extends": []},..."devDependencies": {"react-app-rewired": "^2.2.1"}
}

接下来我们复制 web 目录并替换掉 public 目录。

rm -rf public
cp -r web public

运行 npm run build, 如果能成功生成 web 目录,代表集成成功

前端开发

前面的准备工作完成以后,就可以愉快的开发了!

进入 src 目录,这里面就可以编写我们的前端代码了,也可以使用 npm 的任何 js 库。

为了统一维护 js,我们把 flutter web 的初始化代码从 html 中移到这里。

首先清空 src 目录中的文件,然后新建一个 index.js, 添加以下内容

window.flutterWebRenderer = "html";
window.addEventListener('load', function(ev) {// Download main.dart.js_flutter.loader.loadEntrypoint({entrypointUrl: 'main.dart.js',serviceWorker: {serviceWorkerVersion: serviceWorkerVersion,}}).then(function(engineInitializer) {return engineInitializer.initializeEngine();}).then(function(appRunner) {return appRunner.runApp();});
});

项目构建

# 构建前端
npm run build
# 构建Flutter
flutter clean && flutter build web --build-number=$VERSION_CODE --build-name=$TAG --web-renderer html --profile --base-href /webapp/

上述命令中, 和 都是环境变量,需要提前设置好

export VERSION_CODE=1
export TAG=1.0.0

这里需要注意的是,如果你不希望通过子目录访问 Flutter web 应用,那么需要将 base-href 设置为 /,或者移除该选项

flutter clean && flutter build web --build-number=$VERSION_CODE --build-name=$TAG --web-renderer html --profile

源码获取

https://gitee.com/zacks/flutter-web-demo

参考资料

  • Create React App
  • React App Wired
  • 编写你的第一个 Flutter 网页应用
  • flutter-web-demo

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

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

相关文章

新一代高性能无线传输模块M-GATEWAY3

M-GATEWAY3是M3系列的通用接口模块,用于接收各种总线信号并将它们集成到一个系统中。该模块通过标准化传输协议XCPonETH进行输出,确保为各种测量应用提供无损信号。此外,M-GATEWAY3支持通过热点、ETH-PC或USB-C传输数据。借助M-GATEWAY3&…

deepseek+“D-id”或“即梦AI”快速生成短视频

1、deepseek生成视频脚本 1.1、第一步:使用通用模板提出需求,生成视频脚本 对话输入示例脚本1: 大年初五是迎财神的日志,帮我生成10秒左右的短视频, 体现一家3口在院子里欢庆新年, 孩子在院子里放鞭炮烟…

aspectFill(填充目标区域的同时保持图像的原有宽高比 (aspect ratio)图像不会被拉伸或压缩变形

“aspectFill” 是一个常用于图像和视频处理的术语,尤其是在用户界面 (UI) 设计和图形编程领域。它描述的是一种图像缩放或调整大小的方式,旨在填充目标区域的同时保持图像的原有宽高比 (aspect ratio)。 更详细的解释: Aspect Ratio (宽高比): 指的是图…

SpringCloud - Gateway 网关

前言 该博客为Sentinel学习笔记,主要目的是为了帮助后期快速复习使用 学习视频:7小快速通关SpringCloud 辅助文档:SpringCloud快速通关 源码地址:cloud-demo 一、简介 官网:https://spring.io/projects/spring-clou…

律所录音证据归集工具:基于PyQt6与多线程的自动化音频管理解决方案

在律所日常工作中,音频证据的整理与归集是一个高频且复杂的任务。面对大量的案件录音文件,如何实现快速且准确的分类与存档,成为了律所提高效率、降低出错率的关键。本文将通过技术角度解析一款名为律所录音证据归集工具的项目,详…

外贸网站源码 助力企业抢占蛇年市场先机!

在竞争激烈的外贸市场中,蛇年无疑是企业寻求突破与增长的关键一年。外贸网站源码为企业提供了快速搭建专业外贸网站的解决方案,助力企业在新的一年抢占市场先机。 快速上线 时间就是商机,尤其是在蛇年这样充满变数和机遇的年份。外贸网站源码…

Word成功接入DeepSeek详细步骤

原理 原理是利用Word的VBA宏,写代码接入API。无需下载额外插件。 步骤一、注册硅基流动 硅基流动统一登录 注册这个是为了有一个api调用的api_key,有一些免费的额度可以使用。大概就是这个公司提供token,我们使用这个公司的模型调用deepsee…

vue-点击生成动态值,动态渲染回显输入框

1.前言 动态点击生成数值&#xff0c;回显输入框&#xff0c;并绑定。 2.实现 <template><div style"display:flex;align-items: center;flex-direction:row"><a-input:key"inputKey"v-model"uploadData[peo.field]"placehold…

Python 识别图片和扫描PDF中的文字

目录 工具与设置 Python 识别图片中的文字 Python 识别图片中的文字及其坐标位置 Python 识别扫描PDF中的文字 注意事项 在处理扫描的PDF和图片时&#xff0c;文字信息往往无法直接编辑、搜索或复制&#xff0c;这给信息提取和分析带来了诸多不便。手动录入信息不仅耗时费…

利用邮件合并将Excel的信息转为Word(单个测试用例转Word)

利用邮件合并将Excel的信息转为Word 效果一览效果前效果后 场景及问题解决方案 一、准备工作准备Excel数据源准备Word模板 二、邮件合并操作步骤连接Excel数据源插入合并域预览并生成合并文档 效果一览 效果前 效果后 场景及问题 在执行项目时的验收阶段&#xff0c;对于测试…

进阶版MATLAB 3D柱状图

%% 1. 数据准备 % 假设数据是一个任意形式的矩阵 % 例如&#xff1a;5行 x 7列的矩阵 data [3 5 2 6 8 4 7;7 2 6 9 3 5 8;4 8 3 7 2 6 9;6 1 5 8 4 7 2;9 4 7 3 6 2 5];% 定义行和列的标签&#xff08;可选&#xff09; rowLabels {Row1, Row2, Row3, Row4, Row5}; % 行标签…

【JVM详解三】垃圾回收机制

一、对象是否存活 强引用&#xff1a;Object obj new Object(); 只要强引用还在&#xff0c;垃圾收集器永远不会回收掉被引用的对象。在不用对象的时将引用赋值为 null&#xff0c;能够帮助垃圾回收器回收对象。比如 ArrayList 的 clear() 方法实现。软引用&#xff08;SoftRe…

【免费】2007-2020年各省医疗卫生支出数据

2007-2020年各省医疗卫生支出数据 1、时间&#xff1a;2007-2020年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区名称、年份、医疗卫生支出 4、范围&#xff1a;31省 5、指标说明&#xff1a;地方财政医疗卫生支出是指地方ZF从其财政预…

【深度学习入门实战】基于Keras的手写数字识别实战(附完整可视化分析)

​ 本人主页:机器学习司猫白 ok,话不多说,我们进入正题吧 项目概述 本案例使用经典的MNIST手写数字数据集,通过Keras构建全连接神经网络,实现0-9数字的分类识别。文章将包含: 关键概念图解完整实现代码训练过程可视化模型效果深度分析环境准备 import numpy as np impo…

腾讯云大数据套件TBDS与阿里云大数据能力产品对比

前言 博主在接触大数据方向研究的时候是在2016年,那时候正是大数据概念非常火热的一个时间段,最著名的Google的3篇论文。Google FS、MapReduce、BigTable,奠定了大数据框架产品的基础。Google文件系统,计算框架和存储框架。往后所有的大数据产品和过程域无一不是在三个模块…

前端如何判断浏览器 AdBlock/AdBlock Plus(最新版)广告屏蔽插件已开启拦截

2个月前AdBlock/AdBlock Plus疑似升级了一次 因为自己主要负责面对海外的用户项目&#xff0c;发现以前的检测AdBlock/AdBlock Plus开启状态方法已失效了&#xff0c;于是专门研究了一下。并尝试了很多方法。 已失效的老方法 // 定义一个检测 AdBlock 的函数 function chec…

2.11寒假作业

web&#xff1a;[SWPUCTF 2022 新生赛]js_sign 打开环境是这样的&#xff0c;随便输入进行看看 提示错误&#xff0c;看源码其中的js代码 这个代码很容易理解&#xff0c;要让输入的内容等于对应的字符串&#xff0c;显然直接复制粘贴是错的 这串字符看起来像是base64加密&…

c# http

C#代码 客户端&#xff1a; NETCore提供了三种不同类型用于生产的REST API&#xff1a; HttpWebRequest;WebClient;HttpClient HttpWebRequest 这是.NET创建者最初开发用于使用HTTP请求的标准类。使用HttpWebRequest可以让开发者控制请求/响应流程的各个方面&#xff0c;如…

哈希表实现(C++实现)

目录 1.哈希概念 2.哈希冲突 3.哈希函数 4.哈希冲突解决 闭散列 —— 开放定址法 线性探测 二次探测 开散列 —— 链地址法&#xff08;拉链法、哈希桶&#xff09; 5.哈希表的闭散列实现 哈希表的结构 哈希表的大小和扩容 哈希表的插入 哈希表的查找 哈希表的删除…

开箱即用:一个易用的开源表单工具!

随着互联网的普及&#xff0c;表单应用场景越来越广泛&#xff0c;从网站注册、调查问卷到考试测评&#xff0c;无处不在。传统的表单制作方式需要一定的代码基础&#xff0c;对于不懂编程的小伙伴来说&#xff0c;无疑是一道门槛。 今天&#xff0c;给大家分享一款开源的表单…