当前位置: 首页 > news >正文

Flutter | 商城项目鸿蒙(OpenHarmony)适配实战

本文记录将原来的flutter商城项目在 Windows + DevEco Studio 环境下,将flutter_shop从「能编译」推进到「首页有数据、登录可用」的完整过程,包括环境配置、运行命令、踩坑与最终方案。
flutte商城项目源码链接:flutter-learn
安卓端适配:Flutter | 项目打包运行在安卓端


一、整体流程概览

安装鸿蒙版 Flutter

配置无空格路径联接

ohos/local.properties

flutter pub get

setup-harmony-env.bat

构建 HAP 并安装

网络与首页适配

登录本地存储适配

阶段目标关键产出
环境SDK、hvigor、ohpm 可用DEVECO_SDK_HOMED:\flutter_ohos
构建assembleHap成功build/ohos/hap/entry-default-signed.hap
运行模拟器安装并启动flutter run --release -d 127.0.0.1:5555
业务首页加载、登录持久化ohos_http_overridesOhosLoginFileStorage

二、环境准备

2.1 必备软件

组件说明
DevEco Studio提供 HarmonyOS SDK、模拟器、hvigor、ohpm
Flutter OHOS 分支非官方 stable,需使用 TPC 提供的flutter_flutter
Gitflutter pub get拉取依赖;建议开启长路径:git config --global core.longpaths true

2.2 解决「路径含空格」问题(核心)

Windows 上若 Flutter / SDK 安装在D:\Program Files\...,Hvigor 拼接flutter.bat时会报:

'D:\Program' 不是内部或外部命令

做法:用目录联接(Junction)映射到无空格路径,并统一使用联接路径。

联接路径指向
D:\flutter_ohosD:\Program Files\harmony_flutter\flutter_flutter(示例)
D:\deveco_sdkD:\Program Files\Huawei\DevEco Studio\sdk

用户环境变量:

DEVECO_SDK_HOME=D:\deveco_sdk

PATH 优先使用:D:\flutter_ohos\bin(避免仍指向D:\Program Files\flutter\bin的官方版 Flutter)。

2.3 项目内鸿蒙配置

ohos/local.properties(无空格路径):

flutter.sdk=D:\\flutter_ohos hwsdk.dir=D:\\deveco_sdk

ohos/setup-harmony-env.bat一键设置环境并运行。

set DEVECO_SDK_HOME=D:\deveco_sdk set "PATH=D:\flutter_ohos\bin;...hvigor...;...ohpm...;%PATH%" cd /d %~dp0.. flutter run --release -d 127.0.0.1:5555 REM release 模式
模式命令说明
调试setup-harmony-env.bat支持热重载,可能遇 DevFS 问题
发布setup-harmony-env.bat release推荐;稳定,日志见hilog/ 控制台

2.4 网络权限(module.json5)

ohos/entry/src/main/module.json5中声明:

"requestPermissions": [ { "name": "ohos.permission.INTERNET", ... }, { "name": "ohos.permission.GET_NETWORK_INFO", ... } ]

注意:勿在module下添加"network": { "cleartextTraffic": true }。当前 SDK 的 schema不支持该字段,会导致hvigor校验失败(property name must be valid)。本项目 API 为 HTTPS,无需明文流量配置。


三、构建与运行步骤

3.1 首次 / 大改后建议流程

cd /d E:\fairy\flutter-learn\project\flutter_shop D:\flutter_ohos\bin\flutter clean D:\flutter_ohos\bin\flutter pub get cd ohos setup-harmony-env.bat release

3.2 成功标志

  • 终端:√ Built build\ohos\hap\entry-default-signed.hap
  • 日志:installing hap. bundleName: com.example.flutter_shop
  • 首页日志:

3.3 常用排错命令

D:\flutter_ohos\bin\flutter doctor D:\flutter_ohos\bin\flutter devices

必须配置好鸿蒙环境后才能运行

配置完环境后,运行

flutter create .

模拟器内用浏览器访问外网,确认模拟器本身能上网;电脑端可测 API:

Invoke-WebRequest-Uri"https://meikou-api.itheima.net/home/banner"-UseBasicParsing

四、业务层鸿蒙适配(Dart)

官方shared_preferencespubspec未声明ohos平台,且鸿蒙上不宜强行接入 TPC 的shared_preferences_ohos(见下文构建问题)。因此网络与存储均在Dart 层做了针对性适配。

4.1 入口:HTTPS 全局配置

文件:lib/utils/ohos_http_overrides.dart
调用:lib/main.dartsetupOhosHttpOverrides()

voidmain(){setupOhosHttpOverrides();runApp(getRootWidget());}

作用:

  • Platform.operatingSystem == 'ohos'时注册HttpOverrides
  • 设置连接超时、开发阶段badCertificateCallback(浏览器能开、Flutter 请求失败时常见)

4.2 网络请求:Dio

文件:lib/utils/DioRequest.dart

要点说明
超时connect/send/receive 均为 12s,外层Future.timeout兜底
响应支持MapStringJSON 自动解析
日志[Dio] GET/POST ...[Dio] 200 ...便于模拟器排错

4.3 首页:顺序请求 + 错误展示

文件:lib/pages/Home/home.dart

问题原因方案
一直转圈5 个接口Future.wait并发,鸿蒙 HTTPS 易挂起TargetPlatform.ohos时改为顺序请求
无错误提示请求未结束,catch不执行整页25s超时 + 红色错误条 + 下拉刷新
重复请求 recommend首屏maxScrollExtent == 0触发滚动监听增加_homeDataReady、判断maxScrollExtent > 0

4.4 登录存储:鸿蒙专用文件方案

文件:

  • lib/utils/ohos_login_storage.dart— JSON 写入Directory.systemTemp
  • lib/utils/LoginStorage.dart— 检测鸿蒙后走文件存储,其它平台仍用shared_preferences
staticboolget_useOhosFileStorage=>!kIsWeb&&(defaultTargetPlatform==TargetPlatform.ohos||Platform.operatingSystem=='ohos');

测试账号:13200000001/123456


五、问题与解决方案汇总

5.1 构建与环境

#现象原因解决方案
1DEVECO_SDK_HOME无效未设置或 CMD 用了 PowerShell 语法D:\deveco_sdk联接 + 用户环境变量
2'D:\Program' 不是内部或外部命令Program Files空格导致 Hvigor 截断命令local.propertiesD:\flutter_ohos;必要时改flutter-hvigor-plugin/hvigor_utils.dartcmd /c
3tdesign_flutter编译失败与鸿蒙 Flutter 3.27.5 不兼容移除 TDesign,改用 MaterialIcons
4module.json5schema 失败写了不支持的"network"节点删除network块,仅保留INTERNET权限
5srcPath is not a relative path(Pub 缓存绝对路径)dependency_overrides: shared_preferences_ohos被注入 hvigor移除该 override;登录改用OhosLoginFileStorage
6DevFS / 调试 attach 失败鸿蒙调试链路与 Impeller 等优先release;可关 Impeller(buildinfo.json5

5.2 网络与首页

#现象原因解决方案
7首页永久加载、无数据并发请求挂起 + 证书校验OhosHttpOverrides+ 顺序请求 + 超时与错误 UI
8仅有[Dio] GET200请求未返回同上;确认module.json5INTERNET
9模拟器浏览器能上网 App 不行Flutter 网络栈与浏览器不同证书 Overrides + 勿依赖并发

5.3 登录

#现象原因解决方案
10MissingPluginException ... shared_preferences默认走MethodChannel,鸿蒙无实现OhosLoginFileStorage,不注册shared_preferences_ohos原生模块
11登录 API 200 仍 Toast 报错保存 Token 时插件崩溃同上;接口成功后的失败仅在存储环节

六、依赖与插件策略

6.1 当前pubspec.yaml要点

dependencies:dio:^5.9.2shared_preferences:^2.2.2# 非鸿蒙平台使用carousel_slider:^5.1.2# 已移除 tdesign_flutter

不要为修登录而添加:

# 不推荐 — 会导致 hvigor srcPath 绝对路径错误dependency_overrides:shared_preferences_ohos:git:...

.flutter-plugins-dependencies"ohos": []为健康状态。

6.2 若未来要接入更多原生插件

  1. 优先查 OpenHarmony TPC flutter_packages 是否有*_ohos实现
  2. 插件模块srcPath必须是相对工程 ohos 目录的路径,不能是 Pub 缓存绝对路径
  3. module.json5/ 插件后需flutter clean+ 重装 HAP
  4. 能用纯 Dart 方案(文件、内存)的,优先纯 Dart,减少 Hvigor 模块复杂度

七、关键文件清单

路径作用
ohos/local.propertiesFlutter SDK、DevEco SDK 路径
ohos/setup-harmony-env.bat环境变量 + 运行脚本
ohos/entry/src/main/module.json5权限、Ability
ohos/entry/src/main/ets/plugins/GeneratedPluginRegistrant.ets原生插件注册(当前无第三方插件)
ohos/hvigorconfig.tsinjectNativeModules读取.flutter-plugins-dependencies
lib/main.dartsetupOhosHttpOverrides()
lib/utils/ohos_http_overrides.dart鸿蒙 HTTPS
lib/utils/DioRequest.dart网络封装
lib/pages/Home/home.dart首页顺序加载
lib/utils/ohos_login_storage.dart鸿蒙登录态文件存储
lib/utils/LoginStorage.dart跨平台存储门面

八、经验总结

  1. 鸿蒙 Flutter 是独立工具链:必须用 OHOS 版 Flutter,PATH、local.propertiesDEVECO_SDK_HOME三者一致。
  2. 路径规划先于编码Program Files几乎必然在 Hvigor/脚本层踩坑,联接目录是性价比最高的解法。
  3. 网络:顺序优于并发:首页 5 接口在鸿蒙上顺序调用更稳;日志里看到连续200即正常。
  4. 存储:别假设 shared_preferences 可用MissingPluginException用鸿蒙文件存储即可,避免绝对路径插件模块。
  5. 发布模式优先验证setup-harmony-env.bat release更接近真实安装包行为,利于排除 DevFS 干扰。
  6. 配置改动的生效方式module.json5权限、原生插件、HAR 依赖变更 → 需完整重装,热重载不够。

九、参考链接

  • OpenHarmony TPC flutter_flutter
  • OpenHarmony TPC flutter_packages
  • HarmonyOS 应用权限列表

十、实现效果



http://www.zskr.cn/news/1469384.html

相关文章:

  • PyAutoGUI进阶玩法:结合Pillow实现游戏自动刷图与软件自动化测试实战
  • 终极TikTokenizer指南:如何精准计算AI提示词成本并节省80%费用
  • 2026国际EMBA世界排名榜单解析|顶尖国际化EMBA项目优势对比
  • VoidZero 加入 Cloudflare,Vite 发展获更多资源且核心特质不变
  • 特斯拉电池系统深度解析:从18650电芯到BMS核心技术
  • 低空飞行器降噪气动人工智能AI反向设计系统软件平台设计方案
  • 为什么92%的固收团队AI工具使用率低于17%?——来自中金、海通、易方达联合调研的未公开数据解密
  • MATLAB包络谱快速出图工具:自带示例数据,Excel信号一键导入
  • 2026年6月重庆4天3晚导游推荐TOP3|经典线路全覆盖解析 - 随峰国旅
  • 2026论文写作工具红黑榜:一键生成论文工具怎么选?实测才敢推!
  • 2026最新:惠州除甲醛公司 5 大排名|基于全民票选与真实口碑|高温高湿气候适配性专项测评 - 专注室内空气检测治理
  • 2025国际EMBA FT排名解析:顶尖中英双语及全球化EMBA项目盘点
  • Zustand Bundle 优化:提升首屏加载速度的动态拆包策略
  • 在Visual Studio 2022里玩转MQTT:手把手教你配置PAHO-MQTT C++客户端开发环境
  • 大型模胚加工找哪个工厂放心靠谱呢 - 昌晖模胚
  • 命令行音频静音段切除工具:Python脚本支持自定义阈值,批量清理WAV文件中的空白停顿
  • 除了Python,你的GCC、JDK也能用alternatives管理:一个命令搞定Linux多版本开发环境
  • Python 爬虫逆向实战 4:JS 混淆 AST 解混淆 + webpack 打包代码拆包还原
  • 12MHz晶振51单片机实现精准9600波特率串口通信方案
  • VSCode写C++竞赛代码总报错?可能是你的‘万能头’bits/stdc++.h没放对地方
  • 2026年 黑豆淘平台/电商零售/网店推荐榜单:高转化率与新店扶持政策深度解析及优质服务商盘点 - 品牌企业推荐师(官方)
  • 成都角钢经销商推荐|型钢厂家|四川盛世钢联青白江最新现货批发 - 四川盛世钢联营销中心
  • 基于hal库的ETH外设完整指南
  • 全球首次WEB4 KYC活体核验已正式开启
  • 2026苏州姑苏平江沧浪三区卫生间阳台飘窗屋顶漏水怎么修?泰源防水免砸砖上榜.doc - 资讯焦点
  • linux下一步学习内容
  • 基于BQ2057的USB锂电池充电电路设计:从原理到实践
  • 零基础入行 IT 运维 / 网络,华为、思科、红帽先考哪个?
  • STM32C8T6 硬件设计完全指南:元器件选型、EMI 屏蔽与防护从入门到精通
  • 2026年职称评审机构如何选择 重庆正规申报机构口碑推荐指南 - 资讯焦点