Flutter基础控件--Text/RichText

  从本篇开始,将对Flutter的基础控件进行讲解。
  Flutter中的Text相当于Android中的TextView,属于最常用的Widget之一了。
  Text构造函数如下


  const Text(this.data, {
    Key key, // 选填参数,Key类型,Widget的标识,
    this.style, // 选填参数,TextStyle类型,文本样式
    this.strutStyle, // 选填参数,StrutStyle类型,设置每行的最小行高
    this.textAlign, // 选填参数,TextAlign类型,文本的对齐方式
    this.textDirection, // 选填参数,TextDirection类型,文字方向
    this.locale, // 选填参数,Local类型,用于选择用户语言和格式设置首选项的标识符
    this.softWrap, // 选填参数,bool类型,是否支持软换行符,如果是 false 的话,这个文本只有一行,水平方向是无限的
    this.overflow, // 选填参数,TextOverflow类型,文本的截断方式
    this.textScaleFactor, // 选填参数,double类型,代表文本相对于当前字体大小的缩放因子,默认值为1.0
    this.maxLines, // 选填参数,int类型,显示的最大行数
    this.semanticsLabel, // 选填参数,String类型,给文本加上一个语义标签(用不到)
  }) : assert(data != null),
       textSpan = null,
       super(key: key);
    
    ...
}

  常用属性如下:

属性 说明
textAlign 文本位置(TextAlign.left,TextAlign.right,TextAlign.center)
overflow 超出文本显示样式(TextOverflow.ellipsis,TextOverflow.clip,TextOverflow.fade)
maxLines 最大行数
softWrap 是否换行
style TextStyle文本样式

TextStyle构造函数如下:


class TextStyle extends Diagnosticable {

  const TextStyle({
    this.inherit = true, // 可选,类型 bool,是否继承父 Text 的样式,默认为 true,如果为 false,且样式没有设置具体的值,则采用默认值:白色、大小 10px、sans-serif 字体
    this.color, // 可选,类型 Color,文字的颜色
    this.fontSize, // 可选,类型 Color,文字的大小
    this.fontWeight, // 可选,类型 FontWeight,字体粗细
    this.fontStyle, // 可选,类型 FontStyle,是否在字体中倾斜字形
    this.letterSpacing, // 可选,类型 double,字母之间的间隔
    this.wordSpacing, // 可选,类型 double,字母之间的间隔
    this.textBaseline, // 可选,类型 TextBaseLine,用于对齐文本的水平线
    this.height, // 可选,类型 double,文本的高度,但它并不是一个绝对值,而是一个因子,具体的行高等于 fontSize * height
    this.locale, // 可选,类型 Locale,用于选择用户语言和格式设置首选项的标识符
    this.foreground, // 可选,类型 Paint,文本的前景色
    this.background, // 可选,类型 Paint,文本的背景色
    this.shadows, // 可选,类型 List<ui.Shadow>,在文本下方绘制阴影
    this.decoration, // 可选,类型 TextDecoration,文本的线条
    this.decorationColor, // 可选,类型 Color,TextDecoration 线条的颜色
    this.decorationStyle, // 可选,类型 TextDecorationStyle,TextDecoration 线条的样式
    this.debugLabel, // 可选,类型 String,文本样式的描述
    String fontFamily, // 可选,类型 String,用于设置使用那种自定义字体
    List<String> fontFamilyFallback, // 可选,类型 String,字体列表,当前面的字体找不到时,会在这个列表里依次查找
    String package, // 可选,类型 String
  }) : fontFamily = package == null ? fontFamily : 'packages/$package/$fontFamily',
       _fontFamilyFallback = fontFamilyFallback,
       _package = package,
       assert(inherit != null),
       assert(color == null || foreground == null, _kColorForegroundWarning);
       
    ...
}

  常用属性如下:

属性 说明
color 文本颜色
fontSize 文本大小(默认14)
fontStyle 字体样式(FontStyle.italic 使用斜体,FontStyle.normal 使用直立)
textBaseline 对齐文本的水平线:
fontFamily 文本字体
letterSpacing 水平字母之间的空间间隔(逻辑像素为单位)。可以使用负值来让字母更接近
wordSpacing 单词之间添加的空间间隔(逻辑像素为单位)。可以使用负值来使单词更接近。
height 文本行与行的高度,作为字体大小的倍数(取值1~2,如1.2)
background 文本背景色
foreground 文本的前景色,不能与color共同设置
fontWeight 绘制文本时使用的字体粗细:FontWeight.bold 常用的字体重量比正常重。FontWeight.normal 默认字体粗细
decorationStyle 绘制文本装饰的样式(画一条虚线 TextDecorationStyle.dashed,画两条线 TextDecorationStyle.double,画一条实线 TextDecorationStyle.solid,画一条实线 TextDecorationStyle.solid)
shadows 背景设定(边框、圆角、阴影、形状、渐变、背景图像等)详见Decoration用法

  RichText
RichText富文本就是使文本呈现各式各样的样式,在Android中通过SpannableString/SpannableStringBuilder来实现富文本
RichText构造函数

  RichText({
    Key key,
    @required this.text,
    this.textAlign = TextAlign.start,
    this.textDirection,
    this.softWrap = true,
    this.overflow = TextOverflow.clip,
    this.textScaleFactor = 1.0,
    this.maxLines,
    this.locale,
    this.strutStyle,
  }) : assert(text != null),
       assert(textAlign != null),
       assert(softWrap != null),
       assert(overflow != null),
       assert(textScaleFactor != null),
       assert(maxLines == null || maxLines > 0),
       super(key: key);

其常用属性和Text差不多
常用属性

属性 说明
textAligen 文本位置
textDirection 文本方向
softWrap 自动换行
overflow 文本超出部分显示样式
maxLines 最大行数

与Text不同,RichText的text属性不是String类型,而是TextSpan,这个TextSpan有点像Android富文本里面的ClickableSpan、ForegroundColorSpan等,TextSpan构造函数如下:

TextSpan({
    this.style,
    this.text,
    this.children,
    this.recognizer,
    this.semanticsLabel,
  })

常用属性

属性 说明
text 文本内容
style TextStyle,文本风格
children TextPan列表,实现多个富文本
recognizer 文本片段的手势交互,如点击、长按事件

完整代码

    children: <Widget>[
            Text(
              'You have pushed the button this many times:You have pushed the button this many times:You have pushed the button this many times:',
              textAlign: TextAlign.left,
              style: TextStyle(color: Color(0xffffc811), fontSize: 20),
            ),
            RichText(
              text: TextSpan(
                  text: 'RichText',
                  style: TextStyle(
                      color: Color(0xffffc811), fontStyle: FontStyle.normal),
                  children: [
                    TextSpan(
                        text: 'hello',
                        style: TextStyle(
                            color: Color(0xfff03f59),
                            fontStyle: FontStyle.italic),
                        recognizer: TapGestureRecognizer()
                          ..onTap = () {
                            print("click");
                          }),
                    TextSpan(
                        text: 'world',
                        style: TextStyle(
                            color: Color(0xffffc811),
                            fontStyle: FontStyle.italic))
                  ]),
            ),

Text有一个静态方法rich,可以达到RichText的效果。其实,看一下Text的build方法可以知道,Text实际上是对RichText的包装。

  @override
  Widget build(BuildContext context) {
    ...
    Widget result = RichText(
      ...
      text: TextSpan(
        ...
        text: data,
        children: textSpan != null ? <TextSpan>[textSpan] : null,
      ),
    );
    ...
    return result;
  }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容