Flutter: iPadだとshare_plusの共有アプリ一覧が表示されない
結論:sharePositionOriginプロパティを設定する
2022/9/20 Flutter エラー・バグ日記
テキストやファイルの共有機能を実装できる「share_plus」パッケージのメソッド(「share」メソッドや「shareFiles」メソッド)が、いつの間にかiPadで動作しなくなっていることに気づいた。
以前は問題なく動作したのだが、パッケージや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で開発)
個人アプリ開発で役立ったもの
おすすめの学習教材
\超初心者向けでオススメな元Udemyの講座/
\キャンペーン時を狙えば安価で網羅的な内容が学べる(日本語訳あり)/
\Gitの基礎について無料で学べる/
おすすめの学習書籍
\実用的。image_pickerに関してかなり助けられた/
\Dartの基礎文法を素早くインプットできる/