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で開発)

 

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

おすすめの学習教材

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

 

 \キャンペーン時を狙えば安価で網羅的な内容が学べる(日本語訳あり)/

 

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

 

おすすめの学習書籍

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

 

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


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

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