Flutter Widget截图
Flutter中截图的主要类是RepaintBoundary。
废话不多说,直接上代码:
import 'dart:typed_data'; import 'dart:ui' as ui; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart';class WidgetShot extends StatefulWidget {final Widget child;final ShotController controller;WidgetShot({@required this.child, this.controller});@override_WidgetShotState createState() => _WidgetShotState(); }class _WidgetShotState extends State<WidgetShot> {GlobalKey<_OverRepaintBoundaryState> globalKey = GlobalKey();@overridevoid initState() {super.initState();if (widget.controller != null) {widget.controller.setGlobalKey(globalKey);}}@overrideWidget build(BuildContext context) {return SingleChildScrollView(scrollDirection: Axis.vertical,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: _OverRepaintBoundary(key: globalKey,child: RepaintBoundary(child: widget.child,),),),);} }class _OverRepaintBoundary extends StatefulWidget {final Widget child;const _OverRepaintBoundary({Key key, this.child}) : super(key: key);@override_OverRepaintBoundaryState createState() => _OverRepaintBoundaryState(); }class _OverRepaintBoundaryState extends State<_OverRepaintBoundary> {@overrideWidget build(BuildContext context) {return widget.child;} }class ShotController {GlobalKey<_OverRepaintBoundaryState> globalKey;Future<Uint8List> makeImageUint8List() async {RenderRepaintBoundary boundary = globalKey.currentContext.findRenderObject();// 这个可以获取当前设备的像素比var dpr = ui.window.devicePixelRatio;ui.Image image = await boundary.toImage(pixelRatio: dpr);ByteData byteData = await image.toByteData(format: ui.ImageByteFormat.png);Uint8List pngBytes = byteData.buffer.asUint8List();return pngBytes;}setGlobalKey(GlobalKey<_OverRepaintBoundaryState> globalKey) {this.globalKey = globalKey;} }
测试使用:
import 'dart:typed_data';import 'package:flutter/material.dart'; import 'package:flutter_app/widget_shot.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {// This widget is the root of your application. @overrideWidget build(BuildContext context) {return MaterialApp(title: 'Flutter Demo',theme: ThemeData(primarySwatch: Colors.blue,),home: MyHomePage(title: 'widget shot demo'),);} }class MyHomePage extends StatefulWidget {MyHomePage({Key key, this.title}) : super(key: key);final String title;@override_MyHomePageState createState() => _MyHomePageState(); }class _MyHomePageState extends State<MyHomePage> {// 关键是创建ControllerShotController shotController = new ShotController();int _counter = 0;void _incrementCounter() async {setState(() {_counter++;});// 将widget生成Uint8List传递给Image即可Uint8List pngBytes = await shotController.makeImageUint8List();Navigator.push(context, new MaterialPageRoute(builder: (_) {return Scaffold(appBar: AppBar(title: Text('shot widget'),),body: Image.memory(pngBytes),);}));}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(widget.title),),body: WidgetShot(controller: shotController,child: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Text('You have pushed the button this many times:',),Offstage(offstage: true,child: Text('offstage demo'),),Text('$_counter',style: Theme.of(context).textTheme.display1,),],),),),floatingActionButton: FloatingActionButton(onPressed: _incrementCounter,tooltip: 'Increment',child: Icon(Icons.add),), // This trailing comma makes auto-formatting nicer for build methods. );} }
转载于:https://www.cnblogs.com/hbolin/p/11462332.html
Flutter Widget截图相关推荐
- 拆!对比详解 Flutter Widget 和 CSS,你关心的布局原理都在这儿了
简介: 这篇文章专门对比 Flutter Widget 的布局原理和 CSS 布局原理的差异,分享在对接过程中会遇到的问题和解决方案,帮大家理一理思路,内容可以分为这几部分:1.CSS 和 Widge ...
- Flutter Widget嵌套深,修改代码麻烦?
Flutter Widget嵌套深,修改代码麻烦? 背景 解决方法 代码 修改 pubspec.yaml 以支持 Extension: Widget扩展代码: 实际使用: 背景 许多人初次接触Flut ...
- Flutter Widget详解
Flutter Widget详解 Widget是Flutter应用程序用户界面的基本构建块.每个Widget都是用户界面一部分的不可变声明. 与其他将视图.控制器.布局和其他属性分离的框架不同,Flu ...
- UE Widget截图功能实现
转了一圈都没找到UE4 widget 截图功能,最接近的就只有屏幕截全屏功能了,所以最后只能自己实现了,贴关键代码 TSharedRef<SWidget> TargetSWidget = ...
- Flutter Widget原理(一)
前言 使用过Flutter的同学,应该都听过一句话"everything is a widget--在Flutter中万物皆是Widget". 这句话虽然不能说,Flutter开发 ...
- Flutter Widget
文章目录 一.Widget分类 二.widget的状态 三.根widget 四.Basics 4.1 模板和主题 4.2 Text文本 4.3 图片 4.4 凸起按钮 4.5 其他widget 4.5 ...
- 1、Flutter Widget(IOS Style) - CupertinoApp;
在Flutter中设计风格主要为Material Design风格,Flutter也支持IOS设置风格Cupertino的一系列Widget,分别对应flutter的包下的material目录下的 ...
- Flutter State生命周期 Flutter Widget生命周期 Flutter 应用程序生命周期
题记:不到最后时刻,千万别轻言放弃,无论结局成功与否,只要你拼博过,尽力过,一切问心无愧 在 Flutter应用程序中,生命周期涉及两个,一个是 Widget 的生命周期,一个是应用程序的生命周期,本 ...
- flutter widget super(key: key)的作用(五)
在浏览flutter的代码的时候,会发现widget类总是有一个可选的key参数.那么为什么需要有这个参数呢?带着疑惑去研究了下,总算找到了答案. key参数简单的理解,就是widget的id,用来标 ...
最新文章
- 从字符串中提取BCD码,转换为UINT数据并返回
- 对kubernetes的认识
- 推荐两个非常实用的,Python装饰器
- 一个由正则表达式引发的血案
- C语言学习之分别用if和switch编程,输入0-100分成绩,输出相应的成绩档次。
- 简单了解RestTemplate消息读取的转化
- Python+Opencv实现实时的条形码检测
- redis取出list最边的一个_六、Redis列表(list)类型参考记录(1)
- 02: DOM 实例
- Focal loss原理解析
- java生成一条唯一的邀请码_根据用户id生成一个唯一邀请码
- 网页爬虫工具BeautifulSoup使用总结
- POJ 3388 Japanese Puzzle(二分法)
- 关系数据库规范化理论
- 论文:并行化 Metropolis-Hastings 算法的一般结构
- 什么是Java中的迭代器?如何使用它
- jQuery中的end()的用法与定义
- 鱼眼:一:一分钟详解鱼眼镜头标定基本原理及实现
- electron 主进程,和渲染进程的通信
- 前端:移动端“淘宝造物节” 3D绚酷空间 VR 场景
热门文章
- 计算2个时间之间经过多少Ticks
- powershell电脑加域退域
- 论文笔记之: Deep Metric Learning via Lifted Structured Feature Embedding
- MyBatis学习总结(16)——Mybatis使用的几个建议
- 在linux查看内存的大小
- how many libraries within Cambridge?
- Selwyn College, Cambridge
- 这个瑞士的项目没法在今年三月申请,因为我需要护照并且这个项目在人文社科学员下面,886
- 21天舞动西浦报名失败的教训:先下手为强
- 2017苏州太湖国际马拉松 半程成绩单