Expose TextHeightBehavior in Text, RichText, and DefaultTextStyle. (#48346)
This commit is contained in:
parent
e8b3d7f358
commit
52df599419
@ -17,7 +17,7 @@
|
||||
/// painting boxes.
|
||||
library painting;
|
||||
|
||||
export 'dart:ui' show Shadow, PlaceholderAlignment;
|
||||
export 'dart:ui' show Shadow, PlaceholderAlignment, TextHeightBehavior;
|
||||
|
||||
export 'src/painting/alignment.dart';
|
||||
export 'src/painting/basic_types.dart';
|
||||
|
@ -3,7 +3,7 @@
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'dart:math' show min, max;
|
||||
import 'dart:ui' as ui show Paragraph, ParagraphBuilder, ParagraphConstraints, ParagraphStyle, PlaceholderAlignment, LineMetrics;
|
||||
import 'dart:ui' as ui show Paragraph, ParagraphBuilder, ParagraphConstraints, ParagraphStyle, PlaceholderAlignment, LineMetrics, TextHeightBehavior;
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
@ -142,6 +142,7 @@ class TextPainter {
|
||||
Locale locale,
|
||||
StrutStyle strutStyle,
|
||||
TextWidthBasis textWidthBasis = TextWidthBasis.parent,
|
||||
ui.TextHeightBehavior textHeightBehavior,
|
||||
}) : assert(text == null || text.debugAssertIsValid()),
|
||||
assert(textAlign != null),
|
||||
assert(textScaleFactor != null),
|
||||
@ -155,7 +156,8 @@ class TextPainter {
|
||||
_ellipsis = ellipsis,
|
||||
_locale = locale,
|
||||
_strutStyle = strutStyle,
|
||||
_textWidthBasis = textWidthBasis;
|
||||
_textWidthBasis = textWidthBasis,
|
||||
_textHeightBehavior = textHeightBehavior;
|
||||
|
||||
ui.Paragraph _paragraph;
|
||||
bool _needsLayout = true;
|
||||
@ -340,6 +342,16 @@ class TextPainter {
|
||||
markNeedsLayout();
|
||||
}
|
||||
|
||||
/// {@macro flutter.dart:ui.textHeightBehavior}
|
||||
ui.TextHeightBehavior get textHeightBehavior => _textHeightBehavior;
|
||||
ui.TextHeightBehavior _textHeightBehavior;
|
||||
set textHeightBehavior(ui.TextHeightBehavior value) {
|
||||
assert(value != null);
|
||||
if (_textHeightBehavior == value)
|
||||
return;
|
||||
_textHeightBehavior = value;
|
||||
markNeedsLayout();
|
||||
}
|
||||
|
||||
ui.Paragraph _layoutTemplate;
|
||||
|
||||
@ -399,6 +411,7 @@ class TextPainter {
|
||||
textDirection: textDirection ?? defaultTextDirection,
|
||||
textScaleFactor: textScaleFactor,
|
||||
maxLines: _maxLines,
|
||||
textHeightBehavior: _textHeightBehavior,
|
||||
ellipsis: _ellipsis,
|
||||
locale: _locale,
|
||||
strutStyle: _strutStyle,
|
||||
@ -406,6 +419,7 @@ class TextPainter {
|
||||
textAlign: textAlign,
|
||||
textDirection: textDirection ?? defaultTextDirection,
|
||||
maxLines: maxLines,
|
||||
textHeightBehavior: _textHeightBehavior,
|
||||
ellipsis: ellipsis,
|
||||
locale: locale,
|
||||
);
|
||||
|
@ -2,7 +2,7 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'dart:ui' as ui show ParagraphStyle, TextStyle, StrutStyle, lerpDouble, Shadow, FontFeature;
|
||||
import 'dart:ui' as ui show ParagraphStyle, TextStyle, StrutStyle, lerpDouble, Shadow, FontFeature, TextHeightBehavior;
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
@ -1067,6 +1067,7 @@ class TextStyle extends Diagnosticable {
|
||||
double textScaleFactor = 1.0,
|
||||
String ellipsis,
|
||||
int maxLines,
|
||||
ui.TextHeightBehavior textHeightBehavior,
|
||||
Locale locale,
|
||||
String fontFamily,
|
||||
double fontSize,
|
||||
@ -1087,6 +1088,7 @@ class TextStyle extends Diagnosticable {
|
||||
fontFamily: fontFamily ?? this.fontFamily,
|
||||
fontSize: (fontSize ?? this.fontSize ?? _defaultFontSize) * textScaleFactor,
|
||||
height: height ?? this.height,
|
||||
textHeightBehavior: textHeightBehavior,
|
||||
strutStyle: strutStyle == null ? null : ui.StrutStyle(
|
||||
fontFamily: strutStyle.fontFamily,
|
||||
fontFamilyFallback: strutStyle.fontFamilyFallback,
|
||||
|
@ -3,7 +3,7 @@
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'dart:math' as math;
|
||||
import 'dart:ui' as ui show Gradient, Shader, TextBox, PlaceholderAlignment;
|
||||
import 'dart:ui' as ui show Gradient, Shader, TextBox, PlaceholderAlignment, TextHeightBehavior;
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/gestures.dart';
|
||||
@ -72,9 +72,10 @@ class RenderParagraph extends RenderBox
|
||||
TextOverflow overflow = TextOverflow.clip,
|
||||
double textScaleFactor = 1.0,
|
||||
int maxLines,
|
||||
TextWidthBasis textWidthBasis = TextWidthBasis.parent,
|
||||
Locale locale,
|
||||
StrutStyle strutStyle,
|
||||
TextWidthBasis textWidthBasis = TextWidthBasis.parent,
|
||||
ui.TextHeightBehavior textHeightBehavior,
|
||||
List<RenderBox> children,
|
||||
}) : assert(text != null),
|
||||
assert(text.debugAssertIsValid()),
|
||||
@ -97,6 +98,7 @@ class RenderParagraph extends RenderBox
|
||||
locale: locale,
|
||||
strutStyle: strutStyle,
|
||||
textWidthBasis: textWidthBasis,
|
||||
textHeightBehavior: textHeightBehavior
|
||||
) {
|
||||
addAll(children);
|
||||
_extractPlaceholderSpans(text);
|
||||
@ -275,6 +277,16 @@ class RenderParagraph extends RenderBox
|
||||
markNeedsLayout();
|
||||
}
|
||||
|
||||
/// {@macro flutter.dart:ui.textHeightBehavior}
|
||||
ui.TextHeightBehavior get textHeightBehavior => _textPainter.textHeightBehavior;
|
||||
set textHeightBehavior(ui.TextHeightBehavior value) {
|
||||
if (_textPainter.textHeightBehavior == value)
|
||||
return;
|
||||
_textPainter.textHeightBehavior = value;
|
||||
_overflowShader = null;
|
||||
markNeedsLayout();
|
||||
}
|
||||
|
||||
@override
|
||||
double computeMinIntrinsicWidth(double height) {
|
||||
if (!_canComputeIntrinsics()) {
|
||||
|
@ -2,7 +2,7 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'dart:ui' as ui show Image, ImageFilter;
|
||||
import 'dart:ui' as ui show Image, ImageFilter, TextHeightBehavior;
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/gestures.dart';
|
||||
@ -5063,6 +5063,7 @@ class RichText extends MultiChildRenderObjectWidget {
|
||||
this.locale,
|
||||
this.strutStyle,
|
||||
this.textWidthBasis = TextWidthBasis.parent,
|
||||
this.textHeightBehavior,
|
||||
}) : assert(text != null),
|
||||
assert(textAlign != null),
|
||||
assert(softWrap != null),
|
||||
@ -5144,6 +5145,9 @@ class RichText extends MultiChildRenderObjectWidget {
|
||||
/// {@macro flutter.widgets.text.DefaultTextStyle.textWidthBasis}
|
||||
final TextWidthBasis textWidthBasis;
|
||||
|
||||
/// {@macro flutter.dart:ui.textHeightBehavior}
|
||||
final ui.TextHeightBehavior textHeightBehavior;
|
||||
|
||||
@override
|
||||
RenderParagraph createRenderObject(BuildContext context) {
|
||||
assert(textDirection != null || debugCheckHasDirectionality(context));
|
||||
@ -5156,6 +5160,7 @@ class RichText extends MultiChildRenderObjectWidget {
|
||||
maxLines: maxLines,
|
||||
strutStyle: strutStyle,
|
||||
textWidthBasis: textWidthBasis,
|
||||
textHeightBehavior: textHeightBehavior,
|
||||
locale: locale ?? Localizations.localeOf(context, nullOk: true),
|
||||
);
|
||||
}
|
||||
@ -5173,6 +5178,7 @@ class RichText extends MultiChildRenderObjectWidget {
|
||||
..maxLines = maxLines
|
||||
..strutStyle = strutStyle
|
||||
..textWidthBasis = textWidthBasis
|
||||
..textHeightBehavior = textHeightBehavior
|
||||
..locale = locale ?? Localizations.localeOf(context, nullOk: true);
|
||||
}
|
||||
|
||||
|
@ -2,6 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'dart:ui' as ui show TextHeightBehavior;
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/painting.dart';
|
||||
|
||||
@ -43,6 +45,7 @@ class DefaultTextStyle extends InheritedTheme {
|
||||
this.overflow = TextOverflow.clip,
|
||||
this.maxLines,
|
||||
this.textWidthBasis = TextWidthBasis.parent,
|
||||
this.textHeightBehavior,
|
||||
@required Widget child,
|
||||
}) : assert(style != null),
|
||||
assert(softWrap != null),
|
||||
@ -65,6 +68,7 @@ class DefaultTextStyle extends InheritedTheme {
|
||||
maxLines = null,
|
||||
overflow = TextOverflow.clip,
|
||||
textWidthBasis = TextWidthBasis.parent,
|
||||
textHeightBehavior = null,
|
||||
super(key: key, child: null);
|
||||
|
||||
/// Creates a default text style that overrides the text styles in scope at
|
||||
@ -141,6 +145,9 @@ class DefaultTextStyle extends InheritedTheme {
|
||||
/// See [TextWidthBasis] for possible values and their implications.
|
||||
final TextWidthBasis textWidthBasis;
|
||||
|
||||
/// {@macro flutter.dart:ui.textHeightBehavior}
|
||||
final ui.TextHeightBehavior textHeightBehavior;
|
||||
|
||||
/// The closest instance of this class that encloses the given context.
|
||||
///
|
||||
/// If no such instance exists, returns an instance created by
|
||||
@ -162,7 +169,8 @@ class DefaultTextStyle extends InheritedTheme {
|
||||
softWrap != oldWidget.softWrap ||
|
||||
overflow != oldWidget.overflow ||
|
||||
maxLines != oldWidget.maxLines ||
|
||||
textWidthBasis != oldWidget.textWidthBasis;
|
||||
textWidthBasis != oldWidget.textWidthBasis ||
|
||||
textHeightBehavior != oldWidget.textHeightBehavior;
|
||||
}
|
||||
|
||||
@override
|
||||
@ -175,6 +183,7 @@ class DefaultTextStyle extends InheritedTheme {
|
||||
overflow: overflow,
|
||||
maxLines: maxLines,
|
||||
textWidthBasis: textWidthBasis,
|
||||
textHeightBehavior: textHeightBehavior,
|
||||
child: child,
|
||||
);
|
||||
}
|
||||
@ -188,6 +197,7 @@ class DefaultTextStyle extends InheritedTheme {
|
||||
properties.add(EnumProperty<TextOverflow>('overflow', overflow, defaultValue: null));
|
||||
properties.add(IntProperty('maxLines', maxLines, defaultValue: null));
|
||||
properties.add(EnumProperty<TextWidthBasis>('textWidthBasis', textWidthBasis, defaultValue: TextWidthBasis.parent));
|
||||
properties.add(DiagnosticsProperty<ui.TextHeightBehavior>('textHeightBehavior', textHeightBehavior, defaultValue: null));
|
||||
}
|
||||
}
|
||||
|
||||
@ -283,6 +293,7 @@ class Text extends StatelessWidget {
|
||||
this.maxLines,
|
||||
this.semanticsLabel,
|
||||
this.textWidthBasis,
|
||||
this.textHeightBehavior,
|
||||
}) : assert(
|
||||
data != null,
|
||||
'A non-null String must be provided to a Text widget.',
|
||||
@ -314,6 +325,7 @@ class Text extends StatelessWidget {
|
||||
this.maxLines,
|
||||
this.semanticsLabel,
|
||||
this.textWidthBasis,
|
||||
this.textHeightBehavior,
|
||||
}) : assert(
|
||||
textSpan != null,
|
||||
'A non-null TextSpan must be provided to a Text.rich widget.',
|
||||
@ -416,6 +428,9 @@ class Text extends StatelessWidget {
|
||||
/// {@macro flutter.painting.textPainter.textWidthBasis}
|
||||
final TextWidthBasis textWidthBasis;
|
||||
|
||||
/// {@macro flutter.dart:ui.textHeightBehavior}
|
||||
final ui.TextHeightBehavior textHeightBehavior;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final DefaultTextStyle defaultTextStyle = DefaultTextStyle.of(context);
|
||||
@ -434,6 +449,7 @@ class Text extends StatelessWidget {
|
||||
maxLines: maxLines ?? defaultTextStyle.maxLines,
|
||||
strutStyle: strutStyle,
|
||||
textWidthBasis: textWidthBasis ?? defaultTextStyle.textWidthBasis,
|
||||
textHeightBehavior: textHeightBehavior ?? defaultTextStyle.textHeightBehavior,
|
||||
text: TextSpan(
|
||||
style: effectiveTextStyle,
|
||||
text: data,
|
||||
@ -467,6 +483,8 @@ class Text extends StatelessWidget {
|
||||
properties.add(EnumProperty<TextOverflow>('overflow', overflow, defaultValue: null));
|
||||
properties.add(DoubleProperty('textScaleFactor', textScaleFactor, defaultValue: null));
|
||||
properties.add(IntProperty('maxLines', maxLines, defaultValue: null));
|
||||
properties.add(EnumProperty<TextWidthBasis>('textWidthBasis', textWidthBasis, defaultValue: null));
|
||||
properties.add(DiagnosticsProperty<ui.TextHeightBehavior>('textHeightBehavior', textHeightBehavior, defaultValue: null));
|
||||
if (semanticsLabel != null) {
|
||||
properties.add(StringProperty('semanticsLabel', semanticsLabel));
|
||||
}
|
||||
|
@ -829,6 +829,7 @@ class _TextStyleProxy implements TextStyle {
|
||||
double textScaleFactor = 1.0,
|
||||
String ellipsis,
|
||||
int maxLines,
|
||||
ui.TextHeightBehavior textHeightBehavior,
|
||||
Locale locale,
|
||||
String fontFamily,
|
||||
double fontSize,
|
||||
|
@ -1316,4 +1316,47 @@ void main() {
|
||||
matchesGoldenFile('text_golden.TextInlineWidgetMiddle.1.png'),
|
||||
);
|
||||
});
|
||||
|
||||
testWidgets('Text TextHeightBehavior', (WidgetTester tester) async {
|
||||
await tester.pumpWidget(
|
||||
Center(
|
||||
child: RepaintBoundary(
|
||||
child: Container(
|
||||
width: 200.0,
|
||||
height: 700.0,
|
||||
decoration: const BoxDecoration(
|
||||
color: Color(0xff00ff00),
|
||||
),
|
||||
child: Column(
|
||||
children: const <Widget>[
|
||||
Text('Hello\nLine 2\nLine 3',
|
||||
textDirection: TextDirection.ltr,
|
||||
style: TextStyle(height: 5,),
|
||||
),
|
||||
Text('Hello\nLine 2\nLine 3',
|
||||
textDirection: TextDirection.ltr,
|
||||
style: TextStyle(height: 5,),
|
||||
textHeightBehavior: TextHeightBehavior(
|
||||
applyHeightToFirstAscent: false,
|
||||
applyHeightToLastDescent: false,
|
||||
),
|
||||
),
|
||||
Text('Hello',
|
||||
textDirection: TextDirection.ltr,
|
||||
style: TextStyle(height: 5,),
|
||||
textHeightBehavior: TextHeightBehavior(
|
||||
applyHeightToFirstAscent: false,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
await expectLater(
|
||||
find.byType(Container),
|
||||
matchesGoldenFile('text_golden.TextHeightBehavior.1.png'),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user