import 'dart:async'; import 'dart:io'; import 'package:flutter/widgets.dart'; import 'package:path_provider/path_provider.dart'; import 'package:share_plus/share_plus.dart' as sp; import 'package:path/path.dart' as p; class Share { /// Transforms a string of text into a file and shares that file /// - title: Title of message or subject if sending an email /// - text: The text to share /// - filename: The filename to use if sending over airdrop for example static Future share( BuildContext context, { required String title, required String text, required String filename, }) async { assert(title.isNotEmpty); assert(text.isNotEmpty); assert(filename.isNotEmpty); final tmpDir = await getTemporaryDirectory(); final file = File(p.join(tmpDir.path, filename)); var res = false; try { file.writeAsStringSync(text, flush: true); res = await Share.shareFile(context, title: title, filePath: file.path); } catch (err) { // Ignoring file write errors } file.delete(); return res; } /// Shares a local file /// - title: Title of message or subject if sending an email /// - filePath: Path to the file to share /// - filename: An optional filename to override the existing file static Future shareFile(BuildContext context, {required String title, required String filePath, String? filename}) async { assert(title.isNotEmpty); assert(filePath.isNotEmpty); final box = context.findRenderObject() as RenderBox?; //NOTE: the filename used to specify the name of the file in gmail/slack/etc but no longer works that way // If we want to support that again we will need to save the file to a temporary directory, share that, // and then delete it final xFile = sp.XFile(filePath, name: filename); final result = await sp.Share.shareXFiles([xFile], subject: title, sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size); return result.status == sp.ShareResultStatus.success; } }