Flutter屏幕截图插件screenshot_maker的使用

Flutter屏幕截图插件screenshot_maker的使用

Screenshot_maker 是一个用于生成使用 Flutter 布局的图像的包。该插件允许你使用 Flutter 强大的布局系统来生成图像。你可以用它来创建适用于 App Store 和 Play Store 的截图。

使用

ScreenshotMaker

ScreenshotMaker 渲染子部件并根据指定的大小将其写入指定的文件。

通过将此部件传递给 runPkg 并将其作为 Flutter 应用程序运行在模拟器上,可以输出图像。使用的模拟器与输出大小无关。为了更容易调整布局,建议使用具有大显示屏的平板设备(如 iPad)。

目前,Android 模拟器和 Web 浏览器不能在开发机器上输出图像,因此请使用 iOS 模拟器。

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

void main() {
  runApp(
    ScreenshotMaker(
      // TODO: 写你的绝对路径。
      outputFile: File('/Users/your_name/Desktop/simple.png'),
      size: Size(500, 1000),
      child: MaterialApp(
        home: Scaffold(
          appBar: AppBar(),
          body: Text('text'),
        ),
      ),
    ),
  );
}

Simulated

Simulated 将你的 Flutter 应用嵌入到你指定的设备框架图像中并进行组合。

位置和大小由 innerScreenOffsetinnerScreenSize 指定。

“凹口”等区域由 viewPadding 表示。

设备的分辨率由 originalLogicalScreenSize 表示。这需要用逻辑像素表示。

设备框架图像必须有透明的显示区域。此包中不包含设备框架图像,你需要自己准备。示例中有一个非常简单的图像(位于 example/assets),但不建议在生产环境中使用。

使用 Simulated 时,请使用 runPkg 而不是 runApp。这是为了确保正确应用 viewPadding 设置。

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

void main() {
  // 使用 runPkg 而不是 runApp。
  runPkg(
    Directionality(
      textDirection: TextDirection.ltr,
      child: Simulated(
        innerScreenSize: const Size(1658, 3588),
        innerScreenOffset: const Size(116, 103),
        originalLogicalScreenSize: const Size(414, 896),
        deviceFrameImage: Image.asset('assets/example_device_frame.png'),
        viewPadding:
            const PhysicalViewPadding(left: 0, top: 68, right: 0, bottom: 66),
        child: const MyAwesomeApp(),
      ),
    ),
  );
}

class MyAwesomeApp extends StatelessWidget {
  const MyAwesomeApp();
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
            appBar: AppBar(title: Text("My Awesome App")),
            body: ElevatedButton(child: Text('foobar'), onPressed: () {})));
  }
}

完整示例

以下是完整的示例代码:

import 'dart:async';
import 'dart:io';

import 'package:flutter/material.dart';

import 'package:screenshot_maker/screenshot_maker.dart';

void main() {
  runPkg(MakeScreenshotsContinuously());
}

class MakeScreenshotsContinuously extends StatefulWidget {
  final sizes = <Size>[
    Size(1242, 2688),
    Size(1242, 2208),
    Size(2048, 2732),
  ];
  final outputFiles = <File>[
    // TODO: 写你的绝对路径。
    File('/Users/your_name/Desktop/out1.png'),
    File('/Users/your_name/Desktop/out2.png'),
    File('/Users/your_name/Desktop/out3.png'),
  ];
  MakeScreenshotsContinuously({
    Key? key,
  }) : super(key: key);

  [@override](/user/override)
  _MakeScreenshotsContinuouslyState createState() => _MakeScreenshotsContinuouslyState();
}

class _MakeScreenshotsContinuouslyState extends State<MakeScreenshotsContinuously> {
  late int index;
  late Completer<void> completer;
  late File outputFile;
  late Size size;

  [@override](/user/override)
  void initState() {
    super.initState();
    index = 0;
    completer = Completer();
    outputFile = widget.outputFiles[index];
    size = widget.sizes[index];
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    completer.future.then((_) {
      if (index < widget.outputFiles.length - 1 && completer.isCompleted) {
        setState(() {
          ++index;
          completer = Completer();
          outputFile = widget.outputFiles[index];
          size = widget.sizes[index];
        });
      }
    });

    return ScreenshotMaker(
      outputFile: outputFile,
      size: size,
      completer: completer,
      child: Directionality(
        textDirection: TextDirection.ltr,
        child: Stack(
          children: [
            // 背景
            Container(
              width: double.infinity,
              height: double.infinity,
              decoration: BoxDecoration(
                gradient: LinearGradient(
                  begin: Alignment.topCenter,
                  end: Alignment.bottomCenter,
                  colors: [Colors.purple[200]!, Colors.cyan[200]!],
                ),
              ),
            ),
            Column(
              children: [
                Expanded(
                  flex: 1,
                  child: Center(
                    child: Text(
                      'You Can Do Everything with This App!',
                      style: TextStyle(
                          fontSize: 60,
                          color: Colors.white,
                          decoration: TextDecoration.none),
                    ),
                  ),
                ),
                Expanded(
                  flex: 4,
                  child: Simulated(
                    innerScreenSize: const Size(1658, 3588),
                    innerScreenOffset: const Size(116, 103),
                    originalLogicalScreenSize: const Size(414, 896),
                    viewPadding: const PhysicalViewPadding(
                        left: 0, top: 68, right: 0, bottom: 66),
                    deviceFrameImage:
                        Image.asset('assets/example_device_frame.png'),
                    child: MyAwesomeApp(),
                  ),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

class MyAwesomeApp extends StatelessWidget {
  const MyAwesomeApp();
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
        debugShowCheckedModeBanner: false,
        home: Scaffold(
          appBar: AppBar(
            title: Text('My Awesome App'),
          ),
          body: Center(
              child: Text(
            'foobar',
            style: TextStyle(fontSize: 50),
          )),
        ));
  }
}

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

1 回复

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


screenshot_maker 是一个 Flutter 插件,用于在 Flutter 应用中轻松生成屏幕截图。它可以帮助你在应用中捕获当前屏幕的内容,并将其保存为图像文件。以下是如何使用 screenshot_maker 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  screenshot_maker: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入插件

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

import 'package:screenshot_maker/screenshot_maker.dart';

3. 使用 ScreenshotMaker 捕获屏幕截图

你可以使用 ScreenshotMaker 类来捕获屏幕截图并保存为图像文件。

class MyHomePage extends StatelessWidget {
  final ScreenshotMaker screenshotMaker = ScreenshotMaker();

  Future<void> captureAndSaveScreenshot() async {
    try {
      // 捕获当前屏幕的截图
      final imagePath = await screenshotMaker.captureAndSave();

      // 打印保存的路径
      print('Screenshot saved at: $imagePath');
    } catch (e) {
      print('Failed to capture screenshot: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Screenshot Maker Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: captureAndSaveScreenshot,
          child: Text('Capture Screenshot'),
        ),
      ),
    );
  }
}

4. 处理截图

screenshotMaker.captureAndSave() 方法会返回保存的截图文件的路径。你可以使用这个路径来进一步处理截图,比如显示它、上传到服务器等。

5. 权限处理

在 Android 和 iOS 上,保存文件可能需要特定的权限。请确保你的应用已经请求并获得了必要的权限。

  • Android: 需要在 AndroidManifest.xml 中添加写入外部存储的权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    
  • iOS: 需要在 Info.plist 中添加照片库访问权限:

    <key>NSPhotoLibraryAddUsageDescription</key>
    <string>We need to save screenshots to your photo library</string>
    

6. 运行应用

运行你的 Flutter 应用,点击按钮来捕获并保存屏幕截图。截图文件将会保存在设备的默认图片目录中。

7. 其他功能

screenshot_maker 插件可能还提供其他功能,比如自定义保存路径、捕获特定部件等。你可以查看插件的文档或源代码来了解更多详细信息。

示例代码

以下是完整的示例代码:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Screenshot Maker Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final ScreenshotMaker screenshotMaker = ScreenshotMaker();

  Future<void> captureAndSaveScreenshot() async {
    try {
      final imagePath = await screenshotMaker.captureAndSave();
      print('Screenshot saved at: $imagePath');
    } catch (e) {
      print('Failed to capture screenshot: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Screenshot Maker Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: captureAndSaveScreenshot,
          child: Text('Capture Screenshot'),
        ),
      ),
    );
  }
}
回到顶部