经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Flutter » 查看文章
Flutter快速制作一个水印组件实例详解
来源:jb51  时间:2023/2/1 9:35:56  对本文有异议

正文

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

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

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

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

  1. class Watermark extends StatelessWidget {
  2. const Watermark({Key? key, required this.child}) : super(key: key);
  3. final Widget child;
  4. /// 水印信息
  5. final String waterInfo = '半点橘色 6666';
  6. @override
  7. Widget build(BuildContext context) {
  8. return Stack(
  9. children: [
  10. child,
  11. _createWatermark(),
  12. ],
  13. );
  14. }
  15. /// ....
  16. }

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

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

createWatermark方法

核心内容就在于createWatermark方法。

  1. /// 创建水印
  2. Widget _createWatermark() {
  3. return IgnorePointer(
  4. child: Column(
  5. children: List.generate(
  6. 6,
  7. (index) => Expanded(
  8. child: Row(
  9. children: List.generate(
  10. 3,
  11. (index) => Expanded(
  12. child: Center(
  13. child: Transform.rotate(
  14. angle: -0.34,
  15. child: Text(
  16. waterInfo,
  17. style: const TextStyle(
  18. color: Color(0x10000000),
  19. fontSize: 14,
  20. decoration: TextDecoration.none,
  21. ),
  22. ),
  23. ),
  24. ),
  25. ),
  26. ),
  27. ),
  28. ),
  29. ),
  30. ),
  31. );
  32. }

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

其中IgnorePointer组件是个重点。

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

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

Watermark组件的完整代码

  1. import 'package:flutter/material.dart';
  2. /// 水印组件
  3. class Watermark extends StatelessWidget {
  4. const Watermark({Key? key, required this.child}) : super(key: key);
  5. final Widget child;
  6. final String waterInfo = '半点橘色 6666';
  7. @override
  8. Widget build(BuildContext context) {
  9. return Stack(
  10. children: [
  11. child,
  12. _createWatermark(),
  13. ],
  14. );
  15. }
  16. /// 创建水印
  17. Widget _createWatermark() {
  18. return IgnorePointer(
  19. child: Column(
  20. children: List.generate(
  21. 6,
  22. (index) => Expanded(
  23. child: Row(
  24. children: List.generate(
  25. 3,
  26. (index) => Expanded(
  27. child: Center(
  28. child: Transform.rotate(
  29. angle: -0.34,
  30. child: Text(
  31. waterInfo,
  32. style: const TextStyle(
  33. color: Color(0x10000000),
  34. fontSize: 14,
  35. decoration: TextDecoration.none,
  36. ),
  37. ),
  38. ),
  39. ),
  40. ),
  41. ),
  42. ),
  43. ),
  44. ),
  45. ),
  46. );
  47. }
  48. }

是不是很简单?

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

以上就是Flutter快速制作一个水印组件实例详解的详细内容,更多关于Flutter制作水印组件的资料请关注w3xue其它相关文章!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号