flutter聊天界面-Text富文本表情emoji、url、号码展示

flutter聊天界面-Text富文本表情emoji、url、号码展示
Text富文本表情emoji展示,主要通过实现Text.rich展示文本、emoji、自定义表情、URL等
在这里插入图片描述

一、Text及TextSpan

Text用于显示简单样式文本
TextSpan它代表文本的一个“片段”,不同“片段”可按照不同的样式显示。

示例片段

Text.rich(TextSpan(children: [TextSpan(text: "Home: "),TextSpan(text: "https://flutterchina.club",style: TextStyle(color: Colors.blue),  recognizer: _tapRecognizer),]
))

二、Text富文本表情emoji展示

Text富文本表情emoji展示主要通过RegExp匹配url、手机号码

自定义表情的正则表达式:

String emojExpString = r"\[.{1,4}?\]";

链接URL的正则表达式:

String urlExpString =r"(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?";

具体实现代码如下

// 富文本
class CommChatRichTextHelper {//图文混排static getRichText(String text) {List<InlineSpan> textSapns = [];String urlExpString =r"(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?";String emojExpString = r"\[.{1,4}?\]";RegExp exp = RegExp('$urlExpString|$emojExpString');//正则表达式是否在字符串[input]中有匹配。if (exp.hasMatch(text)) {Iterable<RegExpMatch> matches = exp.allMatches(text);int index = 0;int count = 0;for (var matche in matches) {count++;String c = text.substring(matche.start, matche.end);//匹配到的东西,如表情在首位if (index == matche.start) {index = matche.end;}//匹配到的东西,如表情不在首位else if (index < matche.start) {String leftStr = text.substring(index, matche.start);index = matche.end;textSapns.add(TextSpan(text: spaceWord(leftStr),style: getDefaultTextStyle(),),);}//匹配到的网址if (RegExp(urlExpString).hasMatch(c)) {textSapns.add(TextSpan(text: spaceWord(c),style:TextStyle(color: ColorUtil.hexColor(0x3b93ff), fontSize: 16),recognizer: TapGestureRecognizer()..onTap = () async {//打开浏览器print(c);},),);}//匹配到的表情else if (RegExp(emojExpString).hasMatch(c)) {//[偷笑] 去掉[] = 偷笑String emojiString = c;textSapns.add(WidgetSpan(style: const TextStyle(height: 1.5),//判断表情是否存在child: CommonChatEmoji.emojiIsContain(emojiString)? ImageHelper.imageNetwork(imageUrl:"${CommonChatEmoji.findEmojiItem(emojiString)?.url}",width: 22,height: 22,): Text("${c}",style: getDefaultTextStyle(),),),);}//是否是最后一个表情,并且后面是否有字符串if (matches.length == count && text.length > index) {String rightStr = text.substring(index, text.length);textSapns.add(TextSpan(text: spaceWord(rightStr),style: getDefaultTextStyle(),),);}}} else {textSapns.add(TextSpan(text: spaceWord(text),style: getDefaultTextStyle(),),);}return Text.rich(TextSpan(children: textSapns));}static TextStyle getDefaultTextStyle() {return TextStyle(fontSize: 16,fontWeight: FontWeight.w400,fontStyle: FontStyle.normal,color: ColorUtil.hexColor(0x555555),decoration: TextDecoration.none,);}static String spaceWord(String text) {if (text.isEmpty) return text;String spaceWord = '';for (var element in text.runes) {spaceWord += String.fromCharCode(element);spaceWord += '\u200B';}return spaceWord;}
}

使用Text.rich的Widget的聊天文本气泡

class ChatCellTextElem extends StatefulWidget {const ChatCellTextElem({Key? key,required this.chatMessage,}) : super(key: key);final CommonChatMessage chatMessage;State<ChatCellTextElem> createState() => _ChatCellTextElemState();
}class _ChatCellTextElemState extends State<ChatCellTextElem> {Widget build(BuildContext context) {return Container(padding: EdgeInsets.all(10.0),child: buildTextContent(),);}Widget buildTextContent() {// 富文本return CommChatRichTextHelper.getRichText("${widget.chatMessage.text ?? ""}");}
}

三、小结

flutter聊天界面-Text富文本表情emoji、url、号码展示,主要实现Text富文本表情emoji展示主要通过RegExp匹配url、手机号码等

学习记录,每天不停进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/13607.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web-html的基本用法

web前端代码基本用法 <html> <head><meta charset"utf-8"><!-- charset 属性规定 HTML 文档的字符编码。要是没有规定字符编码的话是有可能乱码的 -->待到秋来九月八&#xff08;head&#xff09;<!-- 头部就是直接写在最上面的文字&…

尚无忧餐桌预订订桌包厢预订小程序源码

1.支持中餐、晚餐不同时间段桌位预定 2.支持包厢&#xff0c;大厅等不同区域预定 本系统后台tpvue 前端原生小程序 <!-- 导航栏 --> <!-- <van-nav-bar title"{{canteen}}" title-class"navbar" /> --> <van-nav-bar title"…

Spring Boot 中的服务发现

Spring Boot 中的服务发现 Spring Boot 是一个非常流行的 Java Web 开发框架&#xff0c;它提供了很多工具和组件来简化 Web 应用程序的开发。其中&#xff0c;服务发现是 Spring Boot 中的一个非常重要的组件&#xff0c;它可以帮助我们自动地发现和管理应用程序中的服务。 什…

树莓派(香橙派)交叉编译

目录 1、交叉编译是什么 2、为什么要交叉编译&#xff1f; 3、交叉编译需要用到什么工具&#xff1f; 4、&#xff08;香橙派&#xff09;交叉编译工具链的安装 5、 交叉编译服务端客户端 6、 带wiringPi库的交叉编译如何进行 1、交叉编译是什么 交叉编译是在一个平台上生…

盛最多水的容器(力扣)双指针 JAVA

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 输入&…

JAVA开发( 腾讯云消息队列 RocketMQ使用总结 )

一、问题背景 之所以需要不停的总结是因为在java开发过程中使用到中间件实在太多了&#xff0c;久久不用就会慢慢变得生疏&#xff0c;有时候一个中间很久没使用&#xff0c;可能经过了很多版本的迭代&#xff0c;使用起来又有区别。所以还是得不断总结更新。最近博主就是在使用…

基于matlab使用车载激光雷达数据在惯性测量单元读数帮助下构建地图(附源码)

一、前言 此示例演示如何处理来自安装在车辆上的传感器的 3-D 激光雷达数据&#xff0c;以便在惯性测量单元 &#xff08;IMU&#xff09; 读数的帮助下逐步构建地图。这样的地图可以促进车辆导航的路径规划&#xff0c;也可以用于定位。为了评估生成的地图&#xff0c;此示例…

Lingo优化软件初步

一、Lingo软件介绍 1、lingo软件的简单介绍 美国芝加哥大学的Linus Schrage教授于1980年左右开发的专门用于求解最优化问题的软件包&#xff0c;后经多年完善与扩充&#xff0c;并成立了LINDO系统公司进行商业运作取得巨大成功。根据 LINDO公司主页&#xff08;http://www.li…

FPGA入门系列12--RAM的使用1

文章简介 本系列文章主要针对FPGA初学者编写&#xff0c;包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解&#xff0c;旨在更快速的提升初学者在FPGA开发方面的能力&#xff0c;每一个章节中都有针对性的代码…

Spring Boot 中的认证是什么,如何使用

Spring Boot 中的认证是什么&#xff0c;如何使用 在 Web 应用程序中&#xff0c;认证是一项重要的安全措施。Spring Boot 提供了丰富的认证机制&#xff0c;可以帮助我们轻松地实现各种认证需求。本文将介绍 Spring Boot 中的认证是什么&#xff0c;以及如何使用 Spring Boot…

多元回归预测 | Matlab阿基米德算法(AOA)优化极限梯度提升树XGBoost回归预测,AOA-XGBoost回归预测模型,多变输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 阿基米德算法(AOA)优化极限梯度提升树XGBoost回归预测,AOA-XGBoost回归预测模型,多变输入模型,多变量输入模型,多变量输入模型,matlab代码回归预测,多变量输入模型,多变量输入模型 评价指标包括:MAE、RMSE和R2…

oracle新建库(表空间)表

文章目录 前言一、sqlplus登录二、表空间1.新建表空间2. 查看表空间3. 查看表空间和对应数据文件4.表空间增加数据文件5.删除单个数据文件&#xff08;只有一个默认的会删除失败&#xff09;6.删除表空间及数据文件(慎用) 三、创建新用户并指定表空间1.去掉前缀2.新建用户&…