Flutter安全剪贴板操作插件safe_clipboard的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter安全剪贴板操作插件safe_clipboard的使用

目的

在iOS 14+和Android 12+中,当应用程序读取剪贴板时,系统会通知用户。一些应用程序会在应用启动或从后台恢复时检查剪贴板,以执行某些特殊操作。这可能会导致每次打开应用时都弹出通知。

Safe Clipboard 插件提供了一种仅在剪贴板内容匹配特定模式时才读取剪贴板的功能,从而避免频繁的通知提醒。

使用步骤

1. 添加依赖

pubspec.yaml 文件中添加 safe_clipboard 依赖:

dependencies:
  flutter:
    sdk: flutter
  safe_clipboard: ^latest_version

替换 ^latest_version 为最新的版本号。

2. 导入包

在 Dart 文件中导入 safe_clipboard 包:

import 'package:safe_clipboard/safe_clipboard.dart';
3. 使用示例

以下是一个完整的示例代码,展示了如何使用 Safe Clipboard 插件来安全地读取和设置剪贴板内容。

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:safe_clipboard/safe_clipboard.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  TextEditingController textEditingController = TextEditingController();
  String _lastValue = 'None';

  /// 读取剪贴板内容
  Future<void> getClipboard({
    iOSDetectionPattern? iOSDetectionPattern,
    AndroidClipMimeType? androidClipMimeType,
  }) async {
    String clipboardValue;
    try {
      // 尝试读取剪贴板内容,根据平台和模式进行匹配
      clipboardValue = await SafeClipboard.get(
        iOSDetectionPattern: iOSDetectionPattern,
        androidClipMimeType: androidClipMimeType,
      ) ?? 'Null response';
    } on PlatformException {
      clipboardValue = 'Failed to get clipboard data';
    }

    if (!mounted) return;

    setState(() {
      _lastValue = clipboardValue;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('SafeClipboard Example App'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(8),
          child: ListView(
            children: [
              const SizedBox(height: 10),
              Text('上次读取的内容: $_lastValue'),
              const SizedBox(height: 10),
              ElevatedButton(
                child: const Text('读取剪贴板'),
                onPressed: () {
                  getClipboard();
                },
              ),
              const SizedBox(height: 10),
              const Text('常见的 iOS 测试用例'),
              ElevatedButton(
                child: Text(
                    '读取剪贴板 (可能的网页 URL)'),
                onPressed: () {
                  getClipboard(
                    iOSDetectionPattern: iOSDetectionPattern.probableWebURL,
                  );
                },
              ),
              ElevatedButton(
                child: Text(
                    '读取剪贴板 (可能的搜索查询)'),
                onPressed: () {
                  getClipboard(
                    iOSDetectionPattern: iOSDetectionPattern.probableWebSearch,
                  );
                },
              ),
              ElevatedButton(
                child: Text(
                    '读取剪贴板 (数字)'),
                onPressed: () {
                  getClipboard(
                    iOSDetectionPattern: iOSDetectionPattern.number,
                  );
                },
              ),
              const SizedBox(height: 20),
              const Text('常见的 Android 测试用例'),
              ElevatedButton(
                child: Text(
                    '读取剪贴板 (HTML 文本)'),
                onPressed: () {
                  getClipboard(
                    androidClipMimeType: AndroidClipMimeType.textHtml,
                  );
                },
              ),
              ElevatedButton(
                child: Text(
                    '读取剪贴板 (纯文本)'),
                onPressed: () {
                  getClipboard(
                    androidClipMimeType: AndroidClipMimeType.textPlain,
                  );
                },
              ),
              ElevatedButton(
                child: Text(
                    '读取剪贴板 (Intent)'),
                onPressed: () {
                  getClipboard(
                    androidClipMimeType: AndroidClipMimeType.intent,
                  );
                },
              ),
              ElevatedButton(
                child: Text(
                    '读取剪贴板 (URI 列表)'),
                onPressed: () {
                  getClipboard(
                    androidClipMimeType: AndroidClipMimeType.uriList,
                  );
                },
              ),
              ElevatedButton(
                child: Text(
                    '读取剪贴板 (未知类型)'),
                onPressed: () {
                  getClipboard(
                    androidClipMimeType: AndroidClipMimeType.unknown,
                  );
                },
              ),
              const SizedBox(height: 20),
              ElevatedButton(
                child: const Text('将剪贴板设置为 https://www.google.com/'),
                onPressed: () {
                  Clipboard.setData(
                      const ClipboardData(text: 'https://www.google.com/'));
                },
              ),
              ElevatedButton(
                child: const Text('将剪贴板设置为 "cheap flights"'),
                onPressed: () {
                  Clipboard.setData(const ClipboardData(text: 'cheap flights'));
                },
              ),
              ElevatedButton(
                child: const Text('将剪贴板设置为 "42"'),
                onPressed: () {
                  Clipboard.setData(const ClipboardData(text: '42'));
                },
              ),
              const SizedBox(height: 20),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter安全剪贴板操作插件safe_clipboard的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter安全剪贴板操作插件safe_clipboard的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用safe_clipboard插件来进行安全剪贴板操作的代码案例。safe_clipboard插件允许你以更安全的方式读取和写入剪贴板数据,特别是在处理敏感信息时。

首先,确保你已经在pubspec.yaml文件中添加了safe_clipboard依赖:

dependencies:
  flutter:
    sdk: flutter
  safe_clipboard: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter应用中如下使用safe_clipboard插件:

import 'package:flutter/material.dart';
import 'package:safe_clipboard/safe_clipboard.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Safe Clipboard Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SafeClipboardExample(),
    );
  }
}

class SafeClipboardExample extends StatefulWidget {
  @override
  _SafeClipboardExampleState createState() => _SafeClipboardExampleState();
}

class _SafeClipboardExampleState extends State<SafeClipboardExample> {
  final SafeClipboard _safeClipboard = SafeClipboard();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Safe Clipboard Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () async {
                // 写入敏感数据到剪贴板
                String sensitiveData = "Sensitive Information";
                bool success = await _safeClipboard.writeText(sensitiveData);
                if (success) {
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text('Data copied to clipboard')),
                  );
                } else {
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text('Failed to copy data')),
                  );
                }
              },
              child: Text('Copy Sensitive Data'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                // 从剪贴板读取敏感数据
                String? data = await _safeClipboard.readText();
                if (data != null) {
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text('Data read from clipboard: $data')),
                  );
                } else {
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text('No data in clipboard')),
                  );
                }
              },
              child: Text('Read Data from Clipboard'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,它包含两个按钮:一个用于将敏感数据写入剪贴板,另一个用于从剪贴板读取数据。

  • writeText 方法用于将字符串数据写入剪贴板。如果操作成功,它会返回true,否则返回false
  • readText 方法用于从剪贴板读取字符串数据。如果剪贴板中有数据,它会返回该数据,否则返回null

通过这种方式,你可以更安全地处理剪贴板中的数据,特别是在处理敏感信息时。safe_clipboard插件提供了一种更安全的机制来避免潜在的安全风险,例如剪贴板数据被其他应用恶意读取。

回到顶部