Flutter 插件 OpenHarmony 适配过程问题汇总

欢迎大家加入开源鸿蒙跨平台开发者社区

在将 flutter_exit_app 插件适配到 OpenHarmony 平台的过程中,我遇到了不少坑。这篇文章记录了这些问题及解决方案,供大家参考。


一、BusinessError 导入错误

这是最容易踩的坑之一。

错误信息

ERROR: ArkTS:ERROR File: FlutterExitAppPlugin.ets:11:18
ERROR Code: 10311006 ArkTS: ERROR
Error Message: 'BusinessError' is not exported from Kit '@kit.AbilityKit'.

原因

BusinessError 类型并不在 @kit.AbilityKit 中,而是在 @kit.BasicServicesKit

解决方案

// ❌ 错误写法
import { common, BusinessError } from '@kit.AbilityKit';
​
// ✅ 正确写法
import { common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

经验总结

OpenHarmony 的类型分布在不同的 Kit 中,需要查文档确认:

类型/接口 所属 Kit
common.UIAbilityContext @kit.AbilityKit
BusinessError @kit.BasicServicesKit

二、UIAbilityContext 获取失败

错误信息

CONTEXT_NULL: UIContext is null

原因

Flutter 插件中,getApplicationContext() 返回的是 common.Context,而不是 UIAbilityContext。只有后者才有 terminateSelf() 方法。

解决方案

必须实现 AbilityAware 接口:

export default class FlutterExitAppPlugin implements FlutterPlugin, MethodCallHandler, AbilityAware {
  private uiContext: common.UIAbilityContext | null = null;
​
  // 实现 AbilityAware 接口
  onAttachedToAbility(binding: AbilityPluginBinding): void {
    this.uiContext = binding.getAbility().context;
  }
​
  onDetachedFromAbility(): void {
    this.uiContext = null;
  }
}

经验总结

  • getApplicationContext()common.Context(不能调用 terminateSelf()

  • AbilityAware.onAttachedToAbility()UIAbilityContext(可以调用 terminateSelf()


三、MethodChannel 方法未响应

原因

onMethodCall 中没有正确处理方法名。

解决方案

onMethodCall(call: MethodCall, result: MethodResult): void {
  if (call.method == "getPlatformVersion") {
    result.success("OpenHarmony ^ ^ ")
  } else if (call.method == "com.laoitdev.exit.app") {
    this.handleExitApp(result);
  } else {
    result.notImplemented()
  }
}

注意

  • 方法名必须与 Dart 端完全一致

  • 注意区分 result.success()result.error()result.notImplemented()


四、flutter build hap 失败

问题一:ohpm install failed

项目缺少 @ohos/flutter_ohos 的本地路径配置。

解决方案

oh-package.json5 中添加 overrides

{
  "overrides": {
    "@ohos/flutter_ohos": "file:D:/flutter-oh/flutter_flutter/bin/cache/artifacts/engine/ohos-arm64/flutter.har"
  }
}

问题二:Windows 批处理递归超限

******  B A T C H   R E C U R S I O N  exceeds STACK limits ******

解决方案

使用 DevEco Studio 自带的 hvigor 工具:

cd example/ohos
"D:/Program Files/Huawei/DevEco Studio/tools/hvigor/bin/hvigorw.bat" assembleHap -p product=default -p buildMode=debug --no-daemon

五、设备存储空间不足

错误信息

Install Failed: error: failed to install bundle.
code: 9568288
error: install failed due to insufficient disk memory.

解决方案

  1. 进入设备 设置 → 存储 清理缓存

  2. 卸载不常用的应用

  3. 重启设备(作用有限)


六、编译警告过多

警告信息

WARN: ArkTS:WARN File: xxx.ets
Function may throw exceptions. Special handling is required.

说明

这类警告大多来自 @ohos/flutter_ohos 依赖库,不是我们代码的问题,可以忽略。如果是自己的代码,加上 try-catch 即可。


七、快速排查清单

问题类型 检查项
导入错误 确认类型从正确的 Kit 导入
安装失败 检查设备存储空间
Context 为空 确认实现了 AbilityAware 接口
方法无响应 检查方法名是否匹配
编译失败 查看详细错误日志

总结

适配 OpenHarmony 平台,最关键的几点:

  1. Kit 导入路径 - 不同类型分布在不同的 Kit 中,别导错

  2. Context 获取 - 必须通过 AbilityAware 接口获取 UIAbilityContext

  3. 方法匹配 - 确保 MethodChannel 方法名与 Dart 端完全一致

  4. 构建工具 - Windows 下使用 DevEco 自带的 hvigor

遇到问题时,仔细看错误日志,通常都能找到解决方案。


参考资源

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐