【Flutter】Share plugin の使い方

こんにちは、株式会社Pentagonでアプリ開発をしている山田です。
https://pentagon.tokyo
今日は、Share pluginの使い方についてまとめていきます。

目次

1. Share plugin とは?

これは、Flutter Community Plus Plugins というFlutter 公式のコミュニティーが作成しているプラグインの一つです。
Share pluginの機能としましては、各種プラットフォーム(email, SMS, SNS etc...)を通して、テキストや画像を送る為のプラグインとなっています。

2. インストール方法

こちらは、パッケージの Installing セクションにも書かれていますが、pubspec.yaml ファイルに以下の文言を記載します。その後、pub get をしてパッケージを取得します。

dependencies:
 share: ^2.0.4

3.実装方法

今回実装方法を説明する際に、以下のようなサンプルを作成しました。この画面を元に解説をしていきます。

https://assets.st-note.com/production/uploads/images/56674759/picture_pc_a73dfb1c50d6d698d21be0c94708116f.png?width=800
https://assets.st-note.com/production/uploads/images/56674914/picture_pc_3fc3b3065ef73bacb6b721ccca2242c2.png?width=800

gmail でShareを行うと、以下のようになります。

https://assets.st-note.com/production/uploads/images/56675085/picture_pc_43a656cccd216a4b084ed2df1f44ad8e.png?width=800

3.1 Share buttonの実装

こちらがShare button のコードになります。

  _onShare(BuildContext context) async {
   final RenderBox box = context.findRenderObject() as RenderBox;

   if (imagePaths.isNotEmpty) {
     await Share.shareFiles(imagePaths,
         text: text,
         subject: subject,
         sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size);
   } else {
     await Share.share(text,
         subject: subject,
         sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size);
   }
 }

各Form で入力した値を、_onShare()へ渡しています。そして、shareFiles()を用いて、指定した画像(imagePaths)、テキスト(text)、タイトル(subject)の値を渡します。text: ここにはSNSやメールに対する本文へ値が入ります。subject: ここには、メールだとタイトルに値が入ります。sharePositionOrigin: これは、iPadのみに有効なパラメータです。共通で使用されるshareボタンの一覧シートの位置を指定することができます。例として、このパラメータの有無を画像にしました。
sharePositionOriginで一覧シートの位置を指定した場合

https://assets.st-note.com/production/uploads/images/56678074/picture_pc_d487bc3b77e944186ced0656a049728e.png?width=800

sharePositionOriginで一覧シートの位置を指定しなかった場合以下のようなコードでもう一度動かしてみます。

  _onShare(BuildContext context) async {
   final RenderBox box = context.findRenderObject() as RenderBox;

   if (imagePaths.isNotEmpty) {
     await Share.shareFiles(imagePaths,
         text: text,
         subject: subject);
   } else {
     await Share.share(text,
         subject: subject);
   }
 }

https://assets.st-note.com/production/uploads/images/56678162/picture_pc_d48c9c31f1c25ceaffaa42cecaf0d1c2.png?width=800

この様に、一覧シートが左上から表示されていることが分かります。

3.2 各種SNSでの実際のShareについて

以下の画像の様なデータをShare pluginで各種SNS(Twitter, FaceBook, LINE, Instagram)でシェアを試みた場合を示します。

https://assets.st-note.com/production/uploads/images/56833359/picture_pc_32cb1a7bfc1296a8eae7e1aa6d6da1e9.png?width=800

Twitterの場合

https://assets.st-note.com/production/uploads/images/56833469/picture_pc_c56302e41bb02c38c5d10500a63c5e0a.png?width=800

LINEの場合

https://assets.st-note.com/production/uploads/images/56833535/picture_pc_85f5e775b462e921f79b93c1d490e6b7.png?width=800

FaceBookの場合

https://assets.st-note.com/production/uploads/images/56833687/picture_pc_186681ea6bd44de2083e5f3b1ecbbe59.png?width=800

Instagramの場合

https://assets.st-note.com/production/uploads/images/56833749/picture_pc_43fd02c3be5c3633a2d051993b1a32de.png?width=800

3.3 URLから画像を取得する際

以下のリンクからサンプル画像を取得します。

 final _url = 'https://picsum.photos/250?image=9';

URLから画像を取得するときのコードは次のとおりです。

Future<void> _download() async {
   final response = await http.get(Uri.parse(_url));

   final imageName = "test.jpg";
   final appDir = await pathProvider.getApplicationDocumentsDirectory();

   final localPath = path.join(appDir.path, imageName);

   final imageFile = File(localPath);
   await imageFile.writeAsBytes(response.bodyBytes);

   setState(() {
     _localPath = localPath;
   });
 }

LINEへ送信すると、次の様に送れることが確認できました。

https://assets.st-note.com/production/uploads/images/56879412/picture_pc_50b3c4b16119dd6119c4c9f8b6ae2c6d.jpg?width=800

4. 参考資料

今回用いたソースコードの全容は、下記のリポジトリにありますので、知りたい方はご確認をお願いします。

採用情報はこちら
目次