HarmonyOS鸿蒙Next中flutter容器使用arkweb渲染

HarmonyOS鸿蒙Next中flutter容器使用arkweb渲染 flutter容器使用arkweb渲染的页面,业务没有相关逻辑,鼠标滚轮滑动会异常触发web组件的.onTouch事件(触发了down和move,但缺少up)。

5 回复

开发者您好,若您是指设置了onTouch事件,但是鼠标滚轮滑动意外触发该事件,则可以在您的onTouch事件中添加前置条件为 event.sourceTool === SourceTool.Finger 限制输入源为手指输入才能触发相关事件。

示例代码如下:

@Entry
@Component
struct TouchExample {
  @State text: string = '';
  @State eventType: string = '';

  build() {
    Column() {
      Button('Touch').height(40).width(100)
        .onTouch((event?: TouchEvent) => {
          if (event && event.sourceTool === SourceTool.Finger) {
            if (event.type === TouchType.Down) {
              this.eventType = 'Down';
            }
            if (event.type === TouchType.Up) {
              this.eventType = 'Up';
            }
            if (event.type === TouchType.Move) {
              this.eventType = 'Move';
            }
            if (event.type === TouchType.Cancel) {
              this.eventType = 'Cancel';
            }
            if (event.touches) {
              this.text = 'TouchType:' + this.eventType
                + '\nDistance between touch point and touch element:'
                + '\n  x: ' + event.touches[0].x + '\n  y: ' + event.touches[0].y
                + '\n  width: ' + event.touches[0].width + '\n  height: ' + event.touches[0].height
                + '\n  pressedTime: ' + event.touches[0].pressedTime
                + '\n  pressure: ' + event.touches[0].pressure
                + '\nComponent globalPos:'
                + '\n  x: ' + event.target.area.globalPosition.x + '\n  y: ' + event.target.area.globalPosition.y
                + '\n  width: ' + event.target.area.width + '\n  height: ' + event.target.area.height
                + '\ntargetDisplayId: ' + event.targetDisplayId;
            }
          }
        })
      Text(this.text)
    }.width('100%').padding(30)
  }
}

若是不能解决您的问题,麻烦请提供以下信息:

1.复现代码(如:最小复现demo)

2.版本信息(如:开发工具、手机系统版本信息)

更多关于HarmonyOS鸿蒙Next中flutter容器使用arkweb渲染的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


这个现象更像是鼠标滚轮输入被 Flutter 容器/ArkWeb 适配层映射到了触摸链路,但滚轮本身并不是完整的 touch 手势,所以只看到 down/move、没有 up。业务上不要依赖 Web 的 touchend 去收尾滚轮交互,建议分两层处理:Flutter 侧优先拦截 PointerSignalEvent/滚轮滚动,不把它当普通触摸;Web 页面里同时监听 wheel/scroll,用节流后的滚动结束逻辑兜底。如果同一页面在纯 ArkWeb 或纯 Flutter WebView 中正常、只在 Flutter 容器嵌 ArkWeb 时异常,建议整理一个最小 demo,重点反馈“滚轮触发 touch 但缺少 up”的输入事件兼容问题。

很好的想法

在HarmonyOS Next中,Flutter容器通过平台通道调用ArkWeb组件实现Web渲染。开发时需在Flutter项目中集成鸿蒙化插件,替换默认WebView为ArkWeb。ArkWeb支持Web标准的API,通过@ohos.web.webview接口与Flutter交互。

这是由于 ArkWeb 组件默认会将鼠标事件模拟为触摸事件,当使用鼠标滚轮时,被错误地转换成 Touch 事件并触发了 onTouch 回调,而滚轮操作本身没有对应的“抬起”动作,因此只会触发 downmove,缺少 up。该行为与业务逻辑无关,属于组件默认特性。

解决方法:关闭鼠标事件模拟触摸的功能即可。在 Flutter 使用的 ArkWeb 控制器中,调用 setMouseEventSimulateTouch(false) 或设置对应属性,使鼠标滚轮不再被当成触摸事件处理。

回到顶部