字节笔记本

2026年2月22日

ShareExtend:Flutter 系统分享插件

本文介绍 ShareExtend,一个 Flutter 平台的开源分享插件。该插件支持调用系统原生分享功能,可分享文本、图片、视频和文件等多种类型内容。截至目前,该项目在 GitHub 上已获得 182 stars,73 forks。

项目简介

ShareExtend 是一个 Flutter 插件,封装了 iOS 和 Android 平台的系统分享功能。开发者可以通过简单的 API 调用,实现跨平台的内容分享,无需处理复杂的原生代码。

核心特性

  • 文本分享 - 分享纯文本内容到其他应用
  • 图片分享 - 支持单张和多张图片分享
  • 视频分享 - 分享视频文件到社交平台
  • 文件分享 - 支持任意类型文件的分享
  • 跨平台 - 同时支持 iOS 和 Android
  • 简单易用 - 简洁的 API 设计,快速集成

技术栈

  • Flutter/Dart - 跨平台开发框架
  • Swift/Objective-C - iOS 原生实现
  • Kotlin/Java - Android 原生实现

安装指南

添加依赖

pubspec.yaml 文件中添加依赖:

yaml
dependencies:
  share_extend: "^2.0.0"

iOS 配置

ios/Runner/Info.plist 中添加相册权限描述,用于将分享的图片保存到相册:

xml
<key>NSPhotoLibraryAddUsageDescription</key>
<string>这里填写为什么需要相册写入权限的描述语句</string>

Android 配置

如需分享存储空间中的文件,在 android/app/src/main/AndroidManifest.xml 中添加读写权限:

xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

快速开始

导入插件

dart
import 'package:share_extend/share_extend.dart';

基础用法

分享文本

dart
ShareExtend.share(
  "share text",           // 分享内容
  "text",                 // 类型
  "android share panel title",  // Android 分享面板标题
  "share subject"         // 分享主题
);

分享图片

dart
// 使用 image_picker 选择图片
File f = await ImagePicker.pickImage(source: ImageSource.gallery);
ShareExtend.share(f.path, "image");

分享视频

dart
File f = await ImagePicker.pickVideo(source: ImageSource.gallery);
ShareExtend.share(f.path, "video");

分享文件

dart
Directory dir = Platform.isAndroid
    ? await getExternalStorageDirectory()
    : await getApplicationDocumentsDirectory();

File testFile = File("${dir.path}/flutter/test.txt");

if (!await testFile.exists()) {
  await testFile.create(recursive: true);
  testFile.writeAsStringSync("test for share documents file");
}

ShareExtend.share(testFile.path, "file");

高级用法

分享多张图片

dart
_shareMultipleImages() async {
  // 使用 MultiImagePicker 多选图片
  List<Asset> assetList = await MultiImagePicker.pickImages(maxImages: 5);
  var imageList = List<String>();

  for (var asset in assetList) {
    String path = await _writeByteToImageFile(
      await asset.getByteData(quality: 30)
    );
    imageList.add(path);
  }

  ShareExtend.shareMultiple(
    imageList,
    "image",
    subject: "share multi image"
  );
}

Future<String> _writeByteToImageFile(ByteData byteData) async {
  Directory dir = Platform.isAndroid
      ? await getExternalStorageDirectory()
      : await getApplicationDocumentsDirectory();

  File imageFile = File(
    "${dir.path}/flutter/${DateTime.now().millisecondsSinceEpoch}.png"
  );

  imageFile.createSync(recursive: true);
  imageFile.writeAsBytesSync(byteData.buffer.asUint8List(0));

  return imageFile.path;
}

API 参考

ShareExtend.share

分享单个内容。

参数类型必填说明
contentString分享内容(文本内容或文件路径)
typeString类型:textimagevideofile
androidTitleStringAndroid 分享面板标题
subjectString分享主题(邮件等使用)

ShareExtend.shareMultiple

分享多个内容(目前主要支持多图分享)。

参数类型必填说明
listList文件路径列表
typeString类型:image
subjectString分享主题

注意事项

  1. 权限处理 - Android 6.0+ 需要动态申请存储权限
  2. 文件路径 - 确保分享的文件路径有效且可访问
  3. 多图分享 - 部分应用可能不支持多图分享,建议提供降级方案
  4. iOS 相册 - 保存图片到相册需要用户授权

项目链接

分享: