第一种是行数判断:项目需求是超过6行显示展开,超过12行跳到其他页面,所以我这样写,其中图片文字可随意改。
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'dart:ui';class ExpandableText extends StatefulWidget {final String text;//文本final GestureTapCallback onJudgeClick;//跳转final int maxLines, maxlastLines;//7行限制,12行限制final TextStyle style;//样式final bool expand;//默认是否展开const ExpandableText({Key key, this.text, this.onJudgeClick, this.maxLines, this.maxlastLines, this.style, this.expand}): super(key: key);@override_ExpandableTextState createState() => _ExpandableTextState();
}class _ExpandableTextState extends State<ExpandableText> {bool expand = false;@overrideWidget build(BuildContext context) {String text = widget.text;GestureTapCallback onJudgeClick = widget.onJudgeClick;int maxLines = widget.maxLines, maxlastLines = widget.maxlastLines;final TextStyle style = widget.style;return LayoutBuilder(builder: (context, size) {final span = TextSpan(text: text ?? '', style: style);//tp是7行的,判断高度,判断xy轴的字符位置,tpmax是12行的,判断高度,判断12行的位置。final tp = TextPainter(text: span, maxLines: maxLines, textDirection: TextDirection.ltr);final tpmax = TextPainter(text: span, maxLines: maxlastLines, textDirection: TextDirection.ltr);tp.layout(maxWidth: size.maxWidth);tpmax.layout(maxWidth: size.maxWidth);TextPosition position = tp.getPositionForOffset(Offset(240, 200));TextPosition maxposition = tpmax.getPositionForOffset(Offset(240, 600));if (tp.didExceedMaxLines) {return Stack(children: <Widget>[expand? (tpmax.didExceedMaxLines)? Text(text.substring(0, maxposition.offset) + '...', style: style): Text(text, style: style): Text(text.substring(0, position.offset) + '...', style: style),
//这是之前默认展开收起的样式,现在改成只展开不收起
//            expand ? Text(text ?? '', style: style)
//                : Text(text ?? '', maxLines: maxLines, overflow: TextOverflow.ellipsis, style: style),Positioned(right: 0,bottom: 0,child: GestureDetector(behavior: HitTestBehavior.translucent,onTap: () {if (expand) {if (tpmax.didExceedMaxLines) {//这里做点击事件判断 如果有新需求改动判断新建回调就可以了onJudgeClick();}} else {setState(() {expand = !expand;});}},child: Container(color: Colors.white,padding: EdgeInsets.only(top: 2),child: RichText(text: TextSpan(//这是以前没有判断xy轴位置的省略号,现在不用了//                     text: expand ? (tpmax.didExceedMaxLines ? '... ' : '') : '',//                     style: TextStyle(color: Color(0xFF333333), fontSize: 15),children: [TextSpan(text: expand ? (tpmax.didExceedMaxLines ? '查看全文' : '') : '展开更多',style: TextStyle(color: Color(0xFF28C6A8), fontSize: 15),),WidgetSpan(alignment: PlaceholderAlignment.middle,child: expand? (tpmax.didExceedMaxLines? Padding(padding: const EdgeInsets.all(5.0),child: SizedBox(width: 9,height: 4.5,child: Transform.rotate(child: Image.asset('assets/images/common/lujing.png'),angle: 0,)),): Container()): Padding(padding: const EdgeInsets.all(5.0),child: SizedBox(width: 9,height: 4.5,child: Transform.rotate(child: Image.asset('assets/images/common/lujing.png'),angle: 0,)),),),],),),),),)],);} else {return Text(text ?? '', style: style);}});}
}

第二种是字数判断:

这个是超过80字,使用效果不太好。但是很简单

///展示全文查看全文字数text
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';class ExpandableCountText extends StatefulWidget {final String text;final int maxLines;const ExpandableCountText({Key key,this.text,this.maxLines = 80,}) : super(key: key);@overrideState<StatefulWidget> createState() {return _ExpandableTextlenState();}
}class _ExpandableTextlenState extends State<ExpandableCountText> {String _text;int _maxLines;bool _showMore = false;bool _isExpended = false;TapGestureRecognizer _tapGestureRecognizer = TapGestureRecognizer();@overridevoid initState() {// TODO: implement initStatesuper.initState();_text = widget.text;_maxLines = widget.maxLines;if (_text.length > _maxLines) {_showMore = true;_isExpended = false;} else {_showMore = false;_isExpended = true;}}@overridevoid dispose() {// TODO: implement disposesuper.dispose();_tapGestureRecognizer.dispose();}@overrideWidget build(BuildContext context) {return Text.rich(TextSpan(children: [TextSpan(text: _isExpended ? _text : _text.substring(0, _maxLines) + '...'),TextSpan(recognizer: _tapGestureRecognizer..onTap = () {setState(() {_isExpended = !_isExpended;});},text: _showMore ? _isExpended ? '收起' : '展开' : '',style: TextStyle(color: Colors.green))]));}
}

flutter 仿微信展开收起两种写法相关推荐

  1. 完全理解乘法快速幂及其两种写法的解析

    an=?0≤n≤10105an=?0≤n≤10105 a^n=? \qquad 0 \le n \le 10^{10^5} 没错,乘法快速幂就是解决上述问题的. 乘法快速幂的思想 可以看到,要求一个数 ...

  2. 两种写法的效果一样,那么到底哪一种更好呢?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 有时候,我们在写一些循环逻辑的时候,并不是按执行次数等作 ...

  3. Model层的两种写法

    Model层的两种写法 第一种写法 namespace MyMVC.Models {public class Child{ //属性private int id;public int Id{get { ...

  4. controller 有两种写法,讨论一下两种写法的区别:

    controller 有两种写法,讨论一下两种写法的区别: 写法 1: app.controller('myCtrl', function($scope, $location) { $scope.my ...

  5. Sql语句中 case when .. 的两种写法

    在 SQL查询语句中, case 语句的两种写法(SqlServer 2005 下测试通过): 1. select (case 字段1  when a then 0  when b then 1  e ...

  6. bootstrap搜索框:click下拉展开改hover展开(两种代码)

    bootstrap搜索框:click下拉展开改hover展开(两种代码) 问题: 实现顶部导航的鼠标悬停下拉展开的效果: 实现的滚不导航区域:搜索框组件之点击下拉展开 变更为 鼠标悬停展开下拉选项条件 ...

  7. 20210408:力扣(二分查找法的两种写法以及变体题目)

    二分查找法的两种写法以及变体题目 写在前面 题目 思路与算法 代码实现 写在最后 写在前面 关于二分查找,真的是一个非常实用的查找算法,主要有两种写法,今天在总结时再次碰到,再次整理,方便后续查看复习 ...

  8. python装饰器带参数函数_python带参数装饰器的两种写法

    python带参数装饰器的两种写法 前言 最近在实现一个装饰器的过程中发现了一个很有意思的地方,在博客里面分享出来 不同的写法 三层函数嵌套,实现了可传参数的一个装饰器. import logging ...

  9. sum 去重_总结leetcode上【排列问题】【组合问题】【子集问题】回溯算法去重的两种写法!...

    本周小结!(回溯算法系列三)续集 在 本周小结!(回溯算法系列三) 中一位录友对 整颗树的本层和同一节点的本层有疑问,也让我重新思考了一下,发现这里确实有问题,所以专门写一篇来纠正,感谢录友们的积极交 ...

最新文章

  1. 说说大型高并发高负载网站的系统架构【转】
  2. PostgreSQL — 数据库实例只读锁定
  3. Oracle 学习笔记 11 -- 视图 (VIEW)
  4. 【控制】《复杂运动体系统的分布式协同控制与优化》-方浩老师-第8章-固定翼飞行器的编队跟踪与姿态调节一体化控制
  5. 2009年计算机二级c语言考试真题,2009年3月全国计算机二级C语言考试真题.doc
  6. The whole Fiori application is wrapped in a big shell xml view
  7. 逆波兰计算器android源码简书,计算器的核心算法-JavaScript实现(逆波兰表达式)...
  8. 计算机一级繁体字转换,繁体字转换器
  9. java按钮陷下去_付费?广告?捐款?如何让开源软件活下去?
  10. oracle varchar2改成大字段类型clob,读取大字段内容
  11. java 如何查看jdk版本位数
  12. idea中springBoot项目修改html之类的文件后服务不自动更新
  13. android 阻止来电号码,4种方法来在安卓手机上阻止来电
  14. 微电子计算机是信息技术的,信息技术说第三十五说,计算机微电子技术
  15. P6858 数学期望
  16. 成都及周边景点5日游
  17. TortoiseSVN 打Tags
  18. django memery cache
  19. 【FreeSwitch开发实践】freeswitch配置wss证书问题 Encrypted Alert/Certification Unknown
  20. 谈谈测试过程中常见的几个问题

热门文章

  1. 对傅里叶函数以及级数的理解
  2. appinventor跑酷游戏_基于APPInventor的一款益智游戏的设计与实现
  3. 计算机组成原理ACC MQ,计算机组成原理讲案第一章.ppt
  4. 股票只有两个字:“等待”
  5. JS获取图片的EXIF信息+纠正图片方向
  6. [Java8新特性]Collectors源码阅读-1 toCollections和joining等
  7. Java封神路之多线程(第二篇),从把握整体架构到具体演示,快速掌握多线程机制
  8. codevs 2382 [CSTC2007] 挂缀 贪心
  9. lsb_release 提示命令不存在
  10. java三层架构实现登录_用户登录——三层架构