Flutter: iPadだとshare_plusの共有アプリ一覧が表示されない

結論:sharePositionOriginプロパティを設定する

2022/9/20  Flutter エラー・バグ日記 

 

テキストやファイルの共有機能を実装できる「share_plus」パッケージのメソッド(「share」メソッドや「shareFiles」メソッド)が、いつの間にかiPadで動作しなくなっていることに気づいた。

 

本記事はライトな日記思考で書いているので、詳細説明はしておらず、基本、テキストのみで画像とかはあまり載せておりません。。m(_ _)m

解説記事ではないため、解決していない内容や、その時々の間違った解釈を述べてしまっている可能性が大いにありますので、何卒、ご了承ください。

 

以前は問題なく動作したのだが、パッケージやiOSのバージョンを更新したからだろうか。。

 

iPhone・Androidでは問題なく動作するが、iPadで「share」や「shareFiles」メソッドを実行しても、共有アプリの一覧画面が表示されず、何も起こらない。。

 

パッケージのReadmeにちゃんと書かれていた

調べると、かなり古い情報ではあるが、イシューが上がっていた。

 

 

これによると、iPadの場合は「sharePositionOrigin」プロパティを設定する必要があり、パッケージの説明に言及されているべきだ、とのコメントがあった(「share_plus」パッケージの前身である「share」パッケージに対するコメント)。

 

そこで、「share_plus」の「Readme」を見てみると、一番下にきちんと書かれていた(恥ずかしながら、完全に見落としていた、、)。

 

 

「Readme」に従い、コードを以下のように修正したところ、無事、共有アプリ一覧が表示されるようになった(以下は、「share」メソッドの例)。

 

// クラス・メソッド・プロパティについて、筆者が作成したものには、末尾に大文字のオー「O」をつけて表記
// ※パッケージで予め決められているものとの区別しやすくするため

final boxO = context.findRenderObject() as RenderBox?; // ← これを追加
await Share.share(
  "xxxxxxx", // シェアするテキスト
  sharePositionOrigin: boxO!.localToGlobal(Offset.zero) & boxO.size, // ← これを追加
);

 

sharePositionOriginは、iPadとMacでしか機能しない

そもそも「sharePositionOrigin」プロパティについて、理解していなかったので、「share_plus」のソースコードを確認すると、以下のように説明されていた。

 

オプションの sharePositionOrigin パラメータを使用して、iPad および Mac でポップオーバーする共有シートのグローバル原点矩形を指定できます。 他のデバイスには影響しません。

「share_plus」ソースコード(Google翻訳)

 

どうやら、共有アプリ一覧を表示する位置を指定するプロパティの模様。

 

iPhoneやAndroidなどのスマートフォンは、画面が小さいので、全体に表示するしか選択余地がないが、iPadやMacの場合は、画面が広く、共有アプリ一覧をどの部分に表示するかを決める必要がある(決めないと表示できない)、ということだと理解。

 

自分のアプリの場合、共有機能は、「PopupMenuButton」の項目選択で発動するようにしていたが、iPadでは「PopupMenuButton」のアイコン付近に、共有アプリ一覧が表示された。

 

恐らく、「Offset.zero」としたので、「PopupMenuButton」からの相対的位置ゼロの場所に表示されるのだろう。

 

表示位置については、「share_plus」パッケージの「Example」コード内のコメントにも、以下の説明があり、自分の状況とも合致していた(「Example」コードは、「ElevatedButton」を押すと共有機能が発動する仕様)。

 

ビルダーは、ElevatedButton のすぐ周囲のコンテキストを取得するために使用されます。

コンテキストの findRenderObject は、RenderObjectWidget でない場合、その子孫ツリーの最初の RenderObject を返します。 ElevatedButton の RenderObject は、ビルド後にその位置とサイズを持ちます。

https://pub.dev/packages/share_plus/example 内のコメント(Google翻訳)

 

当初、デバイスに関係しない実装上のミスかと思っていたが、iPhone・Androidでは正常動作したため、iPad特有の問題だと気づき、解決に至ることができた(そもそも、パッケージのReadmeを全て読んでいればよかったのだが、、、)。

 

同じiOSでも、iPhoneとiPadでは扱いが異なることを改めて認識。

 

\一般的なエラー対処法をまとめた記事はこちら/

 

リリースしたアプリ(全てFlutterで開発)

暗記用マーカー – シンプル穴埋め問題作成

Google Play で手に入れよう
Download on the App Store

 

超即ToDo –最短2タップで通知登録できるタスク管理アプリ

Google Play で手に入れよう
Download on the App Store

 

かんたんプリント管理:アラート・OCR文字認識・検索機能を搭載

Google Play で手に入れよう
Download on the App Store

 

シンプルメモ帳「BasicMemo」 – 文字カウント、ワンタッチ入力、タグ管理等の機能を搭載

Macのデスクトップ版もリリースしました。

Google Play で手に入れよう
Download on the App Store

 

個人アプリ開発で役立ったもの

おすすめの学習教材

超初心者向けでオススメな元Udemyの講座/

 

\Gitの基礎について無料で学べる/

 

おすすめの学習書籍

実用的image_pickerに関してかなり助けられた/

 

Dartの基礎文法を素早くインプットできる/


Dart入門 – Dartの要点をつかむためのクイックツアー

 

おすすめのソフトウェア

安くて高機能。アプリの独自ドメイン・紹介サイト構築に最適/

 

\アイコン作成・画面設計・クラウド保存…何でもできて超必須

 

おすすめのハードウェア

\リーズナブルな価格で検証端末を確保できる/

 

\目線の高さを調節しやすく、疲れにくい

 

\キータッチが超静音で心地よい/

 

おすすめのサポートアイテム

\部屋の中を仕切って、集中できる開発環境を作れる/

 

\部屋の中でも大き過ぎず、長時間座っても疲れない

 

\バグと格闘した後の肩こりを解消してくれる/

タイトルとURLをコピーしました