无状态组件,文本显示
- 官网说明
单一样式的文字。
该文本控件显示与单一风格的文本字符串。该字符串可能会跨越多行,也可能全部显示在同一行上,具体取决于布局约束。
该风格参数可选。如果省略,则文本将使用最接近的封闭DefaultTextStyle的样式。如果给定样式的 TextStyle.inherit属性为true(默认值),则该给定样式将与最接近的DefaultTextStyle合并。这种合并行为非常有用,例如,在使用默认字体系列和大小时使文本变为粗体。
使用
支持的参数
- data 必要参数,Text显示的字符串
- Key 用于标记组件
- TextStyle style 描述text样式
- StructStylr 支撑样式,用于设置字符基线的最小高度
- TextAlign 文本依靠位置
- TextDirection 文本方向
- Local 字体
- softwarp 是否对文本溢出部分断行
- TextOverflow overflow 处理文本溢出部分
- textScaleFactor 文本缩放比值
- maxLines 最大行数
- semanticsLabel 设置标签
- TextWidthBasis 控制Text的宽度类型(与父widget同宽,或最小宽度)
- TextHeightBehavior 控制Text行高状态
const Text(
this.data, {
Key key,
this.style,
this.strutStyle,
this.textAlign,
this.textDirection,
this.locale,
this.softWrap,
this.overflow,
this.textScaleFactor,
this.maxLines,
this.semanticsLabel,
this.textWidthBasis,
this.textHeightBehavior,
})
实现源码
通过阅读build函数中的实现可以发现,其主要还是基于RichText实现的,简单来说就是对RichText的一个简单封装,以便一些常规使用
@override
Widget build(BuildContext context) {
final DefaultTextStyle defaultTextStyle = DefaultTextStyle.of(context);
TextStyle effectiveTextStyle = style;
if (style == null || style.inherit)
effectiveTextStyle = defaultTextStyle.style.merge(style);
if (MediaQuery.boldTextOverride(context))
effectiveTextStyle = effectiveTextStyle.merge(const TextStyle(fontWeight: FontWeight.bold));
/// 基于RichText实现
Widget result = RichText(
textAlign: textAlign ?? defaultTextStyle.textAlign ?? TextAlign.start,
textDirection: textDirection, // RichText uses Directionality.of to obtain a default if this is null.
locale: locale, // RichText uses Localizations.localeOf to obtain a default if this is null
softWrap: softWrap ?? defaultTextStyle.softWrap,
overflow: overflow ?? defaultTextStyle.overflow,
textScaleFactor: textScaleFactor ?? MediaQuery.textScaleFactorOf(context),
maxLines: maxLines ?? defaultTextStyle.maxLines,
strutStyle: strutStyle,
textWidthBasis: textWidthBasis ?? defaultTextStyle.textWidthBasis,
textHeightBehavior: textHeightBehavior ?? defaultTextStyle.textHeightBehavior ?? DefaultTextHeightBehavior.of(context),
text: TextSpan(
style: effectiveTextStyle,
text: data,
children: textSpan != null ? <InlineSpan>[textSpan] : null,
),
);
if (semanticsLabel != null) {
result = Semantics(
textDirection: textDirection,
label: semanticsLabel,
child: ExcludeSemantics(
child: result,
),
);
}
return result;
}