https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/arkts-common-compo6nents-text-display-V13
大家在学习 Flutter 时一定会用过 Text,而对于一些复杂文本的处理可能会选择 RichText,再进一步,使用 RichText 就一定要用 TextSpan ,和尚本以为可以做为一个小知识点进行简单学习 ,但是随着深入尝试发现 TextSpan 涉及东西很多,很值得研究,因此单独整理一篇小博文。 RichText 富文本核心即 TextSpan,而 TextSpan 结构很像 Android 中的 ViewGroup 树型结构。 ? ? ), children: <TextSpan>[ TextSpan( text: '红色', 中 style 的 height 属性,在 TextSpan 中此值设置行高,是以文字基准线为最小距离; TextPainter( text: TextSpan( text:
注意在使用textOverflow 属性时需要使用 maxLines 属性来设定文本显示行数
RichText( text: TextSpan( style: DefaultTextStyle.of(context).style, children : <InlineSpan>[ TextSpan(text: '老孟',style: TextStyle(color: Colors.red)), TextSpan (text: ','), TextSpan(text: '一个有态度的程序员'), ]), ) RichText 组件的text属性是TextSpan ,TextSpan中的style样式需要设置属性,不设置无法显示文字,一般设置应用程序的默认字体样式DefaultTextStyle.of(context).style,在子组件其中一个TextSpan (text: '登陆即视为同意'), TextSpan( text: '《xxx服务协议》', style: TextStyle
---->[Text 源码]---- final InlineSpan textSpan; const Text.rich( this.textSpan, { //... 如下面的的需求,我们需要使用 TextSpan ,在一个 TextSpan 中可以传入 List ,从而可以得到一个树状的结构。实现代码如下: ? (children: [ TextSpan(text: '我已同意 ', style: defaultStyle), TextSpan(text: '服务条款', style: ), TextSpan(text: ' 。' ,), TextSpan(text: '隐私政策', style: linkStyle, recognizer: _tapPolicy), TextSpan(text: ' 。'
textSpan; @override void initState() { super.initState(); textSpan = TextSpan( style TextSpan结构分析 假设一个嵌套的TextSpan如下: Dart final t = TextSpan( text: "1", children: [ TextSpan(text: "2", children: [ TextSpan(text: "3"), ]), TextSpan(text: "4" TextSpan(text: "7"), ]), TextSpan(text: "8"), ]), TextSpan(text: ,记住这一点,后文给出压平代码; 深Copy TextSpan: 由于TextSpan是不可变的且嵌套下去的,我们先定义一个辅助方法,根据现有的TextSpan深度Copy复制一个新的TextSpan的代码
在HarmonyOS中,Text/Span组件是文本控件中的一个关键部分。Text控件可以用来显示文本内容,而Span只能作为Text组件的子组件显示文本内容。
= null), 14 textSpan = null, 15 super(key: key); 16 17 const Text.rich(this.textSpan, { this.overflow, 25 this.textScaleFactor, 26 this.maxLines, 27 this.semanticsLabel, 28 }): assert(textSpan : const EdgeInsets.fromLTRB(0.0, 10.0, 0.0, 0.0), 117 child: Text.rich( 118 new TextSpan fontSize: 13, 123 decoration: TextDecoration.none), 124 children: <TextSpan >[ 125 new TextSpan( 126 text: '拼接1', 127
(text:"Hello",children:[TextSpan(text:"Flutter",style:TextStyle(color:Colors.green)),TextSpan(text:"! 这时需要用到TextSpan和Text.rich构造函数。TextSpan代表一个具有独立样式的文本“片段”。多个TextSpan可以组合在一起,形成复杂的富文本结构。text:显示的文本。 children:一个TextSpan列表,用于嵌套更多的片段。recognizer:为这个片段添加手势识别,比如点击事件。示例:以下代码创建了一个带有可点击链接的富文本。 (text:'访问',children:<TextSpan>[TextSpan(text:'Flutter官网',style:constTextStyle(color:Colors.blue),recognizer :TapGestureRecognizer()..onTap=(){//处理点击事件,例如打开网页print('链接被点击了');},),TextSpan(text:'了解更多。')
先来看下登录/注册界面通常展示的《用户协议》和《隐私政策》,代码实现如下: Text.rich( TextSpan( text: '登录即代表同意并阅读', style: TextStyle (fontSize: 14, color: Color(0xFF999999)), children: [ TextSpan( text: '《用户协议》 (text: '和'), TextSpan( text: '《隐私政策》', style: TextStyle(color: Theme.of(context _list.map((e) { if (widget.keys.contains(e)) { return TextSpan( call(e); }, ); } else { return TextSpan
如下代码所示,通过 Text.rich 接入 TextSpan 和 WidgetSpan 就可以快速实现图文混排的需求,并且可以看出 WidgetSpan 不止支持图片控件,它可以接入任何你需要的 Widget Text.rich(TextSpan( children: <InlineSpan>[ TextSpan(text: 'Flutter is'), WidgetSpan 在前面的使用中,我们首先是传入了一个 TextSpan 给 RichText ,并在 TextSpan 的 children 中拼接我们需要的内容,那就从 RichText 开始挖掘其中的原理。 对于 InlineSpan 系列我们主要关注两个方法:visitChildren 和 build 方法,它的子类 TextSpan 和 WidgetSpan 都对这两个方法有自己对应的实现。 是不是有点晕,结合下图所示,总结起来其实就是: RichText 中传入 TextSpan , 在 TextSpan 的 children 中使用 WidgetSpan ,WidgetSpan 里的
今天给大家带来的是RichText组件,他里面有个text属性,RichText显示的文本内容是TextSpan类型,他不是一个简单的string,而是TextSpan类型,TextSpan类型是一个可以无限传递的树形结构 甚至通过children属性,传入一个TextSpan列表作为子节点,已实现叠加和嵌套文字样式的功能。 然后大家有没有疑问,关于红色的这个是如何设置的,这个我可以称呼它为碰撞检测,以便完成TextSpan树中某一片段的检测。 (text: "我已阅读"), TextSpan( style: const TextStyle( color (text: "和"), TextSpan( style: const TextStyle( color:
TextStyle(color: Colors.blue,fontSize: 20),), RichText RichText的属性和Text基本一样,使用如下: RichText( text: TextSpan ( style: DefaultTextStyle.of(context).style, children: <InlineSpan>[ TextSpan(text : '老孟', style: TextStyle(color: Colors.red)), TextSpan(text: ','), TextSpan(text: '专注分享 带前后置标签的文本 RichText( text: TextSpan( style: DefaultTextStyle.of(context).style, children : '泡沫灭火器可用于带电灭火'), ]), ) “服务协议” 通常在登录页面的底部会出现登录即代表同意并阅读 《服务协议》,其中《服务协议》为蓝色且可点击: Text.rich( TextSpan
呢 4.TextSpan 首先它不是一个Widget,其次它可以作为Text.rich()的入参 TextSpan的强大之处在于你可以在一行文字中使用很多样式,甚至添加别的控件 4.1:TextSpan 源码中的示例 看源码时,源码中给了一个小例子蛮好的,这里讲一下 可以看出,一行文字中可以有多种样式,这就是TextSpan的基本用法 var span=TextSpan( text: 'Hello ', // default text style children: <TextSpan>[ TextSpan(text: ' beautiful ', style: TextStyle(fontStyle : FontStyle.italic)), TextSpan(text: 'world', style: TextStyle(fontWeight: FontWeight.bold)), ] 这里匆匆的文章就不贴了 colorfulText(String str,{double fontSize=14}) { var spans= <TextSpan>[]; for(var i=
一般都需要通过 TextPainter 等方式获取;和尚尝试了两种方式进行判断; 2.1 TextPainter.didExceedMaxLines 和尚之前也有简单了解过 TextPainter 与 TextSpan didExceedMaxLines 判断文本内容是否已经超行;和尚之后会对 TextPainter 再深入研究一下; _checkOverMaxLines01(maxLines, maxWidth) { final textSpan = TextSpan(text: _textStr, style: widget.textStyle); final textPainter = TextPainter(text: textSpan TextPainter 必须设置好 textDirection 文本对齐方式,以及在 layout 布局之后才可以获取; _checkOverMaxLines02(maxWidth) { final textSpan = TextSpan(text: _textStr, style: widget.textStyle); final textPainter = TextPainter(text: textSpan
TextSpan中字体未生效 TextSpan可以用来处理图文混合的需求。 比如前面一个图片标签,后面是文字,但是文字第二行还要从图片最左端开始,即环绕图片,这种时候就需要TextSpan+WidgetSpan配合只用即可。 但是在flutter web中(其他平台未测),通过上面设置全局字体后,发现TextSpan中的字体并未生效,还是系统字体。 说明TextSpan稍微特殊一些,我们知道Text的源码中style实际上做了一步merge操作,merge了默认的style(defaultTextStyle),如下: Widget build(BuildContext 但是在TextSpan的源码中,发现并没有这一步操作,所以设置的全局字体对它不起作用。 所以使用TextSpan的地方如果需要则必须单独设置字体。
), alignment: Alignment.bottomCenter, child: RichText( text: TextSpan ColorsUtil.hexStringColor('111E36'), ), children: [ TextSpan ColorsUtil.hexStringColor('111E36'), ), ), TextSpan
使用新的TextSpan.rich构造函数,还可以使用TextSpan创建Text部件,以显示使用多种样式的文本(例如,带有粗体字的段落)。 要使文本的各个部分交互,请使用RichText并将TapGestureRecognizer指定为文本的相关部分TextSpan.recognizer。 const Text.rich(TextSpan textSpan, { Key key, TextStyle style, TextAlign textAlign, TextDirection textDirection, bool softWrap, TextOverflow overflow, double textScaleFactor, int maxLines }) 使用TextSpan final textSpan → TextSpan 要作为TextSpan显示的文本. [...]
先说一下场景,如下所示: 已知字符串 src 匹配段列表:matches ---- 这样,在 Flutter 中可以通过对 matches 的遍历,形成富文本段,进行展示,效果如下: TextSpan style: style0)); // 匹配段 String matchStr = src.substring(match[0], match[1]+1); span.add(TextSpan = src.length - 1) { span.add(TextSpan(text: src.substring(cursor), style: style0)); } return TextSpan(children: span); } ---- 2. 下面是完整的 formSpan 方法,感兴趣的可以自己试一下: TextSpan formSpan() { List<List<int>> matches = [[1, 2], [5, 8], [14
]; List<String> strs = name.split(_searchStr); print('$name:$strs'); return RichText(text: TextSpan TextStyle _selectStyle = const TextStyle( color: Colors.green, fontSize: 16 ); List<TextSpan i++){ String indexStr = strs[i]; if(indexStr == ''&& i < strs.length - 1){ spans.add(TextSpan )); if(i< strs.length -1){ spans.add(TextSpan(text: _searchStr,style: _selectStyle)); } } } return RichText(text: TextSpan(children: spans)); } (滑动显示更多) 后面会上传下这个demo到github