Flutter桌面端開發——復制和粘貼內容


注意:查看本文章前請先查看更新日志,以至於該文章適合插件的最新版本

更新日志
詳情 日期
更新了插件的版本號 2023-08-13
更新了pasteboard在0.1.0版本的用法 2022-05-30
更新了screen_text_extractor在0.1.1版本的用法 2022-05-10

復制和粘貼這個功能,一般系統都自帶,簡單的按幾個鍵就能完成。但是有時候我們想要自己在應用中集成這個功能,或者想在用戶復制文字后不使用粘貼操作,就讓復制的內容直接出現在我們的應用中。想要實現該功能,就可以用我今天介紹的幾個插件。

screen_capturer

這個方法是用來截取屏幕的。本來想寫一期介紹截屏插件的,但是找了一圈只找到這個適用於桌面端,只寫這一個插件篇幅又太短,所以直接加了進來。

安裝🛠

點擊screen_capturer獲取最新版本。以下是在編寫本文章時的最新版本:

screen_capturer: ^0.1.6

使用🥟

該插件的主體是 ScreenCapturer.instance ,其下有3個方法:isAccessAllowed 、requestAccess 和 capture。

isAccessAllowed 和 requestAccess僅在 macOS中適用,分別用來檢測和申請截圖的權限。

await ScreenCapturer.instance.requestAccess();  // 申請權限
bool _isAllowed = await ScreenCapturer.instance.isAccessAllowed ();  // 檢測是否擁有權限

我們截圖的目的是把圖片顯示出來,所以在正式截圖前先定義個圖片路徑的參數:

String _image;

接下來介紹截圖的主要方法 capture,該方法可以傳遞2個參數:

  • String? imagePath:該屬性為必填,傳遞一個圖片保存的路徑和名稱
  • bool silent:設置是否開啟截屏的提示音
String _imageName = '${DateTime.now().millisecondsSinceEpoch}.png';  // 設置圖片名稱
String _imagePath = 'C:\\Users\\ilgnefz\\Pictures\\$_imageName';  // 設置圖片保存的路徑
CapturedData? _capturedData = await ScreenCapturer.instance.capture(imagePath: _imagePath);
if (_capturedData != null) {
  _image = _capturedData.imagePath;
  setState(() {});
} else {
  BotToast.showText(text: '截圖被取消了');
}

1

通過運行可以發現,這里調用的其實是系統的截圖功能,然后將截取的圖片進行了保存。和windows自帶的截圖又有些差別,自帶的只會將截圖保存到剪切板中。

新版的添加了readImageFromClipboard方法用來讀取剪切板的圖片,該方法返回一個 Uint8List 類型的數據,關於將Uint8List轉換為可顯示的圖片請參考Flutter學習:使用CustomPaint繪制圖片

screen_text_extractor

安裝🛠

點擊screen_text_extractor獲取最新版本。以下是在編寫本文章時的最新版本:

screen_text_extractor: ^0.1.3

使用🥟

在使用前先實例化該對象

final screenTextExtractor = ScreenTextExtractor.instance;

實例化后的對象有以下3個方法:

  1. extract:主要獲取剪切板內容的方法
  2. isAccessAllowed:檢測是否有進行相關操作的權限,僅macOS
  3. requestAccess:申請進行相關操作的權限,僅macOS

后面2個僅macOS使用的方法和screen_capturer一樣,這里就不多贅述。

我們先定義一個String對象用來顯示獲取到的內容:

String? _text;
void _getClipboardText() async {
  ExtractedData? data = await screenTextExtractor.extract(mode: ExtractMode.clipboard);
  _setText(data);
}

注意:mode 一共有兩個值,分別是 ExtractMode.clipboard 和 ExtractMode.screenSelection(不建議使用,flutter會報錯)

接下來我們讓獲取的內容顯示出來

void _setText(ExtractedData? data) {
  if (data == null) {
    BotToast.showText(text: '剪切板什么都沒有🤨');
  } else {
    if (_text == data.text) {
      BotToast.showText(text: '換個內容再粘貼吧🥱');
    } else {
      _text = data.text;
      _type = ClipboardType.text;
      setState(() {});
    }
  }
}

我們先在 windows 中按 windows鍵 + v 來調出剪切板,清空

image

然后來粘貼一下

image

我們現在復制一段內容:

image

然后看看效果:

image

獲取成功😀,但是剪切板除了能存儲文本,還是能存儲圖片的。

image

但是ExtractedData只有個text屬性,我們來看下會發生什么:

image

直接為空了😶

pasteboard

安裝🛠

點擊pasteboard獲取最新版本。以下是在編寫本文章時的最新版本:

pasteboard: ^0.1.0

使用🥟

該插件中的 Pasteboard 對象一共擁有4個方法:

  • image:復制圖片。僅iOS
  • writeImage:粘貼圖片。僅iOS
  • text:復制文本
  • writeText:粘貼文本
  • file:復制文件(也可以復制文本)
  • writeFile:粘貼文件(也可以粘貼文本)

復制粘貼文本

當然,第一步先定義一個用來存儲結果的變量:

String _text = '還沒粘貼任何內容';

定義一個文本控制器,用來獲取輸入的內容:

final TextEditingController _controller = TextEditingController();

接下來使用 pasteboard 來實現復制和粘貼的功能:

  • 復制文本

    void _copyText() async {
      if (_controller.text.isEmpty) {
        BotToast.showText(text: '啥都沒輸入,你要我復制什么🥴');
      } else {
        Pasteboard.writeText(_controller.text);
      }
    }
    
  • 粘貼文本

    void _pastText() async {
      String? results = await Pasteboard.text;
      _text = results ?? '';
      setState(() {});
    }
    

我們先來試一下,不用復制直接直接粘貼會發生什么。此時我的剪切板有一條內容:

image

我們可以發現,它可以直接讀取我們剪切板剛復制的內容。試下復制再粘貼:

image

成功。我們再來看看剪切板有沒有記錄:

image

通過以上可得,writeText方法會將復制的文本內容存儲到系統粘貼板上。

復制粘貼文件

writeFilewriteText一樣,都是復制String類型,雖然名稱叫writeFile,但是在我們自己開發的軟件中一般用不到,所以復制文件我們直接使用系統的就行。

以下是粘貼文件的代碼:

void _pastText() async {
  final results = await Pasteboard.files();
  if (results.isNotEmpty) {
    _text = '';
    for (final result in results) {
      _text += '$result\n';
    }
    setState(() {});
  } else {
    BotToast.showText(text: '我什么都不能給你,因為我也咩有😭');
  }
}

在這里,我使用了 url_launcher 插件,用來打開系統的文件瀏覽器。代碼如下:

void _openExplorer() async {
  const _filePath = r'C:\Users\ilgnefz\Pictures';
  final Uri _uri = Uri.file(_filePath);
  await launch(_uri.toString());
}

來看看效果:

image

clipboard

安裝🛠

點擊clipboard獲取最新版本。以下是在編寫本文章時的最新版本:

clipboard: ^0.1.3

使用🥟

該插件擁有4個方法:

  • controlC:模仿 cttr + c 鍵,復制
  • controlC:模仿 cttr + v 鍵,粘貼
  • copy:復制
  • paste:粘貼

先來看看前面兩個方法:

void _useCtrC() async {
  if (_controller.text.isEmpty) {
    BotToast.showText(text: '啥都沒輸入,你要我復制什么🥴');
  } else {
    await FlutterClipboard.controlC(_controller.text);
  }
}

void _useCtrV() async {
  ClipboardData result = await FlutterClipboard.controlV();
  _text = result.text.toString();
  setState(() {});
}

使用 controlV 會返回一個 ClipboardData 對象。

4

后面兩個方法和前面的唯一不同,就是返回的是一個 String 對象:

void _useCopy() async {
  if (_controller.text.isEmpty) {
    BotToast.showText(text: '啥都沒輸入,你要我復制什么🥴');
  } else {
    await FlutterClipboard.copy(_controller.text);
  }
}

void _usePaste() async {
  _text = await FlutterClipboard.paste();
  setState(() {});
}

5

我們打開系統的剪切板可以發現,以上復制的內容都會被記錄。我們試一下不按復制看能不能直接讀取剪切板的信息進行粘貼:

6

試試 paste 方法:

7

🛫OK,以上就是這篇文章的全部內容,僅針對插件的當前版本,並不能保證適用於以后插件用法的更新迭代。

最后,感謝 leanflutterMixin Network 兩個團隊還有 samuelezedi 對以上插件的開發和維護😁。本應用代碼已上傳至 githubgitee,有需要的可以下載下來查看學習。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM