
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
🎯 欢迎来到 Flutter for OpenHarmony 社区!本文将深入讲解 Flutter 中 share_extend 系统分享组件的使用方法,带你全面掌握在应用中实现系统级分享功能。
一、share_extend 组件概述
在 Flutter for OpenHarmony 应用开发中,share_extend 是一个非常实用的系统分享插件,它允许应用调用系统原生的分享面板,将文本、图片、文件等内容分享到其他应用。通过系统分享功能,用户可以方便地将内容分享到微信、QQ、短信、邮件等应用,大大提升了用户体验。
📋 share_extend 组件特点
| 特点 | 说明 |
|---|---|
| 跨平台支持 | 支持 Android、iOS、OpenHarmony |
| 系统原生 | 调用系统原生分享面板,体验一致 |
| 多类型支持 | 支持分享文本、图片、文件等多种类型 |
| 简单易用 | API 简洁直观,几行代码即可实现分享 |
| 无需集成SDK | 不需要集成各平台SDK,直接使用系统功能 |
| 用户友好 | 用户可自主选择分享目标应用 |
💡 使用场景:分享文章链接、分享图片到社交平台、分享文件、分享邀请码、分享商品信息等。
二、OpenHarmony 平台适配说明
2.1 兼容性信息
本项目基于 share_extend@2.0.0 开发,适配 Flutter 3.27.5-ohos-1.0.4。
2.2 支持的功能
在 OpenHarmony 平台上,share_extend 支持以下功能:
| 功能 | 说明 | OpenHarmony 支持 |
|---|---|---|
| 分享文本 | 分享纯文本内容 | ✅ yes |
| 分享图片 | 分享图片文件 | ✅ yes |
| 分享文件 | 分享任意类型文件 | ✅ yes |
| 分享多张图片 | 同时分享多张图片 | ✅ yes |
| 指定分享类型 | 设置分享的 MIME 类型 | ✅ yes |
三、项目配置与安装
3.1 添加依赖配置
首先,需要在你的 Flutter 项目的 pubspec.yaml 文件中添加 share_extend 依赖。
打开项目根目录下的 pubspec.yaml 文件,找到 dependencies 部分,添加以下配置:
yaml
dependencies:
flutter:
sdk: flutter
# 添加 share_extend 依赖(OpenHarmony 适配版本)
share_extend:
git:
url: "https://atomgit.com/openharmony-sig/fluttertpc_share_extend.git"
ref: "master"
配置说明:
- 使用 git 方式引用开源鸿蒙适配的 share_extend 仓库
url:指定 AtomGit 托管的仓库地址ref:指定分支或标签- 本项目基于
share_extend@2.0.0开发,适配 Flutter 3.27.5-ohos-1.0.4
⚠️ 重要:对于 OpenHarmony 平台,必须使用 git 方式引用适配版本,不能直接使用 pub.dev 的版本号。
3.2 下载依赖
配置完成后,需要在项目根目录执行以下命令下载依赖:
bash
flutter pub get
执行成功后,你会看到类似以下的输出:
Running "flutter pub get" in my_cross_platform_app...
Resolving dependencies...
Got dependencies!
3.3 依赖自动配置说明
执行 flutter pub get 后,OpenHarmony 平台的依赖会自动配置到 ohos/entry/oh-package.json5 文件中。Flutter 构建系统会自动处理平台相关的依赖配置,无需手动干预。
四、share_extend 基础用法
4.1 导入库
在使用 share_extend 之前,需要先导入库:
dart
import 'package:share_extend/share_extend.dart';
4.2 分享文本
最简单的分享方式是分享纯文本:
dart
// 分享文本
ShareExtend.share("这是一条分享的文本内容", "text");
参数说明:
- 第一个参数:要分享的内容
- 第二个参数:分享类型("text" 表示文本)
4.3 分享图片
分享图片需要先获取图片路径:
dart
import 'package:image_picker/image_picker.dart';
// 分享图片
Future<void> shareImage() async {
final picker = ImagePicker();
final XFile? image = await picker.pickImage(source: ImageSource.gallery);
if (image != null) {
ShareExtend.share(image.path, "image");
}
}
4.4 分享文件
分享任意类型的文件:
dart
// 分享文件
Future<void> shareFile(String filePath) async {
ShareExtend.share(filePath, "file");
}
4.5 分享多张图片
同时分享多张图片:
dart
// 分享多张图片
Future<void> shareMultipleImages(List<String> imagePaths) async {
ShareExtend.shareMultiple(imagePaths, "image");
}
五、常用 API 详解
5.1 share - 单项分享
分享单个内容项:
dart
ShareExtend.share(
String text, // 要分享的内容(文本或文件路径)
String type, // 分享类型:text、image、file
);
分享类型说明:
| 类型 | 说明 | 示例 |
|---|---|---|
| text | 纯文本 | ShareExtend.share("文本", "text") |
| image | 图片文件 | ShareExtend.share(path, "image") |
| file | 任意文件 | ShareExtend.share(path, "file") |
5.2 shareMultiple - 多项分享
分享多个内容项:
dart
ShareExtend.shareMultiple(
List<String> paths, // 文件路径列表
String type, // 分享类型
);
使用示例:
dart
// 分享多张图片
List<String> imagePaths = ['/path/to/image1.jpg', '/path/to/image2.jpg'];
ShareExtend.shareMultiple(imagePaths, "image");
六、实际应用场景
6.1 分享文章链接
dart
class ArticleShareButton extends StatelessWidget {
final String title;
final String url;
const ArticleShareButton({
super.key,
required this.title,
required this.url,
});
void _shareArticle() {
String shareContent = '$title\n$url';
ShareExtend.share(shareContent, "text");
}
@override
Widget build(BuildContext context) {
return IconButton(
icon: const Icon(Icons.share),
onPressed: _shareArticle,
);
}
}
6.2 分享图片到社交平台
dart
class ImageSharePage extends StatefulWidget {
const ImageSharePage({super.key});
@override
State<ImageSharePage> createState() => _ImageSharePageState();
}
class _ImageSharePageState extends State<ImageSharePage> {
String? _imagePath;
Future<void> _pickAndShareImage() async {
final picker = ImagePicker();
final XFile? image = await picker.pickImage(source: ImageSource.gallery);
if (image != null) {
setState(() => _imagePath = image.path);
ShareExtend.share(image.path, "image");
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('分享图片')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (_imagePath != null)
Image.network(
_imagePath!,
width: 200,
height: 200,
fit: BoxFit.cover,
),
const SizedBox(height: 20),
ElevatedButton.icon(
onPressed: _pickAndShareImage,
icon: const Icon(Icons.share),
label: const Text('选择并分享图片'),
),
],
),
),
);
}
}
6.3 分享邀请码
dart
class InviteShareButton extends StatelessWidget {
final String inviteCode;
const InviteShareButton({super.key, required this.inviteCode});
void _shareInviteCode() {
String shareContent = '''
邀请您加入我们的应用!
邀请码:$inviteCode
点击链接下载:https://example.com/download
''';
ShareExtend.share(shareContent, "text");
}
@override
Widget build(BuildContext context) {
return ElevatedButton.icon(
onPressed: _shareInviteCode,
icon: const Icon(Icons.card_giftcard),
label: const Text('分享邀请码'),
);
}
}
6.4 分享商品信息
dart
class ProductShareCard extends StatelessWidget {
final String name;
final double price;
final String imageUrl;
final String productUrl;
const ProductShareCard({
super.key,
required this.name,
required this.price,
required this.imageUrl,
required this.productUrl,
});
void _shareProduct() {
String shareContent = '''
【$name】
价格:¥$price
购买链接:$productUrl
''';
ShareExtend.share(shareContent, "text");
}
@override
Widget build(BuildContext context) {
return Card(
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(name, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
const SizedBox(height: 8),
Text('¥$price', style: const TextStyle(fontSize: 16, color: Colors.red)),
const SizedBox(height: 16),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
TextButton.icon(
onPressed: _shareProduct,
icon: const Icon(Icons.share),
label: const Text('分享'),
),
],
),
],
),
),
);
}
}
6.5 分享截图
dart
import 'dart:io';
import 'dart:ui' as ui;
import 'package:flutter/rendering.dart';
import 'package:path_provider/path_provider.dart';
class ScreenshotShare extends StatefulWidget {
const ScreenshotShare({super.key});
@override
State<ScreenshotShare> createState() => _ScreenshotShareState();
}
class _ScreenshotShareState extends State<ScreenshotShare> {
final GlobalKey _repaintBoundaryKey = GlobalKey();
Future<void> _captureAndShare() async {
try {
RenderRepaintBoundary boundary =
_repaintBoundaryKey.currentContext!.findRenderObject() as RenderRepaintBoundary;
ui.Image image = await boundary.toImage(pixelRatio: 3.0);
final byteData = await image.toByteData(format: ui.ImageByteFormat.png);
final buffer = byteData!.buffer.asUint8List();
final tempDir = await getTemporaryDirectory();
final file = File('${tempDir.path}/screenshot.png');
await file.writeAsBytes(buffer);
ShareExtend.share(file.path, "image");
} catch (e) {
debugPrint('截图分享失败: $e');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('截图分享')),
body: RepaintBoundary(
key: _repaintBoundaryKey,
child: Container(
padding: const EdgeInsets.all(20),
child: Column(
children: [
const Text('这是要截图分享的内容'),
const SizedBox(height: 20),
ElevatedButton.icon(
onPressed: _captureAndShare,
icon: const Icon(Icons.share),
label: const Text('截图并分享'),
),
],
),
),
),
);
}
}
七、完整示例代码
下面是一个完整的示例应用,展示了 share_extend 的各种用法:
dart
import 'package:flutter/material.dart';
import 'package:share_extend/share_extend.dart';
import 'package:image_picker/image_picker.dart';
import 'dart:io';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'ShareExtend 示例',
debugShowCheckedModeBanner: false,
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: const Color(0xFF6366F1)),
useMaterial3: true,
),
home: const ShareDemoPage(),
);
}
}
class ShareDemoPage extends StatefulWidget {
const ShareDemoPage({super.key});
@override
State<ShareDemoPage> createState() => _ShareDemoPageState();
}
class _ShareDemoPageState extends State<ShareDemoPage> {
final TextEditingController _textController = TextEditingController();
final ImagePicker _picker = ImagePicker();
List<String> _selectedImages = [];
@override
void dispose() {
_textController.dispose();
super.dispose();
}
Future<void> _shareText() async {
if (_textController.text.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('请输入要分享的内容')),
);
return;
}
ShareExtend.share(_textController.text, "text");
}
Future<void> _shareSingleImage() async {
final XFile? image = await _picker.pickImage(source: ImageSource.gallery);
if (image != null) {
ShareExtend.share(image.path, "image");
}
}
Future<void> _shareMultipleImages() async {
final List<XFile> images = await _picker.pickMultiImage();
if (images.isNotEmpty) {
setState(() {
_selectedImages = images.map((x) => x.path).toList();
});
ShareExtend.shareMultiple(_selectedImages, "image");
}
}
void _shareArticle() {
String content = '''
【Flutter for OpenHarmony 教程】
分享功能是移动应用中常见的功能之一。通过 share_extend 插件,我们可以轻松实现系统级分享功能。
主要特点:
- 跨平台支持
- 系统原生体验
- 多类型支持
查看详情:https://openharmonycrossplatform.csdn.net
''';
ShareExtend.share(content, "text");
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('ShareExtend 示例'),
centerTitle: true,
elevation: 0,
),
body: Container(
decoration: const BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
Color(0xFFE8F4FF),
Color(0xFFF8F9FF),
],
),
),
child: SafeArea(
child: SingleChildScrollView(
padding: const EdgeInsets.all(20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
_buildSectionTitle('分享文本'),
const SizedBox(height: 12),
Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.05),
blurRadius: 10,
),
],
),
child: Column(
children: [
TextField(
controller: _textController,
maxLines: 3,
decoration: const InputDecoration(
hintText: '输入要分享的文本内容...',
border: OutlineInputBorder(),
),
),
const SizedBox(height: 12),
ElevatedButton.icon(
onPressed: _shareText,
icon: const Icon(Icons.text_fields),
label: const Text('分享文本'),
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF6366F1),
foregroundColor: Colors.white,
minimumSize: const Size(double.infinity, 48),
),
),
],
),
),
const SizedBox(height: 24),
_buildSectionTitle('分享图片'),
const SizedBox(height: 12),
Row(
children: [
Expanded(
child: _buildShareButton(
'单张图片',
Icons.image,
_shareSingleImage,
Colors.blue,
),
),
const SizedBox(width: 12),
Expanded(
child: _buildShareButton(
'多张图片',
Icons.photo_library,
_shareMultipleImages,
Colors.purple,
),
),
],
),
const SizedBox(height: 24),
_buildSectionTitle('分享场景示例'),
const SizedBox(height: 12),
_buildShareButton(
'分享文章',
Icons.article,
_shareArticle,
Colors.teal,
),
const SizedBox(height: 12),
_buildShareButton(
'分享邀请码',
Icons.card_giftcard,
() {
ShareExtend.share(
'邀请码:ABC123XYZ\n下载链接:https://example.com',
"text",
);
},
Colors.orange,
),
const SizedBox(height: 12),
_buildShareButton(
'分享商品',
Icons.shopping_cart,
() {
ShareExtend.share(
'【特价商品】\n价格:¥99.00\n购买链接:https://shop.example.com/product/123',
"text",
);
},
Colors.red,
),
],
),
),
),
),
);
}
Widget _buildSectionTitle(String title) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10),
decoration: BoxDecoration(
gradient: const LinearGradient(
colors: [Color(0xFF6366F1), Color(0xFF8B5CF6)],
),
borderRadius: BorderRadius.circular(8),
),
child: Text(
title,
style: const TextStyle(
color: Colors.white,
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
);
}
Widget _buildShareButton(
String text,
IconData icon,
VoidCallback onPressed,
Color color,
) {
return ElevatedButton.icon(
onPressed: onPressed,
icon: Icon(icon),
label: Text(text),
style: ElevatedButton.styleFrom(
backgroundColor: color,
foregroundColor: Colors.white,
padding: const EdgeInsets.symmetric(vertical: 14),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
),
);
}
}
八、常见问题与解决方案
8.1 分享图片失败
问题原因:
- 图片路径不正确
- 图片文件不存在
- 没有读取权限
解决方案:
dart
// 确保文件存在
Future<void> shareImageSafely(String path) async {
final file = File(path);
if (await file.exists()) {
ShareExtend.share(path, "image");
} else {
debugPrint('文件不存在: $path');
}
}
8.2 分享面板不弹出
问题原因:
- 设备没有可分享的应用
- 平台适配问题
解决方案:
- 确保设备安装了可分享的应用
- 检查 OpenHarmony 平台适配是否正确
8.3 分享中文乱码
问题原因:
- 编码问题
解决方案:
dart
// 使用 UTF-8 编码
String content = '分享中文内容';
ShareExtend.share(content, "text");
九、总结
share_extend 是 Flutter for OpenHarmony 应用开发中常用的系统分享组件。通过本文的学习,我们掌握了:
- 基础用法:分享文本、图片、文件
- 多项分享:同时分享多张图片
- 实际应用:分享文章、邀请码、商品信息、截图等场景
- 常见问题:分享失败、乱码等问题的解决方案
💡 开发建议:使用 share_extend 时应注意:
- 分享前检查文件是否存在
- 分享内容应简洁明了
- 提供友好的错误提示
- 考虑用户隐私,避免分享敏感信息