【Flutter造轮子】Text组件显示指定行文字,若有超出加...点击查看更多

2023-10-27

样例
效果如上图,如果超出,显示“…点击查看更多”,正好凑够4行,再添加一个字便超出4行。
原理: 使用TextPainter逐渐添加字尝试,该组件超出的话,其属性didExceedMaxLines为true
代码如下:

///文字超出一定行,自动隐藏,并添加入"...查看更多详情"为它设置点击事件
class HideText extends StatefulWidget {

   HideText({
      @required this.text, //正常字
      this.style,		//正常字样式
      @required this.additionText, //附加字,如点击查看更多
      this.additionStyle,     //附加字的样式
      this.maxLines = 3,      //行数,不传 默认为3
      this.additionUrl,       //点击附加字跳转URL
      this.additionParams,    //点击附加字跳转时携带的参数
   }) : assert(text != null),
        assert(additionText != null);
  final String text;
  final TextStyle style;
  final String additionText;
  final TextStyle additionStyle;
  final int maxLines;
  final String additionUrl;
  final Map<String, dynamic> additionParams;
  @override
  _HideTextState createState() => _HideTextState();
}

class _HideTextState extends State<HideText> {
  @override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.only(top: 10),
      child: _textPaint([TextSpan(text: widget.text, style : widget.style)]).didExceedMaxLines ? RichText(
        text: TextSpan(
          children: [
            TextSpan(
              text: "${widget.text.substring(0, _fontNum())}",
              style: widget.style,
            ),
            TextSpan(
             children: [
               TextSpan(text: "...", style: widget.style),
               TextSpan(text: "${widget.additionText}", style: widget.additionStyle)
             ],
              recognizer: TapGestureRecognizer()
                ..onTap = (){
               if(isNotBlank(widget.additionUrl)) {
                 FlutterBoost.singleton.open(widget.additionUrl);
               }
             }
            )
          ]
        ),
      ) : Container( //未超出指定行数的话全部显示
        child: Text(
          widget.text,
          style: widget.style,
        ),
      ),
    );
  }

  TextPainter _textPaint(List<InlineSpan> children){
    return TextPainter(
        maxLines: widget.maxLines,
        text: TextSpan(
          children: children
        ),
        textDirection: TextDirection.ltr)
      ..layout(maxWidth: UIUtils.screenWidth(context) - 40); //若新功能宽度不一致,可尝试修改,
      //UIUtils.screenWidth(context)是自定义的获取屏幕宽度的方法
  }

  int _fontNum(){ //计算最多可容纳正常字的数目,可优化
    int num = 0;
    int skip = 1;
    while(true){
      bool isExceed = widget.text.length < num + skip ||  _textPaint([TextSpan(text: widget.text.substring(0, num + skip) + "...", style: widget.style),
        TextSpan(text: widget.additionText, style: widget.additionStyle)]).didExceedMaxLines;
      if(!isExceed) {
        num = num + skip;
        skip *= 2;
        continue;
      }
      if(isExceed && skip == 1){
        return num;
      }
      skip = skip ~/ 2;
    }
  }
}

在此基础上可以根据需求改造,如点击查看更多显示所有内容等功能,不做赘述。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Flutter造轮子】Text组件显示指定行文字,若有超出加...点击查看更多 的相关文章

  • 保留选项卡视图页面之间的状态

    issue 我有两个ListViews渲染内部TabBarView用一个TabController 我如何在每个之间保留状态 由于缺乏更好的词 ListView这样 1 小部件不会重建 2 ListView选项卡之间的位置会被记住 相关代码
  • 如何在flutter插件中调试iOS原生代码?

    我想知道如何在插件中调试 flutter iOS 代码 我可以打开每当您创建插件时生成的示例应用程序 但我将插件代码视为二进制框架 因此我无法调试它 对于 android 这相当简单 我只需打开 A S 中的 android 文件夹即可 插
  • 如何检查 Flutter 应用程序是否正在调试中运行?

    我正在寻找一种在应用程序处于调试模式时在 Flutter 中执行代码的方法 在 Flutter 中这可能吗 我似乎无法在文档中的任何地方找到它 像这样的东西 If app inDebugMode print Print only in de
  • 如何修复导致的错误:pub get failed(69)

    我在运行 Flutter 应用程序时遇到问题 酒吧失败 69 我尝试过使用firebase storage any and firebase storage 1 0 4 version 1 0 0 1 environment sdk gt
  • 如何在颤动中动态禁用工具提示?

    我可以静态禁用工具提示 但我想在单击平按钮时动态禁用工具提示 但是无法动态禁用 我不知道该怎么做 这是我的代码 import package flutter material dart void main runApp MaterialAp
  • 如何在 Flutter 中将国际化对象传递给子控件

    刚刚开始使用 Flutter dart 过渡到 PHP 并努力弄清楚如何将类传递到小部件中 我正在努力使用 flutter 创建我的第一个 Android 和 iOS 应用程序 我正在处理国际化 并且使用我拥有的国际化类在我的初始构建页面上
  • 如何在Flutter中为GridView中的Widget设置自定义高度?

    即使在指定 Container GridView 的高度之后 我的代码也会生成方形小部件 class MyHomePage extends StatefulWidget MyHomePage Key key this title super
  • 更改 Flutter Web 应用程序中的屏幕尺寸

    我正在使用 Flutter 构建一个 Web 应用程序 但我想模仿 iPhone 屏幕视图 我知道调整窗口大小可以达到这种效果 但是有没有办法将所有内容包装在手机屏幕图形的框架中 或者更改 MaterialApp 的尺寸 使其包含在手机屏幕
  • Flutter textfield Flutter RTL光标位置问题n-1

    我不知道这个问题是否是老问题 但我尝试了所有方法都没有成功 在输入字段中选择字母 n 时出现的问题 光标跳转到 n 1 包含视频中显示的问题 仅在 RTL 中存在问题 该链接包含问题的代码和视频 代码 链接在这里 https github
  • Flutter,在第1页时无法点击第2页

    我创建了一个PageView有 3 个页面 每个页面都有一个按钮 单击每个按钮应滚动到该页面 如果在第 2 页 则上一页和下一页都是可点击的 如果它位于第 3 页 则可以单击上一页 如果是在第一页 下一页不可点击 更新 当在 page1 上
  • 当用户尝试使用 flutter_inappwebview 在移动应用程序中上传文件时,如何请求用户权限?

    我正在尝试使用 flutter inappwebviewplugin 创建一个 flutter web 应用程序 在应用程序中 我添加了一个用于文件上传的 dropzone 插件 此功能在浏览器和 Android 应用程序上都运行良好 但在
  • Flutter:未捕获的 ReferenceError:firebase 未定义

    我在 Flutter Web 应用程序中使用 Firebase 服务 但在加载 Firebase 脚本时遇到问题 当我使用扑动时运行 d chrome我看到有错误的空白页面 重新加载页面后加载正常 当我进行 flutter build we
  • CustomPainter 使用 Listenable 重绘

    CustomPainter 类似乎有几种触发重绘的方法 我让我的画家使用 shouldRepaint 方法 但是 我希望我的画家对可监听中的更改做出反应 而不是轮询更改 Flutter 文档指出 触发重绘的最有效方法是 扩展此类并向 Cus
  • 如何在 Flutter 移动端、网页端和窗口端添加条件导入?

    我有 flutter 应用程序 它为每个平台 移动 网络 窗口 使用不同的 webview 插件 虽然我有能力import平台基于web and mobile 我无法导入 Windows 版本 如果不是移动或网络 我尝试添加其他条件 但它需
  • 没有为类型“Object”定义运算符“[]”。尝试定义运算符“[]”

    我的代码在下面给出了我在这一行中从 firebase 访问用户名时遇到的问题的错误 snapshot data username 它给出了上面提到的错误 我知道访问地图数据的唯一方法是这个 FutureBuilder future Fire
  • 快捷栏持续时间和高度

    我正在尝试展示一个小吃店 当我点击手势检测器后 这个小吃有两个按钮 问题是小吃栏出现几秒钟然后消失 所以我有两个问题 如何阻止小吃栏消失 直到用户采取行动并单击按钮 此外 小吃栏具有整个屏幕的高度 如何使其在屏幕底部具有特定高度 您可以使用
  • 如何使用 Firebase_Auth 和 Flutter 登录 Twitter

    一个人应该如何编程使用 Twitter 登录特征使用firebase auth https pub dev packages firebase auth和颤动 我看到一些使用的例子flutter twitter login https pu
  • 如何在不需要打开应用程序的情况下显示对话框

    我正在寻找包或以任何方式显示弹出窗口 对话框或模式 而无需打开我的应用程序 例如 本地通知 但我不想使用本地通知进行自定义 flutter 中有类似的东西吗 在 Android 上 您可以使用使用 SYSTEM ALERT WINDOW 的
  • 使用 Visual Studio Code 在 Flutter 上运行 Gradle 时出错

    我正在使用 Windows 10 Visual Studio Code 我尝试在编写代码后运行我的代码 这就是它之后向我展示的内容 在调试模式下在 TECNO Camon CX 上启动 lib main dart 运行 Gradle 时出错
  • 如何为发布而不是调试创建密钥库?扑

    我按照使用此网站部署 flutter 的步骤进行操作https flutter io android release https flutter io android release 当我运行 flutter build apk 时出现此错

随机推荐

  • QT CREATOR 插件开发:添加新的工程类型

    Qt Creator 中 新的工程类型将出现在 文件 gt 新建 菜单项中 我们可以通过打开的选择工程类型的对话框来找到所需要的工程 在本章中 我们将学习如何向上面所示的对话框中添加新的工程类型 Core IWizard接口 Qt Crea
  • OA 第四天笔记

    权限 控制功能的使用 Web应用中的权限 每个功能都有相应URL地址 对功能的控制就是对URL地址的访问控制 权限方案 用户 角色 role 权限 与权限相关的功能具体有哪些 初始化数据 分配权限 使用权限 insert into 1 权限
  • 用Python怎么多赚钱?6种办法用上 让你过上挣钱的好日子

    编程语言Python特别火 火到几乎所有的程序开发公司都要求自己的员工掌握它 可以说 不懂Python的码农们在整个IT行业是无法想象的 不仅如此 Python除了在编程方面应用广泛 而且还能在业余时间变现 让拥有这方面技能的人员获得丰厚的
  • asp二进制mysql_asp 二进制保存数据库

    C 将image中的显示的图片转换成二进制 原文 C 将image中的显示的图片转换成二进制 1 将Image图像文件存入到数据库中 我们知道数据库里的Image类型的数据是 二进制数据 因此必须将图像文件转换成字节数组才能存入数据库中 V
  • Anaconda: Linux下安装Anaconda

    一 说明 1 Linux CentOS7 2 Anaconda Anaconda3 2018 12 Linux x86 64 3 这只是个人的记录 最终以官网安装步骤为准 见参考资料链接 二 安装步骤 1 软件下载 进入到anaconda官
  • 利用插值算法进行上采样和下采样

    1 最邻近插值 The nearest interpolation 原理 划分四个区域 将某点值赋给区域的所有值 def the nearest interpolation img nh nw h w c img shape h是heigh
  • Java 文字转图片输出,Java 输出透明背景图片,Java文字转图片防爬虫

    近部分页面数据被爬虫疯狂的使用 主要就是采用动态代理IP爬取数据 主要是不控制频率 这个最恶心 因为对方是采用动态代理的方式 所以没什么特别好的防止方式 具体防止抓取数据方案大全 下篇博客我会做一些讲解 本篇也是防爬虫的一个方案 就是部分核
  • Bug处理之ImportError: cannot import name 'HTMLParseError

    操作系统Windows10 0 PythonIDE Pycharm2018 02 Python版本 python3 6 anaconda平台 Packages bs4 beautifulsoup4 问题描述 error ImportErro
  • springboot 查看各种依赖的版本(idea工具):

    说明 跟踪 ctrl mouse left
  • CopyTranslator 翻译神器的安装与使用

    download https github com copytranslator copytranslator releases guide https copytranslator github io guide 问题 第一次安装后就会默
  • macbook打印出现乱码解决方案

    macbook打印出现乱码解决方案 参考文章 1 macbook打印出现乱码解决方案 2 https www cnblogs com wenluren p 11325669 html 3 https www javazxz com thre
  • ddos攻击详解

    分布式拒绝服务攻击 DDoS 攻击 是一种网络攻击 旨在通过向目标系统发送大量的流量或请求 以使其无法正常运行或响应合法用户的请求 这种攻击通常涉及多台被感染的计算机 这些计算机被称为 僵尸 或 肉鸡 并被攻击者控制 以协同发动攻击 DDo
  • 03-java数据结构之链表的学习(单链表、双链表等)

    文章目录 1 链表 1 1 链表的介绍 2 单链表 2 1 单链表的显示 2 2 单链表的添加操作 2 2 1 直接添加到链表的尾部 2 2 2 根据no插入到指定位置 2 3 单链表节点的修改 2 4 单链表节点的删除 3 双向链表 3
  • 大数据从入门到精通(超详细版)之Hadoop详解

    前言 嗨 各位小伙伴 恭喜大家学习到这里 不知道关于大数据前面的知识遗忘程度怎么样了 又或者是对大数据后面的知识是否感兴趣 本文是 大数据从入门到精通 超详细版 的一部分 小伙伴们如果对此感谢兴趣的话 推荐大家按照大数据学习路径开始学习哦
  • Ubuntu 16.04下deb包的安装及常用命令

    如果ubuntu要安装新软件 已有deb安装包 例如 iptux deb 但是无法登录到桌面环境 那该怎么安装 答案是 使用dpkg命令 dpkg命令常用格式如下 sudo dpkg I iptux deb 查看iptux deb软件包的详
  • 数据对象总结

    JavaScript对象 对象属于一种复合的数据类型 在对象中可以存储多个不同数据类型的属性 JavaScript 中的所有事物都是对象 字符串 数值 数组 函数 此外 JavaScript 还允许自定义对象 JavaScript 提供多个
  • C++函数调用那些事

    C 函数调用 C 形参带默认值的函数 带默认值的形参必须从右往左给 给出以下实例 int sum int x int y 无默认值函数 int sum int x int y 0 y有默认值 int sum int x 0 int y 0
  • c#初级

    类 创建一个类 public class A 访问修饰符 public公有 protected 受保护的 private私有的 public 在类内和类外都可以使用 public int a 定义一个字段a protected 他只能在类内
  • 模运算

    http blog csdn net ld326 article details 7880429 模运算即求余运算 模 是 Mod 的音译 模运算多应用于程序编写中 Mod的含义为求余 模运算在数论和程序设计中都有着广泛的应用 从奇偶数的判
  • 【Flutter造轮子】Text组件显示指定行文字,若有超出加...点击查看更多

    效果如上图 如果超出 显示 点击查看更多 正好凑够4行 再添加一个字便超出4行 原理 使用TextPainter逐渐添加字尝试 该组件超出的话 其属性didExceedMaxLines为true 代码如下 文字超出一定行 自动隐藏 并添加入