Flutter快速制作一个水印组件实例详解
作者:半点橘色 时间:2023-05-16 23:32:20
项目开发的过程中,经常会遇到添加水印的需求,其作用无非就是防止重要信息通过截图外传。(虽然我觉得并没有什么卵用,但领导的需求是不容质疑的)
那么,作为一线码农的我,也只能屁颠屁颠的开搞。
通过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,水印,组件
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
mybatis plus中如何编写sql语句
2021-09-21 15:27:55
![](https://img.aspxhome.com/file/2023/1/83121_0s.png)
java实现推箱子小游戏
2023-02-09 04:57:52
![](https://img.aspxhome.com/file/2023/0/99740_0s.png)
SpringBoot基于Actuator远程关闭服务
2022-06-24 21:36:37
Java基于Tcp的基础聊天功能实例
2023-11-25 05:26:56
RxJava+Retrofit实现网络请求封装的方法
2023-08-13 19:39:13
![](https://img.aspxhome.com/file/2023/0/139590_0s.png)
GridView基于pulltorefresh实现下拉刷新 上拉加载更多功能(推荐)
2022-08-29 23:51:58
SpringBoot+Redis实现数据字典的方法
2022-08-03 14:22:29
![](https://img.aspxhome.com/file/2023/4/65364_0s.jpg)
通过Java查看程序资源占用情况
2023-11-10 02:01:19
![](https://img.aspxhome.com/file/2023/5/59175_0s.png)
实例代码讲解JAVA 观察者模式
2023-09-11 19:22:18
![](https://img.aspxhome.com/file/2023/9/83139_0s.jpg)
Java Property类使用详解
2023-11-06 21:52:57
![](https://img.aspxhome.com/file/2023/7/58667_0s.png)
springCloud config本地配置操作
2023-01-13 11:07:56
![](https://img.aspxhome.com/file/2023/7/96037_0s.jpg)
一文带你搞懂Java定时器Timer的使用
2022-09-08 01:18:16
![](https://img.aspxhome.com/file/2023/3/72373_0s.png)
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
![](https://img.aspxhome.com/file/2023/9/79349_0s.png)
Kotlin与Java的区别详解
2023-06-22 16:25:58
![](https://img.aspxhome.com/file/2023/6/75696_0s.jpg)
Flowable执行完毕的流程查找方法
2023-01-30 08:53:36
![](https://img.aspxhome.com/file/2023/8/104058_0s.png)
C#中String StringBuilder StringBuffer类的用法
2023-05-21 02:35:50
![](https://img.aspxhome.com/file/2023/6/91346_0s.png)
JAVA随机打乱数组顺序的方法
2023-08-11 18:56:03