import 'package:flutter/material.dart'; class OmitStartText extends StatelessWidget { final String text; final int? maxLines; final TextStyle? style; final TextOverflow? overflow; const OmitStartText( this.text, { super.key, this.maxLines, this.style, this.overflow, }); @override Widget build(BuildContext context) { return LayoutBuilder(builder: (context, size) { bool exceeded = false; int len = 0; for (; !exceeded && len < text.length; len++) { // Build the textspan var span = TextSpan( text: 'A' * 7 + text.substring(text.length - len), style: style ?? Theme.of(context).textTheme.bodyMedium, ); // Use a textpainter to determine if it will exceed max lines var tp = TextPainter( maxLines: maxLines ?? 1, textDirection: TextDirection.ltr, text: span, ); // trigger it to layout tp.layout(maxWidth: size.maxWidth); // whether the text overflowed or not exceeded = tp.didExceedMaxLines; } return Text( (exceeded ? '...' : '') + text.substring(text.length - len), overflow: overflow ?? TextOverflow.fade, softWrap: false, maxLines: maxLines ?? 1, style: style, ); }); } }