Skip to content

附录B:常见问题

环境配置问题

flutter 命令找不到

  1. 确认 flutter/bin 已加入 PATH
  2. 执行 source ~/.bashrc 或重新打开终端
  3. 检查路径是否包含中文或空格

Gradle 下载依赖失败(403 错误)

确保已配置 ~/.gradle/init.gradle 文件,使用国内镜像。详见 环境安装 章节。

鸿蒙设备无法识别

  1. 确认 HDC_HOME 环境变量已正确配置
  2. 确认设备已开启开发者模式和 USB 调试
  3. 运行 hdc list targets 检查设备是否连接

flutter doctor 提示 OpenHarmony toolchain 不可用

  1. 确认 DEVECO_SDK_HOME 指向正确的 SDK 目录
  2. 确认已运行 flutter config --ohos-sdk $DEVECO_SDK_HOME
  3. 确认已运行 flutter precache --ohos

DevEco Studio 打开 ohos 目录报错 flutter-hvigor-plugin 找不到

在 Windows 上克隆 flutter-ohos 的 Git 仓库后,用 DevEco Studio 打开 ohos 目录时,可能会遇到以下报错:

hvigor ERROR: Error Cannot find module 'flutter-hvigor-plugin'
Require stack:
- D:\code-demo\flutter\demo\riverpod\ohos\hvigorconfig.ts

原因:hvigor 查找模块的位置是它自己的缓存工作区 ~/.hvigor/project_caches/<hash>/workspace/node_modules/,而非项目目录下的 node_modules。由于 hvigor-config.json5dependencies 为空,hvigor 不会在缓存工作区安装 flutter-hvigor-plugin,导致找不到模块。

解决方法:在 ohos/hvigor/hvigor-config.json5dependencies 中添加 flutter-hvigor-plugin,指向 Flutter SDK 中的插件路径:

json5
{
  "modelVersion": "5.1.0",
  "dependencies": {
    "flutter-hvigor-plugin": "file:<Flutter SDK路径>/packages/flutter_tools/hvigor"
  }
}

例如:

json5
{
  "modelVersion": "5.1.0",
  "dependencies": {
    "flutter-hvigor-plugin": "file:D:\\code-demo\\flutter\\version\\FlutterOH\\3.35.8-ohos-0.0.3\\packages\\flutter_tools\\hvigor"
  }
}

请将 <Flutter SDK路径> 替换为你实际的 Flutter 鸿蒙版 SDK 路径,可通过 flutter --version 确认。修改后重新用 DevEco Studio 打开项目即可。

两个 Flutter 版本冲突

两种方案使用不同的 SDK 目录,只要 PATH 中只包含一个版本的路径,就不会冲突。使用切换脚本来管理。


路径问题

路径中包含中文或空格

Flutter SDK、项目目录、Android SDK 的路径中不能包含中文或空格,否则会导致各种奇怪的错误。

bash
# ❌ 错误示例
C:\我的开发\flutter
C:\Program Files\flutter
/Users/用户名/我的项目/

# ✅ 正确示例
C:\src\flutter
C:\Users\username\projects\my_app

长路径问题(Windows)

Windows 有 260 字符路径长度限制。如果项目路径太深,可能导致构建失败。建议将项目放在浅层目录。


开发问题

热重载不生效

  • 修改了 pubspec.yaml 后需要重新 flutter pub get
  • 修改了 main() 函数需要热重启(按 R),热重载(按 r)不够
  • 修改了全局变量或静态变量需要热重启

RenderFlex 溢出

最常见的新手错误,Column/Row 中内容超出可用空间:

dart
// ❌ 溢出
Column(
  children: [
    VeryTallWidget(),  // 太高了,超出屏幕
  ],
)

// ✅ 解决:用 Expanded 或 SingleChildScrollView
Column(
  children: [
    Expanded(child: VeryTallWidget()),  // 限制在剩余空间
  ],
)

// 或者
SingleChildScrollView(
  child: Column(
    children: [VeryTallWidget()],
  ),
)

setState 后 UI 没更新

  • 检查是否忘记了 notifyListeners()(使用 Provider 时)
  • 检查是否在异步操作后没有检查 mounted
  • 检查 ref.watch / ref.read 是否用对了(Riverpod 场景)

网络请求失败

  • 检查网络权限是否已声明
  • Android 9+ 默认不允许 HTTP 请求,需在 AndroidManifest.xml 中配置 android:usesCleartextTraffic="true" 或使用 HTTPS
  • iOS 需在 Info.plist 中配置 NSAppTransportSecurity
  • 检查国内镜像是否配置正确

图片不显示

  • 检查 pubspec.yaml 中是否声明了 assets
  • 检查图片路径是否正确(区分大小写)
  • 网络图片检查 URL 和网络权限

iOS 构建失败

  • 确认在 macOS 上操作
  • 确认 Xcode 和 CocoaPods 已安装
  • 运行 cd ios && pod install && cd ..

包管理问题

pub get 失败

  1. 检查 PUB_HOSTED_URLFLUTTER_STORAGE_BASE_URL 是否配置
  2. 执行 source ~/.bashrc 使环境变量生效
  3. 删除 pubspec.lock 后重试
  4. 清理缓存:flutter pub cache clean

包版本冲突

bash
# 查看依赖树
flutter pub deps

# 查看过期依赖
flutter pub outdated

# 升级依赖
flutter pub upgrade

# 强制获取
flutter pub get --no-example

构建问题

Android 构建失败

  1. 检查 android/app/build.gradle 中的 SDK 版本配置
  2. 检查签名配置是否正确
  3. 运行 flutter clean 后重新构建
  4. 检查 android/ 目录下的 build.gradle 是否配置了镜像

iOS 构建失败

  1. ios/ 目录运行 pod install
  2. 清理 Xcode 缓存:Xcode → Window → Organizer → Projects → Delete Derived Data
  3. 检查签名和 Provisioning Profile

构建包体积过大

  1. 使用 --split-debug-info 分离调试信息
  2. 使用 --obfuscate 代码混淆
  3. 使用 --tree-shake-icons 移除未使用的图标
  4. 检查是否引入了过大的资源文件
bash
flutter build apk --split-debug-info=/<project-name>/debug_info --obfuscate

调试技巧

查看日志

bash
# 实时查看日志
flutter logs

# 在代码中打印
debugPrint('调试信息');  // print 更安全

检查 Widget 树

在 DevTools 中使用 Flutter Inspector 可视化查看 Widget 树和渲染信息。

性能分析

dart
// 在 MaterialApp 中开启
showPerformanceOverlay: true,
debugShowCheckedModeBanner: false,

获取帮助

基于 Flutter 官方文档整理