flutter - 如何在 Flutter Web 中将输出小部件屏幕截图下载为图像?
问题描述
我想将小部件屏幕截图作为图像文件下载到 flutter Web中。有什么可以做的吗?顺便说一下,将小部件转换为 Uint8List,我正在使用屏幕截图插件。
解决方案
您可以使用该RenderRepaintBoundary.toImage()
功能将小部件转换为图像。然后您转换为byteData
,然后转换为 ,然后对其Uint8list
进行操作base64encode
,Uint8List
基本上使小部件成为您可以下载的锚元素。
我从我正在处理的一个项目中附加了一些示例代码,它允许用户生成一个二维码并将其下载到他们 PC 上的下载文件夹中,以显示我在说什么。
确保您已在 dart 文件顶部导入 html:
import 'dart:html' as html;
然后,代码将类似于:
final key = GlobalKey();
final qrTextController = TextEditingController();
//this code "wraps" the qr widget into an image format
RenderRepaintBoundary boundary = key.currentContext!
.findRenderObject() as RenderRepaintBoundary;
//captures qr image
var image = await boundary.toImage();
String qrName = qrTextController.text;
//running on web
if(kIsWeb){
print('registering as a web device');
ByteData? byteData = await image.toByteData(format: ImageByteFormat.png);
Uint8List pngBytes = byteData!.buffer.asUint8List();
final _base64 = base64Encode(pngBytes);
final anchor =
html.AnchorElement(href: 'data:application/octet-stream;base64,$_base64')
..download = "image.png"
..target = 'blank';
html.document.body!.append(anchor);
anchor.click();
anchor.remove();
}
推荐阅读
- java - Drools 将一个对象的列表转换为 Drools 中的另一个对象的列表
- api - Hashicorp Vault 在尝试删除不存在的密钥时返回 400 而不是 404
- docker - Nexus Docker 注册表:blob 未知:blob 对注册表未知
- laravel - Laravel 8 通过三个链接模型进行计数
- apache-spark - 使用 Pyspark 将纪元秒转换为时间戳
- python - Python - 比较 2 个 csv 文件并删除行
- javascript - 试图在 js 中添加两个整数,但不知何故如果 Integer 很大,而不使用任何内置库来处理大整数
- c# - FirebaseAuth.DefaultInstance 与另一个实例竞争 -> 只有一个有效
- kivy - kivy recycleview gridlayout如何显示单行
- pycharm - 我安装了pycharm,它甚至无法启动并显示启动错误我尝试重新安装它但没有任何效果