Index
フローティングボタンを押下すると、クリップボードに貼り付けられている画像を表示するアプリです。
webアプリケーションでしか動作を確認していませんので、ご注意ください。
pasteboardというパッケージを使用しました。
他にもクリップボードからデータをとってくるパッケージは存在するのですが、画像データをとってこれるパッケージは少なかった印象があります。
imageメソッドを使っていきます。
クリップボードにimageデータ以外のデータが入っているとnullを返すので、処理する必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
@override Future<Uint8List?> get image async { try { final clipboardItems = await promiseToFuture(_readClipboard()) as List<dynamic>; for (var clipboardItem in clipboardItems.cast<ClipboardItem>()) { if (clipboardItem.types.contains('image/png')) { final Blob blob = await promiseToFuture(clipboardItem.getType('image/png')); return _readBlobAsArrayBuffer(blob); } } } catch (e) { return null; } return null; } |
以下のコードをmain.dartにコピペし、pub get すれば
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
import 'package:flutter/material.dart'; import 'package:pasteboard/pasteboard.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: const MyHomePage(title: 'Flutter Demo Home Page'), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({super.key, required this.title}); final String title; @override State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { var _image; Future<void> _captureImage() async { final imageBytes = await Pasteboard.image; if (imageBytes != null) { setState(() { _image = imageBytes; }); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Center( child: _image != null ? Image.memory(_image) : Container( color: Colors.blueGrey, ), ), floatingActionButton: FloatingActionButton( onPressed: _captureImage, tooltip: 'captureImage', child: const Icon(Icons.add), ), ); } } |
クリップボードから画像データを受け取るコードは以下の通りです。
画像データ以外がクリップボードに入っていた場合は何もしない実装にしています。
1 2 3 4 5 6 7 8 |
Future<void> _captureImage() async { final imageBytes = await Pasteboard.image; if (imageBytes != null) { setState(() { _image = imageBytes; }); } } |
Image,memory()にクリップボードから取得できたデータをつっこんであげると画像として表示されます。
1 2 3 4 5 6 7 |
body: Center( child: _image != null ? Image.memory(_image) : Container( color: Colors.blueGrey, ), ), |