【文本 widget】Flutter RichText

简介: 【文本 widget】Flutter RichText

RichText 是绘制文本的核心 widget,Text 只是 RichText 的包装而已。文本这块还是相当复杂的,本文介绍一些基本的用法。

参数解析

text

text 是一个 InlineSpanInlineSpan 又可以嵌套 InlineSpan。每一段都可以有自己的样式。

textAlign

textAlign  负责 text 的对齐。RichText size 大于文本的 size  时有效。

wrap

wrap 默认为 true,文本自动换行,如果为 false,不会换行,只在一行显示。

overflow

overflow 默认为 TextOverflow.clip,会截断超出的文本。为 TextOverflow.ellipsis 时,按 maxLine 指定的行数显示,如果有超出显示 ...。

textScaleFactor

放大字体的因子。

maxLines

最多显示行数

selectionColor and  selectionRegistrar

选择文本相关

textHeightBehavior

要会用这个参数,先要明白 什么是 leading

leading  的计算方法TextStyle.height * TextStyle.fontSize - TextStyle.fontSize. 如果 TextStyle.height 没有设置, leading 的默认值由字体决定。一般来说 ,leading 默认不为 0,这也是为什么 文字占据的高度比字体值大的原因。height=1 可以让 leading 为 0。

如果 height 大于1,leading 会大于0,如何分配 leading 就由 textHeightBehavior 决定。

使用举例

RichText(
     text: TextSpan(
         text: 'IAM17',
         style: TextStyle(color: Colors.black),
         children: [
           TextSpan(
             recognizer: TapGestureRecognizer()
               ..onTap = () {
                print('click flutter');
               },
             text: 'Flutter',
             style: TextStyle(fontSize: 20, color: Colors.green)),
           TextSpan(text: '天天更新')
     ]))
复制代码

这样看起来有点乱,嵌套了两层。一个文本在第一层,二个文本在第二层。如果有多个 textSpan 可以省掉第一层的文本。

RichText(
  text:TextSpan(style: TextStyle(color: Colors.black), children: [
    TextSpan(text: 'IAM17'),
    TextSpan(
        recognizer: LongPressGestureRecognizer()
          ..onLongPress = () {
            print('click flutter');
          },
        text: 'Flutter',
        style: TextStyle(fontSize: 20, color: Colors.green)),
    TextSpan(text: '天天更新')
  ]))
复制代码

最外层的 style 是可以保留的,做为公共样式。最外层的文本去掉,这样就可以让所有文本在一个层级上,看起来更规整,也好维护。

你可能注意到本例中直接 new TapGestureRecognizer 对象,这样会导致资源不能及时释放。要释放资源,需要调用 TapGestureRecognizer 的 dispose 方法,垃圾回收不会自动执行 dispose 方法,所以需要我们手动释放。

推荐的做法是这样的。

late LongPressGestureRecognizer _longPressRecognizer;
  @override
  void initState() {
    super.initState();
    _longPressRecognizer = LongPressGestureRecognizer()
      ..onLongPress = _handlePress;
  }
  @override
  void dispose() {
    _longPressRecognizer.dispose();
    super.dispose();
  }
  void _handlePress() {
    print('handle long ress');
  }
  @override
  Widget build(BuildContext context){
      return RichText(
  text:TextSpan(style: TextStyle(color: Colors.black), children: [
    TextSpan(text: 'IAM17'),
    TextSpan(
        recognizer: _longPressRecognizer,
        text: 'Flutter',
        style: TextStyle(fontSize: 20, color: Colors.green)),
    TextSpan(text: '天天更新')
  ]))
  }
复制代码

不要怕麻烦,这样做肯定是没有问题的。

大多时候,一段的文本的样式都是一样的,所以 Flutter 为了我们提供了 Text,Text 把 RichText 进行了包装

return RichText(
     ...
      text: TextSpan(
        style: effectiveTextStyle,
        text: data,
        children: textSpan != null ? <InlineSpan>[textSpan!] : null,
      ),
  );
复制代码

当只有一种样式的文本时,可以这样写

Text('IAM17')
复制代码

代码简化了好多。

如果有多种样式的文本,可以用  Text.rich

Text.rich(
   TextSpan(
        style: TextStyle(color: Colors.black), children: [
            TextSpan(text: 'IAM17'),
            TextSpan(text: 'Flutter'),
        ]))
复制代码

所以我们一般不需要直接使用 RichText,用 Text 或 Text.rich 即可。

目录
相关文章
|
3月前
Flutter 组件(二)文本 与 输入框组件
Flutter 组件(二)文本 与 输入框组件
70 0
|
6月前
|
缓存 Java 开发工具
Flutter的文本、图片和按钮使用
Flutter的文本、图片和按钮使用
65 0
|
4天前
|
前端开发 开发者 UED
Flutter的自定义Painter:深入探索自定义绘制Widget的技术实现
【4月更文挑战第26天】Flutter的自定义Painter允许开发者根据需求绘制独特UI,通过继承`CustomPaint`类和重写`paint`方法实现。在`paint`中使用`Canvas`绘制图形、路径等。创建自定义Painter类后,将其作为`CustomPaint` Widget的`painter`属性使用。此技术可实现自定义形状、渐变、动画等复杂效果,提升应用视觉体验。随着Flutter的进化,自定义Painter将提供更丰富的功能。
|
4天前
|
编解码 算法 开发者
Flutter的布局系统:深入探索布局Widget与布局原则
【4月更文挑战第26天】Flutter布局系统详解,涵盖布局Widget(Row/Column、Stack、GridView/ListView、CustomSingleChildLayout)和布局原则(弹性布局、约束优先、流式布局、简洁明了)。文章旨在帮助开发者理解并运用Flutter的布局系统,创建适应性强、用户体验佳的界面。通过选择合适的布局Widget和遵循原则,可实现复杂且高效的UI设计。
|
4天前
|
开发框架 搜索推荐 Android开发
Flutter的Widget基础:概念、分类与深入探索
【4月更文挑战第26天】Flutter Widget详解:基础、分类与工作原理。Widget是Flutter UI的核心,描述界面外观而非直接渲染。分为基础、布局、可滚动及状态管理四大类。基于响应式编程,状态变化时自动更新UI。了解其概念、分类和原理,能助开发者高效构建精美应用。随着Flutter生态发展,Widget系统潜力无限。
|
7月前
|
Dart 前端开发 开发工具
谷歌移动UI框架Flutter教程之Widget
谷歌移动UI框架Flutter教程之Widget
|
8月前
Flutter源码分析笔记:Widget类源码分析
本文记录阅读与分析Flutter源码 - Widget类源码分析。
62 0
Flutter源码分析笔记:Widget类源码分析
|
9月前
|
API
Flutter控件之文本Text封装
文本Text比较简单,除了基类BaseWidget所提供的属性之外,又简单的扩展了部分属性,比如图文和富文本,都是系统原生的提供的,做了简单的封装。
|
9月前
|
API Android开发 容器
Flutter控件之基类Widget封装
基类的Widget主要确定以下几个方面,第一就是,自定义一个抽象类还是非抽象类,第二、继承方式,采取有状态还是无状态,第三、关于组件的点击方式,如何进行实现。
105 0
Flutter万物皆为Widget
Flutter 中的 Widget 是描述界面元素的基本单元,可以包含视觉和交互元素。Widget 可以嵌套、组合和扩展,从而构建出复杂的 UI 界面。在 Flutter 中,Widget 可以分为两种类型:StatelessWidget 和 StatefulWidget。
Flutter万物皆为Widget