• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Flutter生成长截图并保存在本地

武飞扬头像
可可鸭~
帮助2

xml中需要配置权限

   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!--写入外部存储权限-->
   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <!--读取外部存储权限-->

yaml文件需要引入

  permission_handler: ^8.1.1 # 权限控制插件 by Allen Su
  image_gallery_saver: ^1.6.9 # 图片存储到相册插件 by Allen Su
import 'dart:io';
import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:permission_handler/permission_handler.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:image_gallery_saver/image_gallery_saver.dart';

class ScreenShotPage extends StatefulWidget {
  @override
  _ScreenShotPageState createState() => _ScreenShotPageState();
}

class _ScreenShotPageState extends State<ScreenShotPage> {
  GlobalKey _repaintKey = GlobalKey(); // 可以获取到被截图组件状态的 GlobalKey
  List<Uint8List> _images = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
          child: SingleChildScrollView(
        scrollDirection: Axis.vertical,
        padding: EdgeInsets.only(right: 10),
        child: RepaintBoundary(
            //而第二个参数就是你需要截取的组件,如下代码所示
            key: _repaintKey,
            child: Column(
              children: [
                Container(
                  width: double.infinity,
                  color: Color(0xffe8eaed),
                  child: Column(
                      children: <Widget>[Column(children: _listWidget())]),
                ),
                Container(
                  height: 200,
                ),
                InkWell(
                  onTap: () async {
                    _getImageData();
                    Uint8List data = await _getImageData();
                    _images.add(data);
                    _doSaveImage();
                    print("---------------");
                    print(_images[0]);
                  },
                  child: Text("22222222"),
                ),
              ],
            )),
      )),
    );
  }

  ///数组
  List<Widget> _listWidget() {
    List<Widget> _list = List();
    for (int index = 0; index < 40; index  ) {
      _list
          .add(Container(height: 30, child: Center(child: Text('屏幕截图$index'))));
    }
    return _list;
  }

  /// 获取截取图片的数据
  Future<Uint8List> _getImageData() async {
    BuildContext buildContext = _repaintKey.currentContext;
    if (buildContext != null) {
      RenderRepaintBoundary boundary = buildContext.findRenderObject();
      // 第一次执行时,boundary.debugNeedsPaint 为 true,此时无法截图(如果为true时直接截图会报错)
      if (boundary.debugNeedsPaint) {
        // 延时一定时间后,boundary.debugNeedsPaint 会变为 false,然后可以正常执行截图的功能
        await Future.delayed(Duration(milliseconds: 20));
        // 重新调用方法
        return _getImageData();
      }
      // 获取当前设备的像素比
      double dpr = ui.window.devicePixelRatio;
      // pixelRatio 代表截屏之后的模糊程度,因为不同设备的像素比不同
      // 定义一个固定数值显然不是最佳方案,所以以当前设备的像素为目标值
      ui.Image image = await boundary.toImage(pixelRatio: dpr);
      ByteData byteData =
          await image.toByteData(format: ui.ImageByteFormat.png);
      Uint8List imageBytes = byteData.buffer.asUint8List();
      // 返回图片的数据
      return imageBytes;
    }
  }

  /// 执行存储图片到本地相册
  void _doSaveImage() async {
    // 如果用户已授权存储权限
    if (await Permission.storage.request().isGranted) {
      Uint8List data = await _getImageData();
      await ImageGallerySaver.saveImage(data);
    } else {
      // 没有存储权限时,弹出没有存储权限的弹窗
    }

  }

  // 执行截图并显示到页面中
  void _doScreenShots() async {
    Uint8List data = await _getImageData();
    _images.add(data);
    setState(() {});
  }
}

学新通

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgbjibi
系列文章
更多 icon
同类精品
更多 icon
继续加载