Skip to content

Commit

Permalink
fix(share_plus): add sharePositionOrigin parameter to shareUri (#2517)
Browse files Browse the repository at this point in the history
Co-authored-by: Miguel Beltran <m@beltran.work>
  • Loading branch information
rodruiz and miquelbeltran committed Mar 7, 2024
1 parent 5cef2e5 commit f896d94
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 6 deletions.
5 changes: 4 additions & 1 deletion packages/share_plus/share_plus/example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,10 @@ class DemoAppState extends State<DemoApp> {
final box = context.findRenderObject() as RenderBox?;

if (uri.isNotEmpty) {
await Share.shareUri(Uri.parse(uri));
await Share.shareUri(
Uri.parse(uri),
sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
);
} else if (imagePaths.isNotEmpty) {
final files = <XFile>[];
for (var i = 0; i < imagePaths.length; i++) {
Expand Down
17 changes: 14 additions & 3 deletions packages/share_plus/share_plus/lib/share_plus.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,21 @@ class Share {
/// on iOS. [shareUri] will trigger the iOS system to fetch the html page
/// (if available), and the website icon will be extracted and displayed on
/// the iOS share sheet.
///
/// The optional `sharePositionOrigin` parameter can be used to specify a global
/// origin rect for the share sheet to popover from on iPads and Macs. It has no effect
/// on other devices.
///
/// May throw [PlatformException]
/// from [MethodChannel].
static Future<void> shareUri(
Uri uri,
) async {
return _platform.shareUri(uri);
Uri uri, {
Rect? sharePositionOrigin,
}) async {
return _platform.shareUri(
uri,
sharePositionOrigin: sharePositionOrigin,
);
}

/// Summons the platform's share sheet to share text.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,19 @@ class MethodChannelShare extends SharePlatform {
MethodChannel('dev.fluttercommunity.plus/share');

@override
Future<void> shareUri(Uri uri) {
Future<void> shareUri(
Uri uri, {
Rect? sharePositionOrigin,
}) {
final params = <String, dynamic>{'uri': uri.toString()};

if (sharePositionOrigin != null) {
params['originX'] = sharePositionOrigin.left;
params['originY'] = sharePositionOrigin.top;
params['originWidth'] = sharePositionOrigin.width;
params['originHeight'] = sharePositionOrigin.height;
}

return channel.invokeMethod<void>('shareUri', params);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,16 @@ class SharePlatform extends PlatformInterface {
_instance = instance;
}

Future<void> shareUri(Uri uri) => _instance.shareUri(uri);
/// Share uri.
Future<void> shareUri(
Uri uri, {
Rect? sharePositionOrigin,
}) {
return _instance.shareUri(
uri,
sharePositionOrigin: sharePositionOrigin,
);
}

/// Share text.
Future<void> share(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,18 @@ void main() {
});

test('sharing origin sets the right params', () async {
await sharePlatform.shareUri(
Uri.parse('https://pub.dev/packages/share_plus'),
sharePositionOrigin: const Rect.fromLTWH(1.0, 2.0, 3.0, 4.0),
);
verify(mockChannel.invokeMethod<void>('shareUri', <String, dynamic>{
'uri': 'https://pub.dev/packages/share_plus',
'originX': 1.0,
'originY': 2.0,
'originWidth': 3.0,
'originHeight': 4.0,
}));

await sharePlatform.share(
'some text to share',
subject: 'some subject to share',
Expand Down

0 comments on commit f896d94

Please sign in to comment.