Flutter: share_plusのshareFilesメソッドの完了をawaitで待てない

結論:「shareFilesWithResults」メソッドを使う

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

外部にファイル等を共有するのに便利な「share_plus」パッケージだが、「shareFiles」メソッドの発動後に、次の処理を実行したかった。

 

「shareFiles」メソッドは、Future<void>型なので、「async」と「await」を付ければ、次の処理を待てると思ったのだが、実際には、共有先アプリの一覧が表示される前に、次の処理が走ってしまった。

 

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

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

 

「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の学習で役立ったコンテンツ・書籍 /

 

 

 


Dart入門 – Dartの要点をつかむためのクイックツアー
タイトルとURLをコピーしました