【Flutter】share_plusで共有シートを出す

Flutter

share_plusとは

share_plusは、Flutterアプリからプラットフォームの共有ダイアログを通じてコンテンツを共有するためのプラグインです。
AndroidではACTION_SENDインテント、iOSではUIActivityViewController、その他のプラットフォームではそれぞれの共有方法をラップしています。

share_plus | Flutter package
Flutter plugin for sharing content via the platform share UI, using the ACTION_SEND intent on Android and UIActivityView...

使い方

1. インストール

pubspec.yamlファイルに以下の依存関係を追加します:

dependencies:
  flutter:
    sdk: flutter
  share_plus: ^9.0.0

2. 使用方法

インポート

使用するには、まずライブラリをインポートします:

import 'package:share_plus/share_plus.dart';

テキストの共有

任意の場所でshareメソッドを呼び出してテキストを共有できます:

Share.share('check out my website https://example.com');

shareメソッドはオプションのsubjectパラメータも取ります。メールで共有する際に使用されます:

Share.share('check out my website https://example.com', subject: 'Look what I made!');

shareメソッドはユーザーのアクション結果を確認できるShareResultオブジェクトを返します:

final result = await Share.share('check out my website https://example.com');

if (result.status == ShareResultStatus.success) {
    print('Thank you for sharing my website!');
}

ファイルの共有

1つまたは複数のファイルを共有するには、shareXFilesメソッドを使用します。メソッドはShareResultを返します。オプションで、subjecttext、およびsharePositionOriginを渡すことができます:

final result = await Share.shareXFiles(
  [XFile('${directory.path}/image.jpg')],
  text: 'Great picture'
);

if (result.status == ShareResultStatus.success) {
    print('Thank you for sharing the picture!');
}

final result = await Share.shareXFiles(
  [XFile('${directory.path}/image1.jpg'), XFile('${directory.path}/image2.jpg')]
);

if (result.status == ShareResultStatus.dismissed) {
    print('Did you not like the pictures?');
}

Web上では、SharePlus.shareXFiles()を使用できます。Web Share APIが利用可能な場合はそれを使用し、そうでない場合は共有ファイルのダウンロードにフォールバックします:

Share.shareXFiles([XFile('assets/hello.txt')], text: 'Great picture');

URIの共有

iOSでは、UIActivityViewControllerを使用してURIからメタデータを取得することがサポートされています。この特殊なメソッドはiOSでのみ適切にサポートされています:

Share.shareUri(uri: uri);

3. 共有結果の確認

3つの共有メソッド(shareshareXFilesshareUri)はすべてShareResultオブジェクトを返します。このオブジェクトには次の情報が含まれます:

  • status: ShareResultStatus
  • raw: 共有結果を説明する文字列(例:オープニングアプリID)

注:プラットフォームがユーザーアクションの識別をサポートしていない場合、statusShareResultStatus.unavailableになります。

4. 既知の問題

XFile.fromDataで作成したデータの共有

XFile.fromDataで作成したデータを共有する場合、プラグインは一時ファイルをアプリのキャッシュディレクトリ内に書き込みます。このファイルは共有するために使用されます。OSがこれらのファイルを削除するはずですが、定期的に(例:アプリ起動時に)データをクリーンアップすることをお勧めします。

このディレクトリにはpath_providerを使用してアクセスできます。

import 'package:path_provider/path_provider.dart';

final directory = await getTemporaryDirectory();

または、XFile.fromDataを使用せず、データをファイルに書き込んでから共有することで、削除のタイミングを制御できます。

モバイルプラットフォーム(AndroidとiOS)

Meta(WhatsApp、Instagram、Facebook Messenger)などのアプリでは、Meta/Facebookの制限により、データの共有が信頼性を持って行われないことがあります。この機能が必要な場合は、ネイティブのFacebook Sharing SDKを確認するか、これを実装している他のFlutterプラグインを探してください。

他のアプリでも、共有機能に関して問題が発生する可能性があります。特定のアプリとの互換性に関するバグ報告はすべてクローズされます。

Appleプラットフォームでのローカライゼーション

共有シートが異なる言語で表示される場合があります。この問題を修正するには、プロジェクトのinfo.plistCFBundleAllowMixedLocalizationsCFBundleDevelopmentRegionキーを設定します。

iPad

share_plusでは、iPadユーザーがsharePositionOriginパラメータを提供する必要があります。これを提供しないと、iPadで動作せず、クラッシュやUIが応答しなくなる可能性があります。

// コンテキストを取得するためにBuilderを使用
Builder(
  builder: (BuildContext context) {
    return ElevatedButton(
      onPressed: () => _onShare(context),
      child: const Text('Share'),
    );
  },
),

// _onShareメソッド:
final box = context.findRenderObject() as RenderBox?;

await Share.share(
  text,
  subject: subject,
  sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
);

Buy me a coffee!

Flutterアプリ開発
シェアする
sogaをフォローする
タイトルとURLをコピーしました