Flutter截图保存插件widgets_to_png的使用
Flutter截图保存插件widgets_to_png的使用
widgets_to_png
是一个Flutter包,允许将任何小部件转换为PNG图像并保存到设备相册。
功能
- 将任何小部件转换为PNG字节。
- 将捕获的小部件图像保存到文件。
- 将捕获的小部件图像保存到设备相册。
- 使用预定义或自定义值指定图像质量。
使用方法
1. 包装您的小部件
用 WidgetToPng
包装您想要捕获的小部件,并提供一个 GlobalKey
来标识它。
import 'package:flutter/material.dart';
import 'package:widgets_to_png/widgets_to_png.dart';
class MyWidget extends StatelessWidget {
final GlobalKey _globalKey = GlobalKey();
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Widget to Image Example'), // 小部件转图片示例
),
body: Center(
child: WidgetToPng(
keyToCapture: _globalKey, // 需要捕获的小部件的key
child: Container(
width: 200,
height: 200,
color: Colors.blue,
child: Center(child: Text('Capture Me!')), // 捕捉我!
),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () async {
await ImageConverter.saveWidgetToGallery(
key: _globalKey,
fileName: 'captured_widget.png', // 保存文件名为 captured_widget.png
);
},
child: Icon(Icons.camera), // 相机图标
),
);
}
}
2. 将小部件作为字节捕获
使用 captureWidgetToBytes
方法将小部件作为字节捕获。您可以使用 ImageQuality
枚举或自定义质量值来指定图像质量。
import 'package:widgets_to_png/widgets_to_png.dart';
// 使用枚举指定图像质量
Uint8List? imageBytes = await ImageConverter.captureWidgetToBytes(
key: _globalKey,
imageQuality: ImageQuality.high, // 高质量
);
// 或者使用自定义质量值
Uint8List? imageBytes = await ImageConverter.captureWidgetToBytes(
key: _globalKey,
customImageQuality: 3.0, // 自定义质量值
);
3. 将字节保存到文件
使用 saveBytesToFile
方法将捕获的字节保存到文件。
import 'dart:io';
import 'package:widgets_to_png/widgets_to_png.dart';
File imageFile = await ImageConverter.saveBytesToFile(
bytes: imageBytes!, // 捕获的字节
filename: 'widget_image.png', // 文件名为 widget_image.png
);
4. 将字节转换为 XFile
使用 convertBytesToXFile
方法将捕获的字节转换为 XFile
。
import 'package:image_picker/image_picker.dart';
import 'package:widgets_to_png/widgets_to_png.dart';
XFile imageXFile = await ImageConverter.convertBytesToXFile(
bytes: imageBytes!, // 捕获的字节
filename: 'widget_image.png', // 文件名为 widget_image.png
);
5. 将小部件保存到相册
使用 saveWidgetToGallery
方法直接将捕获的小部件图像保存到设备相册。
import 'package:widgets_to_png/widgets_to_png.dart';
await ImageConverter.saveWidgetToGallery(
key: _globalKey,
fileName: 'captured_widget.png', // 保存文件名为 captured_widget.png
);
类和方法
WidgetToPng
包装另一个小部件并允许其被捕获为图像的小部件。
属性 | 类型 | 描述 |
---|---|---|
keyToCapture |
GlobalKey |
用于标识要捕获的小部件的键。 |
child |
Widget |
要包装并捕获的小部件。 |
ImageConverter
用于将小部件转换为图像并保存它们的实用类。
功能
- captureWidgetToBytes: 捕获由给定
GlobalKey
标识的小部件并返回图像字节。 - saveBytesToFile: 将给定的图像字节保存到具有指定
filename
的临时文件中。 - convertBytesToXFile: 将给定的图像字节转换为具有指定
filename
的XFile
。 - saveWidgetToGallery: 捕获由给定
GlobalKey
标识的小部件并将其与指定的fileName
一起保存到相册中。
ImageQuality
表示捕获图像质量的枚举。
质量 | 描述 |
---|---|
low |
低质量 (1.2x 像素比率) |
medium |
中等质量 (2.0x 像素比率) |
high |
高质量 (2.5x 像素比率) |
注意: 图像质量越高,转换小部件为字节所需的时间就越长。
示例
这是一个完整的示例,展示如何使用 widgets_to_png
包:
import 'package:flutter/material.dart';
import 'package:widgets_to_png/widgets_to_png.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
final GlobalKey _globalKey = GlobalKey();
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Widget to Image Example'), // 小部件转图片示例
),
body: Center(
child: WidgetToPng(
keyToCapture: _globalKey, // 需要捕获的小部件的key
child: Container(
width: 200,
height: 200,
color: Colors.blue,
child: Center(child: Text('Capture Me!')), // 捕捉我!
),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () async {
await ImageConverter.saveWidgetToGallery(
key: _globalKey,
fileName: 'captured_widget.png', // 保存文件名为 captured_widget.png
);
},
child: Icon(Icons.camera), // 相机图标
),
),
);
}
}
更多关于Flutter截图保存插件widgets_to_png的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter截图保存插件widgets_to_png的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用widgets_to_png
插件来截图并保存图片的示例代码。
首先,你需要在pubspec.yaml
文件中添加widgets_to_png
依赖:
dependencies:
flutter:
sdk: flutter
widgets_to_png: ^4.0.0 # 请注意版本号,这里使用的是4.0.0,实际使用时请检查最新版本
然后运行flutter pub get
来安装依赖。
接下来,在你的Flutter项目中,你可以使用以下代码来截图并保存图片:
import 'package:flutter/material.dart';
import 'package:widgets_to_png/widgets_to_png.dart';
import 'dart:io';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Widgets to PNG Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ScreenshotWidget(),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
// 触发截图保存功能
final ByteData byteData = await ScreenshotWidget().captureAsPng();
final Uint8List pngBytes = byteData.buffer.asUint8List();
// 保存图片到设备存储
final Directory extDir = await getApplicationDocumentsDirectory();
final String imgPath = '${extDir.path}/screenshot.png';
File imgFile = File(imgPath);
await imgFile.writeAsBytes(pngBytes);
print('Screenshot saved to $imgPath');
},
child: Text('Save Screenshot'),
),
],
),
),
),
);
}
}
class ScreenshotWidget extends StatelessWidget {
ScreenshotController _controller = ScreenshotController();
@override
Widget build(BuildContext context) {
return Screenshot(
controller: _controller,
child: Container(
color: Colors.amber,
width: 300,
height: 300,
child: Center(
child: Text(
'Hello, Flutter!',
style: TextStyle(fontSize: 24, color: Colors.black),
),
),
),
);
}
Future<ByteData> captureAsPng() async {
// 捕获截图
final ScreenshotController screenshotController = _controller;
return await screenshotController.capture();
}
}
在这个示例中:
ScreenshotWidget
是一个你想要截图的widget。ScreenshotController
用于控制截图操作。Screenshot
widget包裹了你想要截图的内容,并指定了controller
。- 在按钮点击事件中,调用
captureAsPng
方法来捕获截图,并将截图保存为PNG文件到应用文档目录。
请注意,在Android上保存文件到外部存储可能需要请求权限,这里示例代码简化了流程,直接保存到应用的内部存储目录。
确保在实际应用中处理文件保存权限和路径问题,并根据需要调整UI和逻辑。