To get the sharePositionOrigin from a specific Flutter Widget, you need to determine that widget’s position and size in the global coordinate space. This is essential for iPad and macOS users, as the share sheet needs an anchor point to point its “arrow” toward.
The most reliable way to do this is by using the widget’s BuildContext to find its RenderBox.
The Core Logic
You can calculate the required Rect using this pattern:
final RenderBox? box = context.findRenderObject() as RenderBox?;
if (box != null) {
final Rect sharePositionOrigin = box.localToGlobal(Offset.zero) & box.size;
// Use it in your share call
await Share.share(
‘Check out this cool content!’,
sharePositionOrigin: sharePositionOrigin,
);
}
Implementation Strategies
Depending on how your code is structured, you have two primary ways to access the correct BuildContext.
- Using a Builder Widget (Easiest)
If you are calling the share function inside an onPressed callback, the standard context might refer to the entire page rather than the specific button. A Builder provides a local context specific to that button.
Builder(
builder: (BuildContext context) {
return ElevatedButton(
onPressed: () {
final box = context.findRenderObject() as RenderBox?;
final rect = box!.localToGlobal(Offset.zero) & box.size;
Share.share(
'Hello from Flutter!',
sharePositionOrigin: rect,
);
},
child: const Text('Share'),
);
},
)
- Using a GlobalKey
If you need to trigger the share from a different part of the code but anchor it to a specific widget, use a GlobalKey.
Define the key: final GlobalKey _shareKey = GlobalKey();
Assign the key: (key: _shareKey, …)
Calculate the Rect:
final box = _shareKey.currentContext?.findRenderObject() as RenderBox?;
if (box != null) {
final rect = box.localToGlobal(Offset.zero) & box.size;
// Share...
}
Why this works
Flutter uses a coordinate system where each widget has its own local (0,0) position.
localToGlobal(Offset.zero): Converts the widget’s local (0,0) top-left corner into the global (x, y) coordinates of the screen.
& box.size: This is a Flutter operator overload that combines an Offset (the position) and a Size to create a Rect.
Note: If you don’t provide a sharePositionOrigin on an iPad, the app may crash when the share sheet tries to open, as it won’t know where to attach the popover.
