こんな感じのテキストをシェアするアプリを作ります(これはアプリと言っていいのか...?w)
シェアする機能を使うために、share というライブラリを使います。
pubspec.yamlにshareを追加する
# コマンドを実行する
$ flutter pub add share
or
# pubspec.yamlに直接書き込む
dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.2
# 追加
share: ^2.0.4
AppBarのシェアアイコンで共有できるようにする
Share.share()
に共有したいテキストを渡します。
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Share Sample'),
actions: [
// シェアボタン
IconButton(
icon: Icon(Icons.share),
// シェアボタンをクリックしたときに呼ばれる処理
onPressed: () => _share(),
),
],
),
);
}
void _share() => Share.share('共有するテキスト');
これでAppBar
のシェアアイコンをクリックすると、共有するためのボトムシートが表示されます。
r(Hot reload)
またはR(Hot restart)
したときに以下のエラーが発生したら、一度アプリを止めてflutter run
を実行すれば、エラーが消えると思います。
E/flutter (28335): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: MissingPluginException(No implementation found for method share on channel plugins.flutter.io/share)
E/flutter (28335): #0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:156:7)
E/flutter (28335): <asynchronous suspension>
また、シェアするテキストが空だと、エラーが発生します。
'package:share/share.dart': Failed assertion: line 40 pos 12: 'text.isNotEmpty': is not true.
全体のコード
import 'package:flutter/material.dart';
import 'package:share/share.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Share Sample',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Share Sample'),
actions: [
IconButton(
icon: Icon(Icons.share),
onPressed: () => _share(),
),
],
),
);
}
void _share() => Share.share('');
}