【文本 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 组件(二)文本 与 输入框组件
260 0
|
10月前
|
缓存 Java 开发工具
Flutter的文本、图片和按钮使用
Flutter的文本、图片和按钮使用
103 0
|
1月前
|
移动开发 UED 容器
Flutter-自定义可展开文本控件
Flutter-自定义可展开文本控件
37 0
|
1月前
Flutter-底部弹出框(Widget层级)
文章描述了如何在Flutter中使用DraggableScrollableSheet创建一个底部弹出框,同时保持其可手势滑动关闭。作者遇到问题并提出对原控件进行扩展,以支持头部和列表布局的滑动关闭功能。
70 0
|
2月前
Flutter StreamBuilder 实现局部刷新 Widget
Flutter StreamBuilder 实现局部刷新 Widget
22 0
|
3月前
|
Android开发
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
|
3月前
|
开发框架 前端开发 搜索推荐
【Flutter前端技术开发专栏】Flutter中的自定义Widget与渲染流程
【4月更文挑战第30天】探索Flutter的自定义Widget与渲染流程。自定义Widget是实现复杂UI设计的关键,优点在于个性化设计、功能扩展和代码复用,但也面临性能优化和复杂性管理的挑战。创建步骤包括设计结构、定义Widget类、实现构建逻辑和处理交互。Flutter渲染流程涉及渲染对象树、布局、绘制和合成阶段。实践案例展示如何创建带渐变背景和阴影的自定义按钮。了解这些知识能提升应用体验并应对开发挑战。查阅官方文档以深入学习。
49 0
【Flutter前端技术开发专栏】Flutter中的自定义Widget与渲染流程
|
3月前
|
JavaScript 前端开发 开发者
【Flutter前端技术开发专栏】Flutter中的Widget与状态管理
【4月更文挑战第30天】本文探讨了Flutter的Widget和状态管理。Widget是Flutter构建UI的基础,分为有状态和无状态两种。状态管理确保UI随应用状态变化更新,影响应用性能和可维护性。文章介绍了`setState`、`Provider`、`Riverpod`、`Bloc`和`Redux`等状态管理方法,并通过计数器应用展示了其实现。选择合适的状态管理策略对高效开发至关重要。
37 0
【Flutter前端技术开发专栏】Flutter中的Widget与状态管理
|
3月前
|
编解码 算法 开发者
Flutter的布局系统:深入探索布局Widget与布局原则
【4月更文挑战第26天】Flutter布局系统详解,涵盖布局Widget(Row/Column、Stack、GridView/ListView、CustomSingleChildLayout)和布局原则(弹性布局、约束优先、流式布局、简洁明了)。文章旨在帮助开发者理解并运用Flutter的布局系统,创建适应性强、用户体验佳的界面。通过选择合适的布局Widget和遵循原则,可实现复杂且高效的UI设计。
|
3月前
|
前端开发 开发者 UED
Flutter的自定义Painter:深入探索自定义绘制Widget的技术实现
【4月更文挑战第26天】Flutter的自定义Painter允许开发者根据需求绘制独特UI,通过继承`CustomPaint`类和重写`paint`方法实现。在`paint`中使用`Canvas`绘制图形、路径等。创建自定义Painter类后,将其作为`CustomPaint` Widget的`painter`属性使用。此技术可实现自定义形状、渐变、动画等复杂效果,提升应用视觉体验。随着Flutter的进化,自定义Painter将提供更丰富的功能。