fluttercommunity / fluttercommunity/plus_plugins

[Request]: share_plus: option to present the iPad share sheet without a popover arrow

Open
#3,973 0 comments 0 reactions 0 assignees View on GitHub
enhancement triage
Dominant language
Dart
Stars
1.9k
Forks
1.3k
PR merge metrics
No merged PRs in 30d

Description

### Plugin

share_plus

### Use case

On iPad the share sheet is a popover, and a popover has an arrow pointing at whatever rect was passed as `sharePositionOrigin`. That is right when the sheet was opened from a visible control. It is wrong whenever there is no such control: a keyboard shortcut, a finished background export, an action whose source has already scrolled away. Any rect passed in those cases is arbitrary, and iPadOS then draws an arrow pointing at a spot the user never touched.

Since 13.3.0 the plugin centres the sheet when no origin is given, which is the correct position — the arrow still points into empty space next to it.

There is no way around this from application code: `ShareParams` exposes `sharePositionOrigin` and nothing else that reaches `UIPopoverPresentationController`, and `permittedArrowDirections` does not appear anywhere in the iOS plugin. Other share packages on pub.dev wrap the same `UIActivityViewController`, so they inherit the same behaviour.

This was previously requested in #359 (July 2021), which the stale bot closed in June 2022 without any human reply; that issue is now locked, so I could not comment there. flutter/flutter#74552 asks for the same thing and is still open. Both name the same reference: the export sheet in Procreate, which is centred and arrow-free.

### Proposal

Expose the arrow configuration, ignored on every platform other than iOS/macOS. Two parts that can be judged separately:

**1. Pass `permittedArrowDirections` through.** Fully documented and mechanical. [`permittedArrowDirections`](https://developer.apple.com/documentation/uikit/uipopoverpresentationcontroller/permittedarrowdirections) is settable since iOS 8 and defaults to `any`; [`UIPopoverArrowDirection`](https://developer.apple.com/documentation/uikit/uipopoverarrowdirection) is an `OptionSet`, so `up`/`down`/`left`/`right` map one-to-one.

**2. An option for "centred, no arrow".** This is the part that closes the request, and the implementation deserves a decision rather than a guess, so here is what I measured on an iPad Air 13-inch (M4) simulator, iPadOS 26.5, presenting a `UIActivityViewController` exactly as the plugin does:

- **An empty option set works.** With `popover.permittedArrowDirections = []` and a 2×2 `sourceRect` in the centre of the view, the sheet appears centred with no arrow at all, and [`arrowDirection`](https://developer.apple.com/documentation/uikit/uipopoverpresentationcontroller/arrowdirection) reads `0` afterwards. It is not *documented* to work, though — Apple describes `unknown` only as "The status of the arrow is currently unknown" and says nothing about suppression.
- **`sourceItem` does not help.** The docs say that for [`sourceItem`](https://developer.apple.com/documentation/uikit/uipopoverpresentationcontroller/sourceitem), "In iOS 26 and later, the popover animates from and replaces the specified item" — but that paragraph is about `UIBarButtonItem`/`NSToolbarItem`. Anchoring to a plain `UIView`, which [`UIPopoverPresentationControllerSourceItem`](https://developer.apple.com/documentation/uikit/uipopoverpresentationcontrollersourceitem) also accepts, still drew an arrow on iPadOS 26.5 (`arrowDirection` = `2`, i.e. `down`). So the iOS 26 behaviour does not generalise to view items, and Flutter apps have no bar item to anchor to.

I am aware CONTRIBUTING rules out features covering only one platform, and an arrow only exists on iOS and macOS. `sharePositionOrigin` has exactly the same scope, so there is precedent for a platform-specific parameter here — but I would rather ask than assume. Happy to implement whichever half you consider acceptable.

Contributor guide

Open the contributing guide

Research direction

Start at the share_plus iOS/macOS UIActivityViewController presentation entry point and inspect how ShareParams.sharePositionOrigin reaches UIPopoverPresentationController. Decide whether to expose permittedArrowDirections, the centered no-arrow option, or both, then add platform-specific coverage and documentation demonstrating the selected behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
dart, flutter, ios, macos
Domain
desktop, mobile
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.