Flutter 页面中添加水印、自定义水印

2023-11-13

最近开发手机APP 使用 Fltter

由于需要使用水印的功能,但是第一次接触Flutter ,就想着能不能在网上找到现成的使用,结果全是一群复制粘贴的,还卵用没有,不过由于我太机制,直接去官方的 pub get 找到一个插件。嘿嘿。 pub get
搜到了插件的引入。使用方式
使用方式文档
原作者的 github 地址 水印功能 github

不过这个包的依赖需要限定dart 的版本,所以我就把作者的源代码拉到本地参考作者的方式自己定义了一个水印的工具类,代码呈上


/**
 * 水印样式
 * rowCount: 当前屏幕宽度中 展示多少列水印
 * columnCount: 当前屏幕高度中,展示多少行水印
 * watermark: 水印展示的文字
 * textStyle: 文字的样式
 */
class DisableScreenshotsWatarmark extends StatelessWidget {
  final int rowCount;
  final int columnCount;
  final String text;
  final TextStyle textStyle;

  const DisableScreenshotsWatarmark({
    Key key,
    @required this.rowCount,
    @required this.columnCount,
    @required this.text,
    @required this.textStyle,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return IgnorePointer(
      child: Container(
          child: Column(
            children: creatColumnWidgets(),
          )),
    );
  }

  List<Widget> creatRowWdiges() {
    List<Widget> list = [];
    for (var i = 0; i < rowCount; i++) {
      final widget = Expanded(
          child: Center(
              child: Transform.rotate(
                  angle: pi / 10, child: Text(text, style: textStyle))));
      list.add(widget);
    }
    return list;
  }

  List<Widget> creatColumnWidgets() {
    List<Widget> list = [];
    for (var i = 0; i < columnCount; i++) {
      final widget = Expanded(
          child: Row(
            children: creatRowWdiges(),
          ));
      list.add(widget);
    }
    return list;
  }
}


/**
 * 水印工具类 单例 instance
 * 使用方式:
 *
 * 获取实例: WatarMarkInstance instance = WatarMarkInstance();
 * 添加水印: instance.addWatermark(context, "320321199708134818");
 * 删除水印: instance.removeWatermark();
 *
 */
class WatarMarkInstance {

  static WatarMarkInstance _instance;
  factory WatarMarkInstance() {
    if (_instance == null) {
      _instance = WatarMarkInstance.private();
    }
    return _instance;
  }

  WatarMarkInstance.private();

  OverlayEntry _overlayEntry;

  void addWatermark(BuildContext context, String watermark,
      {int rowCount = 2, int columnCount = 8, TextStyle textStyle}) async {
    if (_overlayEntry != null) {
      _overlayEntry.remove();
    }
    OverlayState overlayState = Overlay.of(context);
    _overlayEntry = OverlayEntry(
        builder: (context) => DisableScreenshotsWatarmark(
          rowCount: rowCount,
          columnCount: columnCount,
          text: watermark,
          textStyle: textStyle ??
              const TextStyle(
                  color: Color(0x08000000),
                  fontSize: 14,
                  decoration: TextDecoration.none),
        ));
    overlayState.insert(_overlayEntry);
    // return await _methodChannel.invokeMethod<void>("addWatermark", ['我是水印']);
  }


  void removeWatermark() async {
    if (_overlayEntry != null) {
      _overlayEntry.remove();
      _overlayEntry = null;
    }
  }
}

主要参数都已经放在上面了。小伙伴可以自行参考。 再次感谢一下原作者 [哈哈哈]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter 页面中添加水印、自定义水印 的相关文章

随机推荐

  • 数据结构之栈

    栈 什么是栈 1 后进者先出 先进者后出 这就是典型的 栈 结构 2 从栈的操作特性来看 是一种 操作受限 的线性表 只允许在端插入和删除数据 为什么需要栈 1 栈是一种操作受限的数据结构 其操作特性用数组和链表均可实现 2 但 任何数据结
  • Windows应急响应信息采集工具

    项目地址 GitHub ra66itmachine GetInfo Windows Emergency Response 应急响应信息采集 Windows information collection 快速收集 Windows 相关信息 为
  • 全通系统定义、零极点关系、应用

    全通系统定义 表示方法 应用一 将任意因果稳定系统转化为 全通系统和最小相位系统 的级联 应用二 级联一个全通系统可以使非稳定滤波器变成一个稳定滤波器 把非稳定系统的单位圆外的极点映射到单位圆内 应用三 作为相位均衡器 校正系统的非线性相位
  • Android一键清理原理

    欢迎转载 转载请注明 http blog csdn net zhgxhuaa 说明 在总篇中提到过垃圾清理 本篇将着重介绍针对缓存 卸载残留 无用数据等 静态内容 的清理 有关于系统进程的清理以及手机加速的相关功能 将放到 手机加速篇 中介
  • 在腾讯云服务器上安装docker

    一 准备事项 1 1 查看系统版本 uname a docker官方说至少3 8以上 建议3 10以上 root VM 0 11 centos docker uname a Linux VM 0 11 centos 3 10 0 1062
  • 前端面经高频考点

    文章目录 HTML 1 高频1之行内元素 块级元素 行内块元素的区别 2 高频2之script标签中defer和async的区别 3 src和href的区别 4 lable的作用 5 ifram的使用以及有优缺点 6 img的srcset属
  • Java题目练习

    编程题目 题目1 编写MobilePhone类 包含brand 品牌 和price 价格 属性 该类实现Comparable接口规定该类对象大小 即手机能按照价格来排序 2 创建一个只可放 MobilePhone 类的链表 链表当中添加3个
  • geckodriver的安装和测试其是否安装成功

    1 首先下载最新的geckodriver 你可以百度 或者我分享给你 但是如果你看到这篇文的时候 已经更新版本了 你可以去百度一下 总有人在分享的 链接 https pan baidu com s 1L9GLCpLNmgL2szxD6wvK
  • 《科学伦理与学术规范》 课后习题_答案 2022春季

    资料来源网络 侵删 科学伦理与学术规范答案汇总 2022 第一部分 必做 ABC A B D ABCD ABC D A BCD C D D 第二部分 必做 ABCD ABCD ABCD BCD AD A ABCD ACD AC A AC D
  • 了解接口工具Apifox

    最近发现一款接口测试工具 apifox 我我们很难将它描述为一款接口管理工具 或 接口自测试工具 官方给了一个简单的公式 更能说明apifox可以做什么 Apifox Postman Swagger Mock JMeter Apifox的特
  • /usr/bin/ld: cannot find -lmysqlcllient

    文章目录 1 question usr bin ld cannot find lmysqlcllient 2 solution 1 question usr bin ld cannot find lmysqlcllient 2 soluti
  • Unity脚本的属性

    参考官网 http game ceeger com Script Attributes Attributes html http blogs unity3d com 2014 06 24 serialization in unity 参考文
  • 解决UE4启动出现UE4Editor.exe-无法找到dll入口的弹窗

    UE4编辑器启动 一开始遇到的问题如下 上网找问题得到的解答都是在cmd下利用regsvr32 exe注册该dll到注册表 但是也提示报错 上网搜了一下 得知原因是生成该dll的源码没有实现 DllRegisterServer和DllUne
  • 镜像iso文件下载地址

    CentOS 7官方下载地址 https www centos org download Centos国内下载源 以下链接均可下载镜像文件 http man linuxde net download CentOS http centos u
  • 面向对象程序设计语言(Java)-1.概述

    概述 1 Java的两层含义 2 Java语言的特点 3 Java的应用平台 4 Java的工作原理 5 Java环境中的概念 6 初始Java程序 7 Java程序的基本组成 8 开发Java程序的步骤 9 注释 1 Java的两层含义
  • JavaScript中的扁平化数据转换为树形结构、树形结构扁平化数据

    1 扁平化数据 gt 树形结构 1 1 第一种数据类型 原始数据只有id和pId相互关联 let data id 639 name 商品管理 type 0 pId 638 code 1 domain id 640 name 商品分类 typ
  • antdv(vue)组件中tree-select使用

    官网教程 组件tree select 实现效果 1 基本用法 直接使用 在vue层写数据 注意 注册组件要包含treeSelect和其中的节点ATreeSelectNode 不注册会报错 如下
  • Oracle常用代码总结

    1 用户 创建用户 create user dm identified by dm default tablespace BIGDATA DM temporary tablespace DM TEMP profile default 修改用
  • Centos7 搭建 Minikube

    Centos7 搭建 Minikube 目录 Centos7 搭建 Minikube 参考博客 运行环境 安装过程 配置系统环境 安装Docker 安装Kubectl 参考博客 参考博客 运行环境 系统版本 CentOS Linux rel
  • Flutter 页面中添加水印、自定义水印

    最近开发手机APP 使用 Fltter 由于需要使用水印的功能 但是第一次接触Flutter 就想着能不能在网上找到现成的使用 结果全是一群复制粘贴的 还卵用没有 不过由于我太机制 直接去官方的 pub get 找到一个插件 嘿嘿 pub