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

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

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をコピーしました