如何使用 flutter 共享文件

How to share a file using flutter

我想知道如何在 flutter 应用程序中共享文件?

我看到一些关于将 Intents 与 mojo 结合使用的旧参考资料,但似乎不再存在。这似乎是我们应该能够以跨平台方式处理的标准功能(显然 ios 到 android 之间存在一些差异)。

当前共享文件(例如通过电子邮件)的最佳做法是什么?我能做的最接近的事情是 UrlLauncher,我可以想象用它来启动我想要共享的文件的处理程序,但这似乎有点牵强。

目前没有内置方法可以执行此操作。正如 Seth Ladd 上面提到的,https://github.com/flutter/flutter/issues/7111 正在跟踪使这更容易。

目前,您必须在 Objective-C 或 Java 中编写必要的共享代码,并使用 https://flutter.io/platform-services and shown in https://github.com/flutter/flutter/tree/master/examples/hello_services 中记录的平台服务模型从 Dart 中调用它。

对于仍然发现这个问题的任何人,您现在可以使用分享插件分享一些东西:https://pub.dartlang.org/packages/share

编辑:此插件仅支持 text/link 共享,不足以直接共享文件。问题 https://github.com/flutter/flutter/issues/16743 and https://github.com/flutter/flutter/issues/19607 直接在 flutter 中跟踪文件共享。

对于希望反向共享的任何人,或者换句话说,让其他应用程序将数据共享到您的 flutter 应用程序,看看https://flutter.io/flutter-for-android/#how-do-i-handle-incoming-intents-from-external-applications-in-flutter

感谢 flutter Gitter 频道上的 Günter Zöchbauer!

这是我发现的最接近 'sharing' flutter 应用程序问题的问题,并且对于这个特定用例似乎没有 SO 问题,因此这里有这个答案

我发布了这条回复,因为接受的答案实际上并没有回答问题。

使用 flutter-share from this github repo 您可以共享文件,只需将其添加为依赖项,将其导入,然后使用命名的构造函数实例化共享 class,如下所示:Share.file(path: <String>, mimeType: ShareType, title: , text: ); where mimeType , title 和 text 是可选的,然后调用 share 就可以了。

对于Android功能齐全,目前正在开发IOS部分以匹配Android部分(目前只有纯文本共享)。

我使用 share_extend 结合 path_provider 分享了一个音频文件,效果很好。

void share() async {
  Directory dir = await getApplicationDocumentsDirectory();
  File testFile = new File("${dir.path}/sound.m4a");
  if (!await testFile.exists()) {
    await testFile.create(recursive: true);
    testFile.writeAsStringSync("test for share documents file");
  }
  ShareExtend.share(testFile.path, "file");
}

可以使用EsysFlutterShare Plugin。在版本 1.0.0 中,您可以共享任何您喜欢的文件及其在 iOS 和 Android.

上的工作

把它放在你的pubspec.yaml:

dependencies:
  esys_flutter_share: ^1.0.0

导入库:

import 'package:esys_flutter_share/esys_flutter_share.dart';

共享文件:

final ByteData bytes = await rootBundle.load('assets/image1.png');
await Share.file('esys image', 'esys.png', bytes.buffer.asUint8List(), 'image/png');

您需要提供标题、文件名、file-bytes 和 mime 类型。

Flutter刚刚接受了很久的PR,Share plugin现在也可以分享文件了!

例如:

Share.shareFiles(['${directory.path}/image.jpg'], text: 'Great picture');
Share.shareFiles(['${directory.path}/image1.jpg', '${directory.path}/image2.jpg']);

现在,最好的方法是使用share_plus

List<String> paths = [filePath];
await Share.shareFiles(
  paths,
  subject: 'subj',
  text: 'text',
);