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

在这里插入图片描述

前言

在鸿蒙(OpenHarmony)应用中,内容分享是社交互动的重要环节。share_plus 提供了接入鸿蒙原生分享面板(Share Sheet)的便捷方案,支持文字、链接及多图分享,助力构建跨平台的社交分发能力。

一、核心价值

1.1 基础概念

share_plus 通过 MethodChannel 与鸿蒙原生的“隐式意图(Implicit Intent / Want)”对接。

Want 路由

用户点击分享

share_plus 核心

鸿蒙系统原生分享面板

微信/QQ/钉钉

邮件/蓝牙/打印

备忘录/云端存储

内容成功分发

1.2 进阶概念

  • Share Result (状态反馈):支持监听分享结果(如用户是否真正点击了发送,还是中途取消),方便鸿蒙开发者进行业务统计。
  • Subject Definition:在分享到邮件等特定渠道时,支持注入精准的主题头。

二、核心 API / 组件详解

2.1 依赖引入

由于 share_plus 的官方版本尚未完全合并鸿蒙分支,建议采用“本地化适配”方案。将适配好的源码 clone 到项目 packages 目录,并按如下方式引用:

dependencies:
  share_plus:
    path: ./packages/share_plus
  share_plus_platform_interface:
    path: ./packages/share_plus_platform_interface

2.2 基础分享用例

在鸿蒙工程中触发一段促销文案分享:

import 'package:share_plus/share_plus.dart';

void shareHarmonyContent() {
  // ✅ 推荐做法:使用静态方法触发系统级逻辑
  Share.share(
    '🚀 鸿蒙开发者大会倒计时结束!快来体验全新的跨平台应用吧:https://harmony.dev',
    subject: '重要赛事邀请码',
  );
}

在这里插入图片描述

2.3 分享本地文件(如:图片/HAP)

Share.shareXFiles([XFile('/path/to/screenshot.png')], text: '快看我的鸿蒙运行截图!');

在这里插入图片描述

三、场景示例

3.1 场景一:鸿蒙级应用的“资讯海报”分发

当用户生成了一张带二维码的精美战报,一键调用系统面板保存或发给好友。

Future<void> dispatchPoster(String filePath) async {
  // 💡 技巧:利用 shareXFiles 处理大容量高清图
  await Share.shareXFiles([XFile(filePath)]);
}

四、OpenHarmony 平台适配挑战

4.1 分享内容的隐私过滤与沙箱权限

鸿蒙系统对于跨应用(Ability)的文件流转有严格的 URI 映射要求。

适配策略建议

  1. URI 转换share_plus 内部已处理了大部分路径映射。但如果你的文件位于极其特殊的沙箱深处,建议先利用 path_provider 将其移动至临时目录(Temporary)再执行分享。
  2. 平板/折叠屏弹窗位置 (Origin):在鸿蒙支架式平板或大屏上,分享面板需要指向点击区域。如果不指定 sharePositionOrigin,面板可能会在屏幕中央弹出显得有些突兀。
// 💡 适配提示:指定在大屏设备上的弹出锚点
Share.share('内容', sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size);

4.2 本地化源码适配流程

在适配过程中,如果直接使用远程 Git 依赖,可能会遇到网络波动导致的 flutter pub get 卡顿,或版本解析冲突。为了更深度地治理兼容性问题,我们将源码本地化并进行了核心代码重构。

4.2.1 鸿蒙原生侧实现原理 (ArkTS)

在本地化的 ohos/ 目录下,核心逻辑位于 Share.ets。它将 Flutter 传递的指令转换为鸿蒙系统的 systemShare 调用。

以下是适配后的关键原生源码及解析:

// 💡 原生适配核心:将 Flutter 数据映射到鸿蒙 systemShare 框架
import systemShare from '@hms.collaboration.systemShare';
import uniformTypeDescriptor from '@ohos.data.uniformTypeDescriptor';

public async share(text: string, subject: string | null): Promise<void> {
  // 1. 创建共享记录:必须指定 UTD (Uniform Type Descriptor)
  let record: systemShare.SharedRecord = {
    utd: uniformTypeDescriptor.getUniformDataTypeByMIMEType('text/plain'),
    content: text,
    title: subject ?? ''
  }
  
  // 2. 封装 SharedData 对象
  let data = new systemShare.SharedData(record);
  
  // 3. 构建 ShareController 并拉起系统面板
  let controller = new systemShare.ShareController(data);
  controller.show(this.ability?.context, {
    previewMode: systemShare.SharePreviewMode.DETAIL,
    selectionMode: systemShare.SelectionMode.BATCH
  });
}
4.2.2 本地化适配步骤
  1. 提取源码:从 OpenHarmony-SIG/flutter_plus_plugins 克隆仓库,提取 share_plusshare_plus_platform_interface 文件夹。
  2. 置入项目:将源码放置于项目的 packages/ 目录下。
  3. 路径重定向:在 pubspec.yaml 中使用 path 依赖指向本地文件夹。
  4. 按需裁剪:如果是纯鸿蒙项目,可以在本地源码中剥离其他平台的 native 实现(如 iOS/Android)。
  5. 原生调试:本地源码化后,可直接在工程中修改 Share.ets,方便调试预览模式(SharePreviewMode)等参数。

五、综合实战示例代码

这是一个包含了反馈监听的鸿蒙分享逻辑 Demo:

import 'package:flutter/material.dart';
import 'package:share_plus/share_plus.dart';

class HarmonyShareLab extends StatelessWidget {
  const HarmonyShareLab({super.key});

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('内容流转 - 鸿蒙实战')),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            // 💡 重点:可以获取分享的最终状态
            final result = await Share.shareWithResult('探索开源鸿蒙的无限可能 🚀');
            
            if (result.status == ShareResultStatus.success) {
              ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('🎉 鸿蒙分享成功!')));
            }
          },
          child: const Text('立即拉起鸿蒙分享中心'),
        ),
      ),
    );
  }
}

在这里插入图片描述

六、总结

share_plus 去除了多端接入 SDK 的烦恼,让内容的流转真正回归到了系统最原始、最通用的路径上。它让每一个鸿蒙应用都能瞬间具备与整个社交生态联网的能力。

核心建议

  1. 请务必处理分享文件不存在时的异常捕获。
  2. 涉及多图分享,建议图片总数控制在 9 张以内,以保证鸿蒙面板的流畅度。
Logo

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

更多推荐