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

这篇具有很好参考价值的文章主要介绍了flutter聊天界面-Text富文本表情emoji、url、号码展示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

flutter聊天界面-Text富文本表情emoji、url、号码展示
Text富文本表情emoji展示,主要通过实现Text.rich展示文本、emoji、自定义表情、URL等
flutter聊天界面-Text富文本表情emoji、url、号码展示,flutter开发实战,flutter,flutter,flutter聊天界面,flutter富文本

一、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、手机号码等

学习记录,每天不停进步。文章来源地址https://www.toymoban.com/news/detail-532699.html

到了这里,关于flutter聊天界面-Text富文本表情emoji、url、号码展示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • flutter聊天界面-TextField输入框buildTextSpan实现@功能展示高亮功能

    flutter聊天界面-TextField输入框buildTextSpan实现@功能展示高亮功能 最近有位朋友讨论的时候,提到了输入框的高亮展示。在flutter TextField中需要插入特殊样式的标签,比如:“请 @张三 回答一下”,这一串字符在TextField中输入,当输入@时 弹出好友列表选择,然后将 “@张三”高

    2024年02月07日
    浏览(42)
  • iOS开发-聊天emoji表情与自定义动图表情左右滑动控件

    iOS开发-聊天emoji表情与自定义动图表情左右滑动控件 之前开发中遇到需要实现聊天emoji表情与自定义动图表情左右滑动控件。使用UICollectionView实现。 UICollectionView是一种类似于UITableView但又比UITableView功能更强大、更灵活的视图,这是源于它将UICollectionView对cell的布局交给了

    2024年02月15日
    浏览(39)
  • Flutter中系统Emoji通过substring裁切后无法识别导致渲染错误

    在发布文章的时候,有标题和内容,标题可为空,在没有标题的情况下,截取部分内容当作标题。 内容列表显示的时候,某些特殊的情况下(并不重要),我们就需要裁切文章标题。 当文章标题中有文字 + 系统自带的 emoji 的时候,我们去裁切标题就会出现无法识别渲染出来

    2024年02月09日
    浏览(29)
  • uniapp - [全端兼容] 详细使用 emoji 表情包,在输入框中发送及显示 emoji 表情(全平台小程序/ H5 / App通用,类似微信聊天的小表情,支持文字与表情混合在一起,后端易存储)

    网上的教程都太乱了,各平台之间不兼容、各种显示表情的 BUG 一大堆问题,很难进行复制使用。 本文 实现了在 uniapp 全端兼容(h5网页 / 小程序 / 安卓苹果app / nvue等)项目开发中,详细引入并使用 emoji 表情库插件,支持表情的自定义增删、表情样式控制等, 全平台通用插

    2024年02月15日
    浏览(198)
  • Flutter Text 自动换行

    在 Flutter 中,可以使用 Text 组件来显示文本。默认情况下, Text 组件会自动换行,只要文本内容超过其容器的宽度。 你可以使用 Text 组件的 softWrap 属性来控制文本是否自动换行。设置 softWrap 为 true (默认值),文本就会自动换行;设置 softWrap 为 false ,文本就不会自动换行,而

    2024年02月11日
    浏览(34)
  • 【Flutter】Flutter 实现 Text 自动换行 解决长文本溢出问题

    你是否渴望成为 Flutter 的专家,掌握更多的技巧和最佳实践?我们有个好消息要告诉你! Flutter 从零到一 基础入门到应用上线全攻略 正在等待你的加入!这个专栏包含了你需要的所有 Flutter 学习资源,包括代码示例和深度解析。专栏内容会持续更新,价格也会随之上涨。现

    2024年02月12日
    浏览(25)
  • 如何在Unity中实现聊天文本,控制Text文本长度,自动换行

         RectTransform中有个方法SetSizeWithCurrentAnchors,可以设置这个RectTransform的长度或者宽度。 大于你要的长度时,设置成最大长度,否则设置成当前长度。 imgRect是用来设置聊天背景图片的。   这时会发现有一个问题,当内容不足时,不是向左对齐的 ,而是居中缩放。 这是因

    2024年02月05日
    浏览(35)
  • 【Flutter】Flutter Text 控件实现下划线、删除线、虚线、加粗、斜体

    在 Flutter 开发中,我们经常需要对 Text 控件进行各种样式的设置,包括但不限于下划线、删除线、虚线、加粗和斜体等。这些样式的设置可以帮助我们更好地展示文本内容,提升用户体验。本文将详细介绍如何在 Flutter 3.10.0 或更高版本中实现这些效果。阅读本文后,你将掌握

    2024年02月06日
    浏览(29)
  • 【Flutter】flutter_tts 语音播放文本 Text-to-Speech

    在移动应用开发中,文本到语音(Text-to-Speech,简称 TTS)的功能越来越常见。它可以帮助我们实现语音播报、语音提示等功能,极大地丰富了应用的交互方式。 本文将介绍如何在 Flutter 中实现 TTS 功能,我们将使用一个名为 flutter_tts 的插件来完成这个任务。 本文的重点包括

    2024年02月08日
    浏览(43)
  • flutter 网络地址URL转file

    方法1 方法2 方法3

    2024年02月09日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包