mobile_nebula/lib/services/share.dart

59 lines
2.0 KiB
Dart

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<bool> 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<bool> 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;
}
}