Flutter分享功能插件esys_flutter_share的使用

Flutter分享功能插件esys_flutter_share的使用

esys_flutter_share 是一个用于在 Flutter 应用中实现文件与文本共享的插件。通过该插件,您可以轻松地将文本或文件分享到其他应用程序。


重要提示(适用于 iOS)

如果您正在创建一个新的 Flutter 应用程序,并且希望支持 iOS 平台,请确保使用 Swift 创建项目,例如:

flutter create -i swift

如果不这样做,可能会遇到以下错误:

The "Swift Language Version" (SWIFT_VERSION) build setting must be set to a supported value for targets which use Swift. Supported values are: 3.0, 4.0, 4.2.

如果仍然遇到问题,可以尝试编辑 ios/Podfile 文件,添加以下配置:

target 'Runner' do
  use_frameworks!  # required by simple_permission
  ...
end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['SWIFT_VERSION'] = '4.0'  # required by simple_permission
      config.build_settings['ENABLE_BITCODE'] = 'NO'
    end
  end
end

或者,如果您已有非 Swift 项目,可以参考此问题进行解决:Flutter 添加 Swift 插件到 Objective-C 项目


使用方法

1. 导入插件

首先,在项目的 pubspec.yaml 文件中添加依赖项:

dependencies:
  esys_flutter_share: ^2.0.0

然后运行以下命令以更新依赖项:

flutter pub get

接下来,导入插件:

import 'package:esys_flutter_share/esys_flutter_share.dart';

2. 分享文本

使用 Share.text() 方法来分享纯文本内容:

Future<void> _shareText() async {
  try {
    Share.text('我的文本标题', '这是我要分享给其他应用的文本。', 'text/plain');
  } catch (e) {
    print('Error: $e');
  }
}

3. 分享文件

使用 Share.file() 方法来分享本地文件。假设文件位于 assets 文件夹中:

Future<void> _shareImage() async {
  try {
    // 加载本地文件
    final ByteData bytes = await rootBundle.load('assets/image1.png');
    // 分享文件
    await Share.file(
      'esys image', // 文件名称
      'esys.png',   // 文件名
      bytes.buffer.asUint8List(), // 文件字节数据
      'image/png',  // 文件 MIME 类型
      text: '我的可选文本。', // 可选的描述文本
    );
  } catch (e) {
    print('Error: $e');
  }
}

4. 分享多个文件

使用 Share.files() 方法来分享多个文件:

Future<void> _shareImages() async {
  try {
    // 加载多个文件
    final ByteData bytes1 = await rootBundle.load('assets/image1.png');
    final ByteData bytes2 = await rootBundle.load('assets/image2.png');

    // 分享文件集合
    await Share.files(
      'esys images', // 文件夹名称
      { 
        'esys.png': bytes1.buffer.asUint8List(), // 第一个文件
        'bluedan.png': bytes2.buffer.asUint8List(), // 第二个文件
      },
      'image/png', // 文件 MIME 类型
    );
  } catch (e) {
    print('Error: $e');
  }
}

5. 从 URL 分享文件

使用 HttpClient 获取远程文件并分享:

Future<void> _shareImageFromUrl() async {
  try {
    // 获取远程文件
    var request = await HttpClient().getUrl(Uri.parse(
        'https://shop.esys.eu/media/image/6f/8f/af/amlog_transport-berwachung.jpg'));
    var response = await request.close();
    Uint8List bytes = await consolidateHttpClientResponseBytes(response);

    // 分享文件
    await Share.file('ESYS AMLOG', 'amlog.jpg', bytes, 'image/jpg');
  } catch (e) {
    print('Error: $e');
  }
}

完整示例代码

以下是完整的示例代码,展示如何集成 esys_flutter_share 插件:

import 'dart:async';
import 'dart:io';
import 'dart:typed_data';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:esys_flutter_share/esys_flutter_share.dart';

void main() => runApp(MaterialApp(
      home: MaterialApp(
        home: MyHomePage(),
      ),
    ));

class MyHomePage extends StatefulWidget {
  MyHomePage();

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Esys Share Plugin 示例'),
        ),
        body: Container(
            padding: const EdgeInsets.all(20.0),
            child: ListView(
              children: <Widget>[
                MaterialButton(
                  child: Text('分享文本'),
                  onPressed: () async => await _shareText(),
                ),
                MaterialButton(
                  child: Text('分享图片'),
                  onPressed: () async => await _shareImage(),
                ),
                MaterialButton(
                  child: Text('分享多张图片'),
                  onPressed: () async => await _shareImages(),
                ),
                MaterialButton(
                  child: Text('分享 CSV 文件'),
                  onPressed: () async => await _shareCSV(),
                ),
                MaterialButton(
                  child: Text('分享混合内容'),
                  onPressed: () async => await _shareMixed(),
                ),
                MaterialButton(
                  child: Text('从 URL 分享图片'),
                  onPressed: () async => await _shareImageFromUrl(),
                ),
              ],
            )));
  }

  Future<void> _shareText() async {
    try {
      Share.text('我的文本标题',
          '这是我要分享给其他应用的文本。', 'text/plain');
    } catch (e) {
      print('Error: $e');
    }
  }

  Future<void> _shareImage() async {
    try {
      final ByteData bytes = await rootBundle.load('assets/image1.png');
      await Share.file(
          'esys image', 'esys.png', bytes.buffer.asUint8List(), 'image/png', text: '我的可选文本。');
    } catch (e) {
      print('Error: $e');
    }
  }

  Future<void> _shareImages() async {
    try {
      final ByteData bytes1 = await rootBundle.load('assets/image1.png');
      final ByteData bytes2 = await rootBundle.load('assets/image2.png');

      await Share.files(
          'esys images',
          {
            'esys.png': bytes1.buffer.asUint8List(),
            'bluedan.png': bytes2.buffer.asUint8List(),
          },
          'image/png');
    } catch (e) {
      print('Error: $e');
    }
  }

  Future<void> _shareCSV() async {
    try {
      final ByteData bytes = await rootBundle.load('assets/addresses.csv');
      await Share.file(
          'addresses', 'addresses.csv', bytes.buffer.asUint8List(), 'text/csv');
    } catch (e) {
      print('Error: $e');
    }
  }

  Future<void> _shareMixed() async {
    try {
      final ByteData bytes1 = await rootBundle.load('assets/image1.png');
      final ByteData bytes2 = await rootBundle.load('assets/image2.png');
      final ByteData bytes3 = await rootBundle.load('assets/addresses.csv');

      await Share.files(
          'esys images',
          {
            'esys.png': bytes1.buffer.asUint8List(),
            'bluedan.png': bytes2.buffer.asUint8List(),
            'addresses.csv': bytes3.buffer.asUint8List(),
          },
          '*/*', text: '我的可选文本。');
    } catch (e) {
      print('Error: $e');
    }
  }

  Future<void> _shareImageFromUrl() async {
    try {
      var request = await HttpClient().getUrl(Uri.parse(
          'https://shop.esys.eu/media/image/6f/8f/af/amlog_transport-berwachung.jpg'));
      var response = await request.close();
      Uint8List bytes = await consolidateHttpClientResponseBytes(response);
      await Share.file('ESYS AMLOG', 'amlog.jpg', bytes, 'image/jpg');
    } catch (e) {
      print('Error: $e');
    }
  }
}

更多关于Flutter分享功能插件esys_flutter_share的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter分享功能插件esys_flutter_share的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


esys_flutter_share 是一个用于在 Flutter 应用中实现分享功能的插件。它允许你将文本、文件或图片分享到其他应用或社交平台。以下是如何使用 esys_flutter_share 插件的步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 esys_flutter_share 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  esys_flutter_share: ^1.0.2

然后运行 flutter pub get 来安装依赖。

2. 导入插件

在你的 Dart 文件中导入 esys_flutter_share 插件:

import 'package:esys_flutter_share/esys_flutter_share.dart';

3. 分享文本

你可以使用 Share.text 方法来分享文本:

void shareText() async {
  try {
    await Share.text(
      '分享标题',
      '这是要分享的文本内容',
      'text/plain',
    );
  } catch (e) {
    print('分享失败: $e');
  }
}

4. 分享文件

你可以使用 Share.file 方法来分享文件。首先,你需要将文件读取为字节数据,然后将其分享出去:

void shareFile() async {
  try {
    final ByteData bytes = await rootBundle.load('assets/sample.pdf');
    await Share.file(
      '分享标题',
      'sample.pdf',
      bytes.buffer.asUint8List(),
      'application/pdf',
    );
  } catch (e) {
    print('分享失败: $e');
  }
}

5. 分享图片

你可以使用 Share.file 方法来分享图片。首先,你需要将图片读取为字节数据,然后将其分享出去:

void shareImage() async {
  try {
    final ByteData bytes = await rootBundle.load('assets/sample.png');
    await Share.file(
      '分享标题',
      'sample.png',
      bytes.buffer.asUint8List(),
      'image/png',
    );
  } catch (e) {
    print('分享失败: $e');
  }
}

6. 调用分享方法

你可以在按钮的 onPressed 事件中调用上述分享方法:

ElevatedButton(
  onPressed: shareText,
  child: Text('分享文本'),
),
ElevatedButton(
  onPressed: shareFile,
  child: Text('分享文件'),
),
ElevatedButton(
  onPressed: shareImage,
  child: Text('分享图片'),
),

7. 处理权限(如果需要)

在某些平台上,分享文件可能需要权限。确保你已经在 AndroidManifest.xml 文件中添加了必要的权限:

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

8. 运行应用

现在你可以运行你的 Flutter 应用,并测试分享功能。

注意事项

  • esys_flutter_share 插件目前已经不再维护,如果你遇到问题,可以考虑使用其他分享插件,如 share_plus
  • 在 iOS 上,分享功能不需要额外的权限配置。

替代插件

如果你正在寻找一个更活跃的替代品,可以考虑使用 share_plus 插件,它提供了类似的功能并且仍在积极维护中。

dependencies:
  flutter:
    sdk: flutter
  share_plus: ^6.3.0
回到顶部