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截图相关推荐

  1. 拆!对比详解 Flutter Widget 和 CSS,你关心的布局原理都在这儿了

    简介: 这篇文章专门对比 Flutter Widget 的布局原理和 CSS 布局原理的差异,分享在对接过程中会遇到的问题和解决方案,帮大家理一理思路,内容可以分为这几部分:1.CSS 和 Widge ...

  2. Flutter Widget嵌套深,修改代码麻烦?

    Flutter Widget嵌套深,修改代码麻烦? 背景 解决方法 代码 修改 pubspec.yaml 以支持 Extension: Widget扩展代码: 实际使用: 背景 许多人初次接触Flut ...

  3. Flutter Widget详解

    Flutter Widget详解 Widget是Flutter应用程序用户界面的基本构建块.每个Widget都是用户界面一部分的不可变声明. 与其他将视图.控制器.布局和其他属性分离的框架不同,Flu ...

  4. UE Widget截图功能实现

    转了一圈都没找到UE4 widget 截图功能,最接近的就只有屏幕截全屏功能了,所以最后只能自己实现了,贴关键代码 TSharedRef<SWidget> TargetSWidget = ...

  5. Flutter Widget原理(一)

    前言 使用过Flutter的同学,应该都听过一句话"everything is a widget--在Flutter中万物皆是Widget". 这句话虽然不能说,Flutter开发 ...

  6. Flutter Widget

    文章目录 一.Widget分类 二.widget的状态 三.根widget 四.Basics 4.1 模板和主题 4.2 Text文本 4.3 图片 4.4 凸起按钮 4.5 其他widget 4.5 ...

  7. 1、Flutter Widget(IOS Style) - CupertinoApp;

      在Flutter中设计风格主要为Material Design风格,Flutter也支持IOS设置风格Cupertino的一系列Widget,分别对应flutter的包下的material目录下的 ...

  8. Flutter State生命周期 Flutter Widget生命周期 Flutter 应用程序生命周期

    题记:不到最后时刻,千万别轻言放弃,无论结局成功与否,只要你拼博过,尽力过,一切问心无愧 在 Flutter应用程序中,生命周期涉及两个,一个是 Widget 的生命周期,一个是应用程序的生命周期,本 ...

  9. flutter widget super(key: key)的作用(五)

    在浏览flutter的代码的时候,会发现widget类总是有一个可选的key参数.那么为什么需要有这个参数呢?带着疑惑去研究了下,总算找到了答案. key参数简单的理解,就是widget的id,用来标 ...

最新文章

  1. 从字符串中提取BCD码,转换为UINT数据并返回
  2. 对kubernetes的认识
  3. 推荐两个非常实用的,Python装饰器
  4. 一个由正则表达式引发的血案
  5. C语言学习之分别用if和switch编程,输入0-100分成绩,输出相应的成绩档次。
  6. 简单了解RestTemplate消息读取的转化
  7. Python+Opencv实现实时的条形码检测
  8. redis取出list最边的一个_六、Redis列表(list)类型参考记录(1)
  9. 02: DOM 实例
  10. Focal loss原理解析
  11. java生成一条唯一的邀请码_根据用户id生成一个唯一邀请码
  12. 网页爬虫工具BeautifulSoup使用总结
  13. POJ 3388 Japanese Puzzle(二分法)
  14. 关系数据库规范化理论
  15. 论文:并行化 Metropolis-Hastings 算法的一般结构
  16. 什么是Java中的迭代器?如何使用它
  17. jQuery中的end()的用法与定义
  18. 鱼眼:一:一分钟详解鱼眼镜头标定基本原理及实现
  19. electron 主进程,和渲染进程的通信
  20. 前端:移动端“淘宝造物节” 3D绚酷空间 VR 场景

热门文章

  1. 计算2个时间之间经过多少Ticks
  2. powershell电脑加域退域
  3. 论文笔记之: Deep Metric Learning via Lifted Structured Feature Embedding
  4. MyBatis学习总结(16)——Mybatis使用的几个建议
  5. 在linux查看内存的大小
  6. how many libraries within Cambridge?
  7. Selwyn College, Cambridge
  8. 这个瑞士的项目没法在今年三月申请,因为我需要护照并且这个项目在人文社科学员下面,886
  9. 21天舞动西浦报名失败的教训:先下手为强
  10. 2017苏州太湖国际马拉松 半程成绩单