import 'package:flutter/cupertino.dart'; class ChatBubble extends CustomPainter { final Color color; final Alignment? alignment; ChatBubble({ required this.color, this.alignment, }); final _radius = 10.0; final _x = 10.0; @override void paint(Canvas canvas, Size size) { if (alignment == Alignment.topRight) { canvas.drawRRect( RRect.fromLTRBAndCorners( 0, 0, size.width - 8, size.height, bottomLeft: Radius.circular(_radius), topRight: Radius.circular(_radius), topLeft: Radius.circular(_radius), ), Paint() ..color = color ..style = PaintingStyle.fill); var path = Path(); path.moveTo(size.width - _x, size.height - 20); path.lineTo(size.width - _x, size.height); path.lineTo(size.width, size.height); canvas.clipPath(path); canvas.drawRRect( RRect.fromLTRBAndCorners( size.width - _x, 0.0, size.width, size.height, topRight: Radius.circular(_radius), ), Paint() ..color = color ..style = PaintingStyle.fill); } else { canvas.drawRRect( RRect.fromLTRBAndCorners( _x, 0, size.width, size.height, bottomRight: Radius.circular(_radius), topRight: Radius.circular(_radius), topLeft: Radius.circular(_radius), ), Paint() ..color = color ..style = PaintingStyle.fill); var path = Path(); path.moveTo(0, size.height); path.lineTo(_x, size.height); path.lineTo(_x, size.height - 20); canvas.clipPath(path); canvas.drawRRect( RRect.fromLTRBAndCorners( 0, 0.0, _x, size.height, topRight: Radius.circular(_radius), ), Paint() ..color = color ..style = PaintingStyle.fill); } } @override bool shouldRepaint(CustomPainter oldDelegate) { return true; } }