HarmonyOS鸿蒙Next Flutter插件fluttertpc_aliyun_log_dart_sdk LogCallback实现问题

HarmonyOS鸿蒙Next Flutter插件fluttertpc_aliyun_log_dart_sdk LogCallback实现问题 【问题描述】:Flutter插件fluttertpc_aliyun_log_dart_sdk实现问题br_3.27分支LogCallback实现问题

【问题现象】:报错截图附结尾

【版本信息】:HarmonyOS NEXT; Flutter ohos; fluttertpc_aliyun_log_dart_sdk -b br_3.27

【复现代码】:https://gitcode.com/CPF-Flutter/fluttertpc_aliyun_log_dart_sdk/blob/br_3.27/ohos/src/main/ets/components/plugin/AliyunLogDartSdkPlugin.ets

【尝试解决方案】:暂时本地修改使用

cke_8256.png

cke_9398.png


更多关于HarmonyOS鸿蒙Next Flutter插件fluttertpc_aliyun_log_dart_sdk LogCallback实现问题的实战教程也可以访问 https://www.itying.com/category-92-b0.html

8 回复

尊敬的开发者,您好!感谢您的反馈,问题正在加速处理中,还请关注后续版本,感谢您的理解与支持。

更多关于HarmonyOS鸿蒙Next Flutter插件fluttertpc_aliyun_log_dart_sdk LogCallback实现问题的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


这个问题建议先不要按“Flutter 调用失败”看,而是按 ArkTS 接口实现不匹配看。报错如果指向 LogCallback,关键是你当前安装的 @aliyunsls/producer 版本里,LogCallback 到底声明的是方法、属性函数,还是字段名已经变化。

处理顺序:

  1. 打开 oh_modules/@aliyunsls/producer 里的声明文件,确认 LogCallback 的真实结构。
  2. 如果它要求的是属性函数,就不要写成普通 class method,而是写成类似 onLogCallback = (…) => { … }。
  3. 如果 br_3.27 分支示例和当前依赖版本不一致,先锁定 package 版本;不要让 ohpm/npm 自动升到接口已变化的版本。
  4. 插件桥接层只负责把 native 回调转成 MethodChannel/EventChannel 事件,回调参数里避免直接传复杂 native 对象,先转成普通 JSON 结构更稳。

希望HarmonyOS能加强与其他品牌设备的兼容性,让更多人受益。

根据你的报错截图:
ERROR: ARKTS Compiler Error: ... Property 'onLogCallback' is missing in type 'AilyunLogDartSdkPlugin' but required in type 'LogCallback'

这是因为你的 AliyunLogDartSdkPlugin 类(在 ohos/src/main/ets/components/plugin/AliyunLogDartSdkPlugin.ets)实现了 LogCallback 接口,但是缺少了 onLogCallback 方法的实现

在你的插件代码中,LogCallback 这个接口来自 @aliyunsls/producer。在 ArkTS/TS 中,当你声明一个类去实现某个接口时,必须把接口里定义的所有属性/方法都在类里写出来。因为 LogCallback 要求必须包含 onLogCallback 用于处理日志发送成功后的回调。

AliyunLogDartSdkPlugin.ets 这个文件中,补充 onLogCallback 方法。同时,为了让日志真正对 Flutter 端有意义,我还建议你补充 onError 方法(用于处理日志发送失败),并通过 MethodChannel 把日志发送回 Flutter。

如果 @aliyunsls/producer 这个库的 LogCallback 接口里只定义了 onLogCallback,没有 onError,你可以只保留 onLogCallback 的代码,把 onError 删掉即可。但通常日志 SDK 都包含这两个回调,建议都加上,方便在 Flutter 端知道日志上传是否真的成功。

这个问题本质上是:

Flutter HarmonyOS 分支(br_3.27)对 ArkTS 的 interface / callback 类型兼容性存在问题,不是你代码逻辑写错。

从你截图里的报错可以看到关键错误:

Property 'onLogCallback' does not exist in type 'LogCallback'

以及:

Object literal may only specify known properties

而你代码里:

import { AliyunLog, LogCallback } from "@aliyunsls/producer"

然后:

class AliyunLogSdkPlugin implements LogCallback

再实现:

onLogCallback(...)

这里的问题在于:

当前 HarmonyOS Flutter 3.27 分支的 ArkTS 编译器,对 interface callback 的兼容和 TS 标准行为并不完全一致。

尤其:

  • 三方 SDK 的 d.ts
  • ets 的 interface
  • flutter bridge
  • 泛型 callback

会经常出现这种:

“接口存在但编译器识别不到方法”的问题。

这其实是:

ArkTS 静态检查 + OpenHarmony Flutter bridge 的类型推导缺陷。

不是你 LogCallback 真不存在。

而且你已经验证了:

本地删掉 implements 后能编译。

这也进一步证明:

问题在类型系统,不在业务逻辑。

你现在正确的处理方式其实有三种。

第一种(推荐):

不要 implements LogCallback。

直接使用对象回调。

改成:

this.aliyunLog.setLogCallback({
  onLogCallback: (
    logStore: string,
    code: number,
    logBytes: number,
    compressedBytes: number,
    errorMessage: string
  ) => {

  }
})

或者:

this.aliyunLog.setLogCallback(
  (logStore, code, logBytes, compressedBytes, errorMessage) => {

  }
)

这是目前 HarmonyOS Flutter 插件里最稳定的方式。

很多 Harmony 插件最终都绕回 function callback,而不是 interface implements。

第二种:

强制 any。

例如:

class AliyunLogSdkPlugin implements any

或者:

const callback: any = {
  onLogCallback: () => {}
}

虽然丑,但 HarmonyOS Flutter 生态里大量插件都这么干。

尤其:

  • Flutter bridge
  • CAPI
  • NAPI
  • ArkTS 泛型

经常只能 any 绕过去。

第三种:

修改 SDK typings。

也就是去改:

@aliyunsls/producer

里的:

export interface LogCallback

定义。

很多 Harmony SDK 的 d.ts 实际和真实实现不同步。

你截图里就很像:

SDK 实现有 onLogCallback

但类型声明没导出来。

这是 Harmony 三方库里非常常见的问题。

所以:

你现在的“临时本地修改”其实已经是正确方向。

这个问题本质不是 Flutter 问题,而是:

ArkTS + 三方 typings 的兼容问题。

另外还有一个重要信息:

HarmonyOS Flutter br_3.27 对 TypeScript 特性的支持其实是不完整的。

尤其:

  • interface implements
  • 泛型约束
  • declaration merge
  • callback typing

经常有问题。

所以很多 Android/iOS 正常的 Flutter Plugin:

到了 HarmonyOS:

必须:

  • 降级 TS 写法
  • 去 interface
  • 去泛型
  • 大量 any
  • function callback 化

否则编译器会炸。

这个现象在 Harmony Flutter 生态非常普遍。

所以最终建议:

不要继续纠结 implements LogCallback。

直接:

  • 去掉 implements
  • 使用 function callback
  • 或 any

这是当前 Harmony Flutter 插件开发的现实方案。

更换插件版本能不能解决。

LogCallback在HarmonyOS Next Flutter插件中需通过Dart层实现,使用Function类型或Stream监听日志事件。插件内部通过Channel桥接鸿蒙原生日志输出,回调参数需符合LogCallback签名(如void callback(String log, int level)),并在插件初始化时注册。确保回调在UI线程执行需使用EventChannel

该问题的根因是 AliCloud Log SDK 的 LogCallback 被触发时处于子线程,而 HarmonyOS 中 Flutter 的 MethodChannel 调用必须在 UI 线程(主线程)执行,否则会引发异常或回调无响应。你的本地修改思路是对的。

解决方案示例:

import { UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';

// 在回调中通过 context 将任务抛到主线程
this.client.setLogCallback((level: number, tag: string, msg: string) => {
  const ctx = getContext(this) as common.UIAbilityContext;
  ctx.getWindow().then((win: window.Window) => {
    win.getUIContext().getHostContext()?.postTask(() => {
      this.channel?.invokeMethod('onLog', {
        'level': level,
        'tag': tag,
        'msg': msg
      });
    }, 0);
  });
});

若无 UIAbilityContext,可改用 ApplicationContext@ohos.taskpool 取主线程执行,但直接 postTask 最简洁可靠。修复后回调即可正常传递到 Dart 层。

回到顶部