Flutter: share_plusのshareFilesメソッドの完了をawaitで待てない
結論:「shareFilesWithResults」メソッドを使う
2022/9/10 Flutter エラー・バグ日記
外部にファイル等を共有するのに便利な「share_plus」パッケージだが、「shareFiles」メソッドの発動後に、次の処理を実行したかった。
「shareFiles」メソッドは、Future<void>型なので、「async」と「await」を付ければ、次の処理を待てると思ったのだが、実際には、共有先アプリの一覧が表示される前に、次の処理が走ってしまった。
「then」を使ったが解消できず
そこで、以下のように、次の処理を「then」の中に書いてみた。
// クラス・メソッド・プロパティについて、筆者が作成したものには、末尾に大文字のオー「O」をつけて表記 // ※パッケージで予め決められているものとの区別しやすくするため await Share.shareFiles( filePathO, // 共有したいファイルの保存パス text: textO, // 共有したいテキスト subject: subjectO, // 共有時に表示するタイトル ).then(() { ***ここに次の処理*** });
残念ながら結果は変わらず。
共有先アプリの一覧が表示される前に、「then」内の処理が走ってしまう。。
調べると、こちらに同じ相談記事があった。
やはり「then」を使ってもうまく行かないので、別の方法を使うしか無いとのこと。
ソースコードとExampleにヒントがあった
諦めつつ、「share_plus」のソースコードを眺めてみると、「shareFilesWithResult」というメソッドがあることに気づく。
パッケージの「Example」ページにも使用例があり、シェアの結果(Future<ShareResult>型)を取得できるメソッドらしい。
早速、試したところ、想定どおり、共有先アプリの一覧が表示され、共有先アプリを選択した後に、次の処理を実行させることができた!
修正後のコードは以下のとおり。
await Share.shareFilesWithResult( filePathO, text: textO, subject: subjectO, ); ***ここに次の処理***
結果の返り値は使用する必要なく、「shareFilesWithResult」メソッドを使うだけで、次の処理を待たせることができた。
注意点:共有完了前に「cache」内の一時ファイルを消さない方が良い
但し、待ってくれるのは、あくまでも共有先のアプリを選択するところまでだった。
例えば、共有先としてGoogleドライブを選んだ場合、アップロード先のフォルダを選んでいる間に、次の処理が進んでしまう。
以下は、自分の失敗例。
「shareFiles」や「shareFilesWithResult」メソッドは、端末内の「cache/share_plus」フォルダ内(Androidの場合)に、共有ファイルを一時的に保存する。
この一時ファイルが、いつまでも残らないよう、共有メソッド発動後に削除処理を入れたのだが、これにより、Googleドライブへのアップロードが完了しなくなってしまった。
共有先にメールアプリを選んだ場合は、問題なくメールに添付できる場合と、添付ファイルが消えてしまい、添付できない場合とがあった。
恐らくファイルの容量が重いと、添付処理よりも先に、「cache」フォルダ内の削除処理が終わってしまうため、添付できなかった模様。
そのため、「cache」フォルダ内の削除は、画面遷移時など、別のタイミングで行うことで解消した。
\一般的なエラー対処法をまとめた記事はこちら/
リリースしたアプリ(全てFlutterで開発)
個人アプリ開発で役立ったもの
おすすめの学習教材
\超初心者向けでオススメな元Udemyの講座/
\キャンペーン時を狙えば安価で網羅的な内容が学べる(日本語訳あり)/
\Gitの基礎について無料で学べる/
おすすめの学習書籍
\実用的。image_pickerに関してかなり助けられた/
\Dartの基礎文法を素早くインプットできる/