import 'dart:ui' as ui; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; /// 防截屏水印(对应 Android WatermarkUtils) class Watermark extends StatelessWidget { final String text; final int columns; final int rows; final double rotation; const Watermark({ super.key, required this.text, this.columns = 4, this.rows = 8, this.rotation = -0.4, }); @override Widget build(BuildContext context) { return IgnorePointer( ignoring: true, child: CustomPaint( painter: _WatermarkPainter( text: '$text ${DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now())}', columns: columns, rows: rows, rotation: rotation, ), child: const SizedBox.expand(), ), ); } } class _WatermarkPainter extends CustomPainter { final String text; final int columns; final int rows; final double rotation; _WatermarkPainter({ required this.text, required this.columns, required this.rows, required this.rotation, }); @override void paint(Canvas canvas, Size size) { final textPainter = TextPainter( text: TextSpan( text: text, style: TextStyle( color: Colors.black.withValues(alpha: 0.06), fontSize: 14, ), ), textDirection: ui.TextDirection.ltr, )..layout(); final dx = size.width / columns; final dy = size.height / rows; for (int i = 0; i <= columns; i++) { for (int j = 0; j <= rows; j++) { canvas.save(); canvas.translate(i * dx, j * dy); canvas.rotate(rotation); textPainter.paint(canvas, const Offset(0, 0)); canvas.restore(); } } } @override bool shouldRepaint(_WatermarkPainter old) => old.text != text; }