127 lines
3.8 KiB
Dart
127 lines
3.8 KiB
Dart
|
|
// ignore_for_file: file_names
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
class TextSize {
|
|
static Size boundingTextSize(String text, TextStyle style,
|
|
{int maxLines = 2 ^ 31, double maxWidth = double.infinity}) {
|
|
if (text.isEmpty) {
|
|
return const Size(0, 0);
|
|
}
|
|
final TextPainter textPainter = TextPainter(
|
|
textDirection: TextDirection.ltr,
|
|
text: TextSpan(text: text, style: style),
|
|
maxLines: maxLines)
|
|
..layout(maxWidth: maxWidth);
|
|
return textPainter.size;
|
|
}
|
|
}
|
|
|
|
class CustomText extends StatefulWidget {
|
|
const CustomText(
|
|
this.text, {
|
|
Key? key,
|
|
required this.width,
|
|
this.offset,
|
|
this.overflowtext,
|
|
this.style,
|
|
this.strutStyle,
|
|
this.textAlign,
|
|
this.textDirection,
|
|
this.locale,
|
|
this.softWrap,
|
|
this.overflow,
|
|
this.textScaleFactor,
|
|
this.maxLines,
|
|
this.semanticsLabel,
|
|
this.textWidthBasis,
|
|
this.textHeightBehavior,
|
|
}) : super(key: key);
|
|
final String text;
|
|
final double width;
|
|
final String? overflowtext;
|
|
final int? offset;
|
|
final TextStyle? style;
|
|
final StrutStyle? strutStyle;
|
|
final TextAlign? textAlign;
|
|
final TextDirection? textDirection;
|
|
final Locale? locale;
|
|
final bool? softWrap;
|
|
final TextOverflow? overflow;
|
|
final double? textScaleFactor;
|
|
final int? maxLines;
|
|
final String? semanticsLabel;
|
|
final TextWidthBasis? textWidthBasis;
|
|
final TextHeightBehavior? textHeightBehavior;
|
|
|
|
@override
|
|
State<CustomText> createState() => _ExtendTextState();
|
|
}
|
|
|
|
class _ExtendTextState extends State<CustomText> {
|
|
String? text;
|
|
countTextSize() {
|
|
TextStyle style = widget.style ?? const TextStyle(fontSize: 14);
|
|
double textwidth = TextSize.boundingTextSize(widget.text, style).width;
|
|
int offset = widget.offset ?? 3;
|
|
if (textwidth > widget.width) {
|
|
int position = widget.text.lastIndexOf('.');
|
|
if(position < 1){
|
|
int numberOfCharsToRemove = ((textwidth - widget.width) / (style.fontSize ?? 14)).floor();
|
|
String overflowText = widget.overflowtext ?? '...';
|
|
text = widget.text.replaceRange(widget.text.length - numberOfCharsToRemove, widget.text.length, '') + overflowText;
|
|
}else{
|
|
String overflowtext = widget.overflowtext ?? '...';
|
|
int overflowtextLength = overflowtext.length;
|
|
double singTextSize = textwidth / widget.text.length;
|
|
String newtext =
|
|
'${widget.text.substring(0, position - offset)}$overflowtext${widget.text.substring(position - offset, widget.text.length)}';
|
|
position += overflowtextLength;
|
|
int number = ((textwidth - widget.width) / singTextSize).ceil();
|
|
do {
|
|
int a = position - offset - overflowtextLength - number;
|
|
newtext = newtext.substring(0, a < 1 ? 1 : a) +
|
|
newtext.substring(
|
|
position - offset - overflowtextLength, newtext.length);
|
|
position -= number;
|
|
number =
|
|
((TextSize.boundingTextSize(newtext, style).width - widget.width) /
|
|
singTextSize)
|
|
.ceil();
|
|
if (a < 1 || number < 1) {
|
|
break;
|
|
}
|
|
} while (
|
|
TextSize.boundingTextSize(newtext, style).width > widget.width - 20);
|
|
text = newtext;
|
|
}
|
|
}
|
|
}
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
countTextSize();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Text(
|
|
text ?? widget.text,
|
|
style: widget.style,
|
|
strutStyle: widget.strutStyle,
|
|
textAlign: widget.textAlign,
|
|
textDirection: widget.textDirection,
|
|
locale: widget.locale,
|
|
softWrap: widget.softWrap,
|
|
overflow: widget.overflow,
|
|
textScaleFactor: widget.textScaleFactor,
|
|
maxLines: widget.maxLines,
|
|
semanticsLabel: widget.semanticsLabel,
|
|
textWidthBasis: widget.textWidthBasis,
|
|
textHeightBehavior: widget.textHeightBehavior,
|
|
);
|
|
}
|
|
}
|