HarmonyOS鸿蒙Next中flutter开发的几个问题

HarmonyOS鸿蒙Next中flutter开发的几个问题 1、flutter侧启动入口非main.dart,DevEco运行时这个怎么指定?我看flutter-hvigor-plugin里有可以获取FLUTTER_TARGET的配置

2、androidstudio运行flutter设置的一些–dart-define=参数,DevEco运行时怎么设置这些参数?

7 回复

尊敬的开发者,您好,flutter目前官方社区的规则默认入口是main.dart,您可以通过

flutter run --target lib/main_dev.dart

指定运行入口,DevEco运行时无法指定入口非main.dart。

此外DevEco目前是无法设置运行时传参,但是可以通过

flutter run --dart-define xxxx=true 

运行传参,或者使用

flutter build hap --release --dart-define xxxx=true

打成hap包之后通过

hdc insatll entry-default-signed.hap

命令安装到手机上。

如果您还是想要实现在DevEco运行时设置参数,麻烦您提供如下信息:

请问您是在什么样的业务场景中使用该能力,交互流程是怎样的,在哪一个环节遇到了问题?方便说明能力不满足可能带来的影响:什么时间用到?是否高频?有无三方库可以做到?若提供该能力,是否会造成大工作量返工?请您注意提供的内容不要包含您或第三方的非公开信息,如给您带来不便,敬请谅解。

更多关于HarmonyOS鸿蒙Next中flutter开发的几个问题的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


针对使用 Flutter 开发鸿蒙应用(通常指通过 flutter_harmonyos_plugin 或类似的桥接方案,在鸿蒙容器内运行 Flutter 引擎)时遇到的这两个 DevEco Studio 配置问题,解答如下:

如何指定非 main.dart 的入口文件

在 DevEco Studio 中运行 Flutter 模块时,默认的入口确实是 main.dart。如果要指定自定义入口(例如 main_dev.dartmain_harmony.dart),可以通过以下两种方式配置:

修改运行配置 (Run Configuration)

这是最直观的方法:

  1. 点击 DevEco Studio 顶部工具栏的 Run > Edit Configurations…
  2. 在左侧列表中选择你的 Flutter 运行配置(通常在 Flutter 分类下)。
  3. 在右侧的设置面板中,找到 Dart entrypoint(Dart 入口点)选项。
  4. 默认情况下它可能是 lib/main.dart,将其修改为你需要的入口文件路径(例如 lib/main_dev.dart)。
  5. 点击 Apply 保存。

通过 FLUTTER_TARGET 环境变量

正如你在 flutter-hvigor-plugin 中看到的,构建脚本通常会读取 FLUTTER_TARGET 变量。你也可以在运行配置的环境变量中设置它:

  1. 同样在 Edit Configurations 界面。
  2. 找到 Environment variables(环境变量)一栏。
  3. 添加一个新的变量:FLUTTER_TARGET,值为你的入口文件路径(例如 lib/main_dev.dart)。

如何设置 --dart-define 参数

在 Android Studio 中,我们习惯在 “Additional arguments” 中直接追加 --dart-define=KEY=VALUE。在 DevEco Studio 中,虽然界面略有不同,但同样支持:

在运行配置中设置 (推荐)

DevEco Studio 的 Flutter 插件配置界面与 Android Studio 基本一致:

  1. 打开 Run > Edit Configurations…
  2. 选择你的 Flutter 运行配置。
  3. 找到 Additional arguments(附加参数)输入框(通常在 “Dart entrypoint” 下方)。
  4. 在这里直接输入你的参数,格式与 Android Studio 完全一致:
    --dart-define=ENV=dev --dart-define=API_URL=https://api.example.com
    
  5. 点击 Apply 保存。

通过 hvigor 构建脚本配置 (高级)

如果你是通过鸿蒙的 hvigor 构建系统来托管 Flutter 构建流程,可能需要修改 build-profile.json5 或相关的 hvigorfile.ts。 在 hvigorfile.ts 中,通常会调用 Flutter 的构建命令。你可以在这里手动拼接参数:

// 伪代码示例,具体取决于插件版本
export default {
  build: async () => {
    // 在执行 flutter build 命令时追加参数
    const dartDefines = ['--dart-define=ENV=dev'];
    // 调用构建逻辑...
  }
}

但通常情况下,直接使用第一种方法(运行配置)是最快且最有效的。

总结建议

由于 Flutter 在鸿蒙上的支持目前主要依赖于社区插件(如 flutter_harmonyos_plugin)或特定的桥接层,DevEco Studio 的原生 UI 支持可能不如 Android Studio 完善。

如果上述 UI 配置无效,最稳妥的“兜底”方案是:直接使用命令行构建

# 指定入口和参数构建
flutter build hap --target=lib/main_dev.dart --dart-define=ENV=dev

然后将生成的 .hap 包手动安装到模拟器或真机上调试。

这两个点在鸿蒙侧本质上都落在一句话上:DevEco 运行/打包 Flutter(HarmonyOS Next)时,是通过 hvigor 调用 flutter build/assemble 的,所以你要把“入口文件”和“–dart-define 参数”从 DevEco/hvigor 传给 flutter-hvigor-plugin,而不是像 Android Studio 那样在 Run Configuration 里直接填 flutter run ...

下面给你可落地的做法(按常见 flutter-ohos 工程结构)。


1)Flutter 入口不是 main.dart,DevEco 怎么指定?

Flutter 标准是 --target/-t lib/xxx.dart,在鸿蒙这边通常由 **flutter-hvigor-plugin 读取 FLUTTER_TARGET(或同类项目属性)**再传给 Flutter 工具链。

方案 A:用环境变量/工程属性(最省改代码)

在 DevEco 的运行配置里(Run/Debug Configuration / hvigor 任务配置里),加环境变量或项目属性:

  • FLUTTER_TARGET=lib/your_entry.dart

然后重新 Run/Build。

你提到插件里能获取 FLUTTER_TARGET,那这条就是最对口的方式。

方案 B:写死到 hvigorfile(团队更稳定)

找到 entry/hvigorfile.ts(或模块下的 hvigorfile),在调用 flutter-hvigor-plugin 的地方,把 target 固定住(具体字段名看你插件版本,常见是传 buildArgs/target 之类)。
优点:不依赖每个人 DevEco 本地配置;缺点:不同环境要自己做分支/变体。


2)Android Studio 里配置的 --dart-define,DevEco 怎么设置?

--dart-define 依旧是 Flutter 那套机制,关键是:让 hvigor 在执行 flutter build 时把这些参数带上

方案 A:通过环境变量把 “flutter build 参数”传进去(最常用)

很多 flutter-hvigor-plugin 会提供类似:

  • FLUTTER_BUILD_ARGS
  • EXTRA_FLUTTER_ARGS
  • 或直接读取 DART_DEFINES(Flutter 官方环境变量,Base64 编码)

你可以先在插件源码里搜一下它到底读取哪个(你已经定位到能读 FLUTTER_TARGET 了,同文件里一般也能找到 build args 的入口)。

然后在 DevEco 运行配置里加,例如(举例):

  • FLUTTER_BUILD_ARGS=--dart-define=ENV=prod --dart-define=API_BASE=https://xx

代码里照旧用:

const env = String.fromEnvironment('ENV');

方案 B:用 Flutter 官方 DART_DEFINES(有些插件会直接透传)

Flutter 会把 --dart-define 转成 DART_DEFINES(Base64),如果你的插件是直接调用 flutter tool 并透传环境变量,那也可以走这个。
但它编码比较麻烦,所以我更建议用方案 A(直接传 --dart-define=... 字符串)。


建议:把不同环境做成“DevEco 的不同 Run 配置”

例如:

  • Debug(dev):FLUTTER_TARGET=lib/main_dev.dart + FLUTTER_BUILD_ARGS=--dart-define=ENV=dev
  • Release(prod):FLUTTER_TARGET=lib/main.dart + FLUTTER_BUILD_ARGS=--dart-define=ENV=prod

这样不用改代码就能切环境。

  1. 指定非main.dart入口:在 flutter-hvigor-plugin 配置中,通过 FLUTTER_TARGET 参数指定目标文件路径,如 lib/entry.dart ,即可替代默认入口。
  2. 设置–dart-define参数:在hvigor构建脚本中,通过 flutterBuild 任务的 dartDefine 配置项传入键值对,即可在DevEco中传递编译参数。

你好,都是在鸿蒙工程 ohos/hvigorconfig.ts 中配置:

// ohos/hvigorconfig.ts
import { flutterHvigorPlugin } from 'flutter-hvigor-plugin';

export default {
  flutter: {
    // 1. 指定入口
    target: 'lib/app_entry.dart',
    // 2. 传递环境变量
    dartDefine: {
      APP_ENV: 'dev',
      API_HOST: 'https://api-dev.example.com',
      DEBUG_MODE: 'true'
    },
    // 可选:指定 Flutter 编译模式(debug/release/profile)
    // buildMode: 'debug',
    // 可选:额外传递 Flutter 命令行参数
    // extraArgs: ['--verbose', '--no-sound-null-safety']
  },
  plugins: [flutterHvigorPlugin()]
};

配置后,直接点击 DevEco 的运行或构建,hvigor 会自动将 --target=lib/app_entry.dart 传给 Flutter 编译命令。

注意:

  1. 文件路径:ohos/hvigorconfig.ts 必须在鸿蒙工程根目录(与 hvigorfile.ts 同级)
  2. 执行 flutter clean 后重新运行
  3. 确保 flutter-hvigor-plugin 已正确安装(ohpm install)

鸿蒙Next上Flutter开发需使用华为官方适配的Flutter SDK(基于OpenHarmony分支)。配置时在项目ohos目录下修改build-profile.json5,并确保已安装DevEco Studio及Flutter插件。组件仅支持ArkUI兼容的Widget,原生插件需通过Platform Channel适配OHOS接口。网络、存储等基本能力可用,但部分第三方插件存在兼容限制。调试需在真机或模拟器上运行,日志可通过DevEco的Log工具查看。

在 HarmonyOS Next 中,可通过修改 entry 模块的 build-profile.json5 实现:

  1. 指定非 main.dart 入口
    build-profile.json5 顶层或对应 product 块内添加:

    "flutter": {
      "target": "lib/your_entry.dart"
    }
    

    构建时会自动读取并将其作为 FLUTTER_TARGET 传递给引擎。

  2. 设置 dart-define 参数
    build-profile.json5buildOption 中添加:

    "dartDefineArgs": ["KEY1=value1", "KEY2=value2"]
    

    多个参数依次追加即可,最终会原样传递到 dart 编译环节,效果等同于 --dart-define

回到顶部