Flutter快速制作一个水印组件实例详解

作者:半点橘色 时间:2023-05-16 23:32:20 

项目开发的过程中,经常会遇到添加水印的需求,其作用无非就是防止重要信息通过截图外传。(虽然我觉得并没有什么卵用,但领导的需求是不容质疑的)

Flutter快速制作一个水印组件实例详解

那么,作为一线码农的我,也只能屁颠屁颠的开搞。

通过child属性将水印叠加给子组件

水印组件,既然是组件,就是需要发扬Flutter套娃的精神,通过child属性将水印叠加给子组件。

class Watermark extends StatelessWidget {
 const Watermark({Key? key, required this.child}) : super(key: key);
 final Widget child;
 /// 水印信息
 final String waterInfo = '半点橘色 6666';
 @override
 Widget build(BuildContext context) {
   return Stack(
     children: [
       child,
       _createWatermark(),
     ],
   );
 }
 /// ....
}

waterInfo属性一般情况是获取登录用户信息进行动态写入,在demo中就写死了。

build方法的内容很简单,无非是通过Stack进行堆叠布局,通过createWatermark方法创建水印,放置于子组件的上方。

createWatermark方法

核心内容就在于createWatermark方法。

/// 创建水印
 Widget _createWatermark() {
   return IgnorePointer(
     child: Column(
       children: List.generate(
         6,
         (index) => Expanded(
           child: Row(
             children: List.generate(
               3,
               (index) => Expanded(
                 child: Center(
                   child: Transform.rotate(
                     angle: -0.34,
                     child: Text(
                       waterInfo,
                       style: const TextStyle(
                         color: Color(0x10000000),
                         fontSize: 14,
                         decoration: TextDecoration.none,
                       ),
                     ),
                   ),
                 ),
               ),
             ),
           ),
         ),
       ),
     ),
   );
 }

创建水印可以通过横向(Row)和纵向(Column)布局,将水印文本内容渲染在页面中。当然,样式可以随喜爱而定,例如Transform.rotate设置倾斜角度,Color设置文本颜色等。

其中IgnorePointer组件是个重点。

它可以让点击事件穿透容器,直达下层。这样一来即使水印叠加在最顶层,也不会影响到页面手势的操作。

IgnorePointer还有个同胞兄弟AbsorbPointer,它的作用与IgnorePointer相反,会消费掉点击事件,使其无法穿透容器向下传递。

Watermark组件的完整代码

import 'package:flutter/material.dart';
/// 水印组件
class Watermark extends StatelessWidget {
 const Watermark({Key? key, required this.child}) : super(key: key);
 final Widget child;
 final String waterInfo = '半点橘色 6666';
 @override
 Widget build(BuildContext context) {
   return Stack(
     children: [
       child,
       _createWatermark(),
     ],
   );
 }
 /// 创建水印
 Widget _createWatermark() {
   return IgnorePointer(
     child: Column(
       children: List.generate(
         6,
         (index) => Expanded(
           child: Row(
             children: List.generate(
               3,
               (index) => Expanded(
                 child: Center(
                   child: Transform.rotate(
                     angle: -0.34,
                     child: Text(
                       waterInfo,
                       style: const TextStyle(
                         color: Color(0x10000000),
                         fontSize: 14,
                         decoration: TextDecoration.none,
                       ),
                     ),
                   ),
                 ),
               ),
             ),
           ),
         ),
       ),
     ),
   );
 }
}

是不是很简单?

水印组件的核心就是这么简单,大家可以在此基础上,结合项目的需求进行拓展开发。

来源:https://juejin.cn/post/7193908135638073381

标签:Flutter,水印,组件
0
投稿

猜你喜欢

  • mybatis plus中如何编写sql语句

    2021-09-21 15:27:55
  • java实现推箱子小游戏

    2023-02-09 04:57:52
  • SpringBoot基于Actuator远程关闭服务

    2022-06-24 21:36:37
  • Java基于Tcp的基础聊天功能实例

    2023-11-25 05:26:56
  • RxJava+Retrofit实现网络请求封装的方法

    2023-08-13 19:39:13
  • GridView基于pulltorefresh实现下拉刷新 上拉加载更多功能(推荐)

    2022-08-29 23:51:58
  • SpringBoot+Redis实现数据字典的方法

    2022-08-03 14:22:29
  • 通过Java查看程序资源占用情况

    2023-11-10 02:01:19
  • 实例代码讲解JAVA 观察者模式

    2023-09-11 19:22:18
  • Java Property类使用详解

    2023-11-06 21:52:57
  • springCloud config本地配置操作

    2023-01-13 11:07:56
  • 一文带你搞懂Java定时器Timer的使用

    2022-09-08 01:18:16
  • springboot使用单元测试实战

    2023-05-17 11:55:29
  • Android 中SwipeRefreshLayout与ViewPager滑动事件冲突解决方法

    2023-02-26 21:34:17
  • Android 高版本API方法在低版本系统上的兼容性处理

    2022-08-22 08:51:53
  • IntelliJ IDEA基于SpringBoot如何搭建SSM开发环境的步骤详解

    2022-11-24 12:10:39
  • Kotlin与Java的区别详解

    2023-06-22 16:25:58
  • Flowable执行完毕的流程查找方法

    2023-01-30 08:53:36
  • C#中String StringBuilder StringBuffer类的用法

    2023-05-21 02:35:50
  • JAVA随机打乱数组顺序的方法

    2023-08-11 18:56:03
  • asp之家 软件编程 m.aspxhome.com