Render readable, predictable text across dynamic content lengths, locales, and accessibility settings.
Diagnose
Identify the failure mechanism before adjusting layout:
- Main-axis flex overflow: A non-flex
Textcan receive an unbounded constraint along aFlexmain axis and choose an intrinsic size larger than the space available beside its siblings, producingRenderFlex overflowed. - Orphaned words (widows): The last word of a headline or paragraph dangles alone on a new line because line breaking occurred at the final whitespace.
- Uncontrolled truncation: Text clips silently or exceeds intended lines without a visible truncation affordance (
ellipsis,fade). - Broken inline flow: Multiple adjacent
Textwidgets in aRowbreak across lines awkwardly instead of flowing as a continuous paragraph. - Text scale breakage: Enlarged system font scale (
TextScaler) causes text to clip inside fixed-height containers or push critical actions offscreen.
Rules
- Constrain the competing branch, not every
Text: In aRow, useFlexible,Expanded,SizedBox, orConstrainedBoxwhen text must share finite horizontal space with siblings. In aColumn, flex changes vertical allocation and is not a default fix for horizontal text overflow. Never add a flex child when the parent's main-axis constraint is unbounded. - Prevent orphaned words only where segmentation fits: A non-breaking space (
\u00A0) can bind the final two words of space-delimited headings, titles, and callouts. Do not apply that heuristic universally across locales. - Choose wrapping or truncation deliberately: Allow natural wrapping when the full copy matters. When the product contract calls for truncation, pair an explicit
maxLineswithTextOverflow.ellipsis,TextOverflow.fade, orTextOverflow.clip. Do not setsoftWrap: falsewithout verifying whether single-line clipping is acceptable. - Use
Text.richfor inline styling: PreferText.richfor ambient style and text scaling when mixing weights, colors, inline badges (WidgetSpan), or link recognizers. RawRichTextneeds deliberate span style and scaling, but can inherit ambient text direction. - Measure text with
TextPainterwhen layout depends on copy size: When building dynamic chips, custom canvas callouts, or expandable "Read more" widgets, layout aTextPainterwith explicitmaxWidthplus the ambient direction, locale, andTextScalerto check rendered height anddidExceedMaxLines. - Adapt to text scaling: Support enlarged system fonts (
MediaQuery.textScalerOf(context)). Avoid hardcoded container heights around text; prefer flexible or scrollable containers. - Account for internationalization: Design copy containers to tolerate 20–35% text length expansion for localized strings and support bidirectional text (
TextDirection).
Conditional references
- Read text overflow and wrapping when fixing flex overflows, eliminating orphaned words with non-breaking spaces, configuring
TextPaintermeasurements, or managing multi-line truncation.
Verification
Exercise the text component with:
- Minimum length copy (empty or single short word).
- Realistic expected copy.
- Maximum length / localized copy (including accented and long non-whitespace strings).
- Enlarged font scaling (
TextScaler.linear(1.5)andTextScaler.linear(2.0)). - Constrained parent widths (narrow mobile screens, tight cards, list items).
Write a widget test asserting no RenderFlex overflow, confirming intended line count, and verifying that truncation or non-breaking word pairing renders as expected.