Last active
May 5, 2020 09:05
-
-
Save prafullakumar/8295e7429fff3f2bee4349660e53ffd0 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class AdaptableText extends StatelessWidget { | |
final String text; | |
final TextStyle style; | |
final TextAlign textAlign; | |
final TextDirection textDirection; | |
final double minimumFontScale; | |
final TextOverflow textOverflow; | |
const AdaptableText(this.text, | |
{this.style, | |
this.textAlign = TextAlign.left, | |
this.textDirection = TextDirection.ltr, | |
this.minimumFontScale = 0.5, | |
this.textOverflow = TextOverflow.ellipsis, | |
Key key}) | |
: super(key: key); | |
@override | |
Widget build(BuildContext context) { | |
TextPainter _painter = TextPainter( | |
text: TextSpan(text: this.text, style: this.style), | |
textAlign: this.textAlign, | |
textScaleFactor: 1, | |
maxLines: 100, | |
textDirection: this.textDirection); | |
return LayoutBuilder( | |
builder: (context, constraints) { | |
_painter.layout(maxWidth: constraints.maxWidth); | |
double textScaleFactor = 1; | |
if (_painter.height > constraints.maxHeight) { // | |
print('${_painter.size}'); | |
_painter.textScaleFactor = minimumFontScale; | |
_painter.layout(maxWidth: constraints.maxWidth); | |
print('${_painter.size}'); | |
if (_painter.height > constraints.maxHeight) { // | |
//even minimum does not fit render it with minimum size | |
print("Using minimum set font"); | |
textScaleFactor = minimumFontScale; | |
} else if (minimumFontScale < 1) { | |
//binary search for valid Scale factor | |
int h = 100; //why 100, strpping 0.01 scale factor to get exact fit value | |
int l = (minimumFontScale * 100).toInt(); | |
while (h > l) { | |
int mid = (l + (h - l) / 2).toInt(); | |
double newScale = mid.toDouble()/100.0; | |
_painter.textScaleFactor = newScale; | |
_painter.layout(maxWidth: constraints.maxWidth); | |
if (_painter.height > constraints.maxHeight) { // | |
h = mid - 1; | |
} else { | |
l = mid + 1; | |
} | |
if (h <= l) { | |
print('${_painter.size}'); | |
textScaleFactor = newScale - 0.01; | |
_painter.textScaleFactor = newScale; | |
_painter.layout(maxWidth: constraints.maxWidth); | |
break; | |
} | |
} | |
} | |
} | |
return Text( | |
this.text, | |
style: this.style, | |
textAlign: this.textAlign, | |
textDirection: this.textDirection, | |
textScaleFactor: textScaleFactor, | |
maxLines: 100, | |
overflow: textOverflow, | |
); | |
}, | |
); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment