share_plusとは
share_plus
は、Flutterアプリからプラットフォームの共有ダイアログを通じてコンテンツを共有するためのプラグインです。
AndroidではACTION_SEND
インテント、iOSではUIActivityViewController
、その他のプラットフォームではそれぞれの共有方法をラップしています。
使い方
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
を返します。オプションで、subject
、text
、および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つの共有メソッド(share
、shareXFiles
、shareUri
)はすべてShareResult
オブジェクトを返します。このオブジェクトには次の情報が含まれます:
status
:ShareResultStatus
raw
: 共有結果を説明する文字列(例:オープニングアプリID)
注:プラットフォームがユーザーアクションの識別をサポートしていない場合、status
はShareResultStatus.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.plist
にCFBundleAllowMixedLocalizations
とCFBundleDevelopmentRegion
キーを設定します。
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,
);