Flutter屏幕截图插件screenshot_plus的使用

Flutter屏幕截图插件screenshot_plus的使用

Screenshot Plus 是一个用于在 Android 和 iOS 上截屏的 Dart 包。该包提供了一个简单的 API 来捕获当前屏幕并将其保存为设备存储中的图像文件。捕获的图像可以用于各种目的,如分享、打印或分析应用行为。该插件易于使用,并且可以与现有的 Flutter 项目无缝集成。此插件会保存图像并返回路径。它几乎适用于所有版本的 Android 或 iOS。

安装

在终端运行以下命令:

flutter pub add screenshot_plus

或者在 pubspec.yaml 文件中添加以下内容:

dependencies:
  screenshot_plus:

Android

你必须授予写入权限到存储:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

将其添加到 android/src/main/AndroidManifest.xml 文件中。

还需要向 <application> 标签添加一个属性以修复写入 EXTERNAL_STORAGE 的权限问题:

android:requestLegacyExternalStorage="true"

iOS

如果你不在 ios/Runner/Info.plist 文件中添加以下内容,应用程序将会崩溃:

<key>NSPhotoLibraryAddUsageDescription</key>
<string>Take pretty screenshots and save it to the PhotoLibrary.</string>

使用

首先导入库:

import 'package:screenshot_plus/screenshot_plus.dart';

然后进行截图:

// 获取绝对路径
String path = await ScreenshotPlus.takeShot();
debugPrint('Screenshot taken: $path');

在错误情况下,函数将返回空路径。要显示捕获的图像,请使用以下小部件:

// imageFilepath 是绝对文件路径
Image.file(imageFilepath)

示例代码

以下是一个完整的示例代码,展示了如何使用 screenshot_plus 插件进行截图并显示结果:

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:screenshot_plus/screenshot_plus.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

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

class _MyAppState extends State<MyApp> {
  File imageFile = File('');

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(useMaterial3: true),
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Screenshot Plus'),
        ),
        bottomNavigationBar: ButtonBar(
          alignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              child: const Text('Clear'),
              onPressed: () {
                imageFile = File('');
                setState(() {});
              },
            )
          ],
        ),
        body: Container(
          constraints: const BoxConstraints.expand(),
          child: imageFile.isAbsolute
              ? Container(
                  padding: const EdgeInsets.all(30),
                  color: Colors.blueGrey[900],
                  child: Image.file(imageFile))
              : const Icon(Icons.image),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () async {
            debugPrint('Screen shot captured');
            // 获取绝对路径
            String path = await ScreenshotPlus.takeShot();
            debugPrint('Screenshot taken @: $path');

            imageFile = File(path);
            setState(() {});
          },
          child: const Icon(Icons.camera),
        ),
      ),
    );
  }
}

更多关于Flutter屏幕截图插件screenshot_plus的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter屏幕截图插件screenshot_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


screenshot_plus 是一个用于在 Flutter 应用中截取屏幕截图的插件。它支持截取整个屏幕或特定小部件的截图,并且可以将截图保存为图片文件或获取其字节数据。以下是如何使用 screenshot_plus 插件的基本步骤:

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 screenshot_plus 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  screenshot_plus: ^1.0.0+1 # 请检查最新版本

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

2. 导入插件

在你的 Dart 文件中导入 screenshot_plus 插件:

import 'package:screenshot_plus/screenshot_plus.dart';

3. 创建 ScreenshotController

你需要创建一个 ScreenshotController 实例,用于控制截图操作:

final ScreenshotController screenshotController = ScreenshotController();

4. 使用 Screenshot 小部件

将你想要截取的小部件包裹在 Screenshot 小部件中,并将 ScreenshotController 传递给它:

Screenshot(
  controller: screenshotController,
  child: Container(
    color: Colors.blue,
    child: Center(
      child: Text('Hello, World!'),
    ),
  ),
);

5. 截取屏幕截图

你可以使用 ScreenshotControllercapture 方法来截取屏幕截图。以下是一些常见的用法:

保存截图到文件

screenshotController.capture().then((Uint8List? image) {
  if (image != null) {
    // 保存图片到文件
    final String path = '/path/to/save/image.png';
    File(path).writeAsBytesSync(image);
  }
}).catchError((error) {
  print('Error capturing screenshot: $error');
});

获取截图的字节数据

screenshotController.capture().then((Uint8List? image) {
  if (image != null) {
    // 处理字节数据
    // 例如,显示图片或上传到服务器
  }
});

截取特定尺寸的截图

screenshotController.capture(
  pixelRatio: 2.0, // 设备像素比
  delay: Duration(milliseconds: 200), // 延迟截取
  size: Size(200, 200), // 截图尺寸
).then((Uint8List? image) {
  if (image != null) {
    // 处理图片
  }
});

6. 示例代码

以下是一个完整的示例代码,展示如何使用 screenshot_plus 插件截取屏幕截图并保存到文件:

import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:screenshot_plus/screenshot_plus.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ScreenshotExample(),
    );
  }
}

class ScreenshotExample extends StatefulWidget {
  [@override](/user/override)
  _ScreenshotExampleState createState() => _ScreenshotExampleState();
}

class _ScreenshotExampleState extends State<ScreenshotExample> {
  final ScreenshotController screenshotController = ScreenshotController();

  void _takeScreenshot() async {
    final Uint8List? image = await screenshotController.capture();
    if (image != null) {
      final String path = '/path/to/save/image.png';
      File(path).writeAsBytesSync(image);
      print('Screenshot saved to $path');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Screenshot Plus Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Screenshot(
              controller: screenshotController,
              child: Container(
                color: Colors.blue,
                padding: EdgeInsets.all(20),
                child: Text(
                  'Hello, World!',
                  style: TextStyle(color: Colors.white, fontSize: 24),
                ),
              ),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _takeScreenshot,
              child: Text('Take Screenshot'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部