import 'dart:ui'; import 'package:flutter/material.dart'; class VoucherClipper extends CustomClipper { @override Path getClip(Size size) { final path = Path(); double notchRadius = 10.0; double notchPosition = size.height * 0.6; // Position of notch // Start from top-left path.moveTo(0, 12); // Top edge with rounded corners path.quadraticBezierTo(0, 0, 12, 0); path.lineTo(size.width - 12, 0); path.quadraticBezierTo(size.width, 0, size.width, 12); // Right edge until notch path.lineTo(size.width, notchPosition - notchRadius); // Right notch (semicircle going inward) path.arcToPoint( Offset(size.width, notchPosition + notchRadius), radius: Radius.circular(notchRadius), clockwise: false, ); // Continue right edge path.lineTo(size.width, size.height - 12); // Bottom edge path.quadraticBezierTo( size.width, size.height, size.width - 12, size.height, ); path.lineTo(12, size.height); path.quadraticBezierTo(0, size.height, 0, size.height - 12); // Left edge until notch path.lineTo(0, notchPosition + notchRadius); // Left notch (semicircle going inward) path.arcToPoint( Offset(0, notchPosition - notchRadius), radius: Radius.circular(notchRadius), clockwise: false, ); // Close path path.close(); return path; } @override bool shouldReclip(covariant CustomClipper oldClipper) => false; }