Flutter for OpenHarmony:web 拥抱 Web 标准的桥梁(Wasm GC 与 DOM 互操作) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:web 拥抱 Web 标准的桥梁(Wasm GC 与 DOM 互操作) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net

请添加图片描述

前言

随着 Flutter 3.x 全面拥抱 Wasm(WebAssembly),Dart 团队推出了全新的 package:web 来取代老旧的 dart:html
package:web 是基于最新的 JS Interop 机制构建的,它不仅性能更好,而且兼容 Wasm GC 标准。

虽然这个库通过名字看是为 “Web” 平台的,但对于 OpenHarmony 开发者来说,了解它有着特殊的意义:

  1. 混合开发:鸿蒙原生支持 ArkWeb (WebView),在 Flutter 中通过 JS互操作与 Web 页面交互是常见需求。
  2. 架构演进:理解 package:web 的设计有助于理解 Dart 如何与宿主环境(无论是 Browser 还是 Embedder)进行高效通信。

(注:本库主要用于 Flutter Web 目标平台。在鸿蒙 App 原生端,通常使用 flutter_inappwebviewjs 库进行 JS 交互。但如果你的鸿蒙应用采用了“Flutter Web 运行在鸿蒙 WebView 中”的架构,本库就是核心)。

一、核心原理

package:web 不再封装很重的 Dart 对象,而是直接将 Dart 类型映射到 JS 对象(Zero-cost interop)。

@JS() Annotation

Wasm / JS

Dart Code

JS Interop Layer

浏览器 DOM / JS Context

二、OpenHarmony 适配说明

场景一:Flutter App 编译为 HAP (原生)
此时 package:web不可用,因为底层没有 V8/SpiderMonkey 引擎环境。你应该使用 plugin 机制与 ArkTS 通信。

场景二:Flutter Web 运行在鸿蒙浏览器/WebView
此时 package:web完全可用,且是官方推荐方案。你可以用它来调用鸿蒙浏览器暴露给 JS 的特殊能力。

三、基础用例 (Web 环境)

在这里插入图片描述

3.1 操作 DOM (新一代 API)

import'package:web/web.dart'as web;voidmain(){// 💡 无需 dart:html,直接操作宿主 DOMfinal div = web.document.createElement('div')asweb.HTMLDivElement; div.innerText ='Hello from Modern Dart Web!'; div.style.backgroundColor ='blue'; web.document.body?.append(div);}
在这里插入图片描述

3.2 调用 JS 函数

// 假设 JS环境中有一个函数: function showAlert(msg) { alert(msg); }import'dart:js_interop';@JS()externalvoidshowAlert(JSString message);voidcallJs(){showAlert('HarmonyOS Web'.toJS);}
在这里插入图片描述

四、完整实战示例:鸿蒙 ArkWeb 中的 JS 互操作

本示例展示了在 Flutter Web 编译模式下,如何利用 package:web 与鸿蒙宿主环境进行高效通信。

import'dart:js_interop';import'package:web/web.dart'as web;// 💡 模拟鸿蒙系统注入的全局 JS 桥接对象@JS('OhosBridge')extension type OhosBridge._(JSObject _)implementsJSObject{externalstaticJSStringgetDeviceId();externalstaticvoidonActionSuccess(JSString data);}voidcallHarmonyOS(){// 1. 检查对象是否存在if(web.window.has('OhosBridge')){// 2. 直接获取设备 IDfinal id =OhosBridge.getDeviceId().toDart;print('✅ 获取到鸿蒙设备 ID: $id');}}
在这里插入图片描述

五、总结

package:web 是 Dart 迈向 Wasm 时代的关键一步。
虽然它主要面向 Web 平台,但在“大前端”融合的今天,鸿蒙应用中嵌入 Web 页面、小程序的情况比比皆是。掌握新一代的 JS 互操作技术,能让你在混合架构开发中游刃有余。

Read more

[AI提效-52]-豆包 vs 扣子 Coze:一篇看懂字节两大 AI 怎么选

🥊 豆包 vs 扣子 (Coze):字节两大 AI 王牌深度对比 很多用户容易混淆豆包和扣子 (Coze),因为它们都出自字节跳动,且底层都使用了类似的模型技术。但它们的定位、目标用户和核心功能完全不同。 一句话总结: 豆包 (Doubao) 是给你“用”的 AI 助手(类似 ChatGPT),主打日常对话、搜索和娱乐。 扣子 (Coze) 是给你“造”的 AI 工厂(类似 Dify/LangChain),主打零代码开发智能体 (Bot) 和工作流。 一、📊 核心差异总览表 表格 维度豆包 (Doubao)扣子 (Coze)核心定位AI 消费级应用 (ToC)AI 开发平台

By Ne0inhk
AI 进化论:从 Function Calling 到 MCP

AI 进化论:从 Function Calling 到 MCP

AI 进化论:从 Function Calling 到 MCP,你的大模型还在“裸奔”吗? 文章目录 * AI 进化论:从 Function Calling 到 MCP,你的大模型还在“裸奔”吗? * 一、 给 AI 装上手脚:Function Calling 到底是个啥? * 1. 专业解释与大白话解读 * 2. 核心功能与代码示例 * 二、 实战演练:搭建你的“门票数据助手” * 1. 业务场景介绍 * 2. 进阶:一次调用,搞定查询 + 可视化 * 三、 MCP:AI 界的“USB-C”接口协议来了! * 1.

By Ne0inhk
AI 时代,鸿蒙 App 还需要传统导航结构吗?

AI 时代,鸿蒙 App 还需要传统导航结构吗?

子玥酱(掘金 / 知乎 / ZEEKLOG / 简书 同名) 大家好,我是子玥酱,一名长期深耕在一线的前端程序媛 👩‍💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚焦于业务型系统的工程化建设与长期维护。 我持续输出和沉淀前端领域的实战经验,日常关注并分享的技术方向包括前端工程化、小程序、React / RN、Flutter、跨端方案, 在复杂业务落地、组件抽象、性能优化以及多端协作方面积累了大量真实项目经验。 技术方向:前端 / 跨端 / 小程序 / 移动端工程化 内容平台:掘金、知乎、ZEEKLOG、简书 创作特点:实战导向、源码拆解、少空谈多落地 文章状态:长期稳定更新,大量原创输出 我的内容主要围绕 前端技术实战、真实业务踩坑总结、框架与方案选型思考、行业趋势解读 展开。文章不会停留在“API 怎么用”,而是更关注为什么这么设计、在什么场景下容易踩坑、

By Ne0inhk

【大模型应用】AI领域新概念“Skill”的深度解析与核心工作原理

一、 背景引入:为什么需要“Skill”? • 概念演进背景:近年来AI新名词层出不穷(提示词工程 → 智能体 → MCP → A2A → A2UI → Skill)。 • 传统提示词的痛点: • Token浪费:当积累了大量不同用途的复杂提示词(如写菜谱、读论文、写代码)时,如果一股脑全发给AI,会消耗大量Token。 • AI易迷茫(幻觉/失焦):一次性输入过多与当前问题无关的提示词信息,容易干扰AI的理解,导致回答不准确。 • 核心解决思路:需要一种机制,能够根据用户的问题,自动筛选并调出合适的提示词,这就是“Skill”诞生的初衷。 二、 “Skill”的核心物理结构 • 核心定义:一个不同用途的提示词就是一个Skill。在物理层面上,Skill本身就是一个文件夹。 • 核心文件(SKILL.md):文件夹内包含一个名为SKILL.md的文件,存放着提示词的主体内容(如写菜谱的具体要求、克数精确度等)。 • 关键组件(

By Ne0inhk