textSpan static method

List<TextSpan> textSpan(
  1. BuildContext context,
  2. String text,
  3. int start, {
  4. int? end,
  5. ChatUIConfig? chatUIConfig,
  6. Map<String, dynamic>? remoteExtension,
})

解析Text消息,将@消息和普通文本分开

Implementation

static List<TextSpan> textSpan(BuildContext context, String text, int start,
    {int? end,
    ChatUIConfig? chatUIConfig,
    Map<String, dynamic>? remoteExtension}) {
  //定义文本字体大小和颜色
  final textSize = chatUIConfig?.messageTextSize ?? 16;
  final textColor =
      chatUIConfig?.messageTextColor ?? CommonColors.color_333333;
  final textAitColor =
      chatUIConfig?.messageLinkColor ?? CommonColors.color_007aff;

  //需要返回的spans
  final List<TextSpan> spans = [];
  //如果有@消息,则需要将@消息的文本和普通文本分开
  if (remoteExtension?[ChatMessage.keyAitMsg] != null) {
    //获取@消息的文本list
    List<AitItemModel> aitSegments = [];
    //将所有@的文本和位置提取出来
    try {
      var aitMap = remoteExtension![ChatMessage.keyAitMsg] as Map;
      final AitContactsModel aitContactsModel =
          AitContactsModel.fromMap(Map<String, dynamic>.from(aitMap));
      aitContactsModel.aitBlocks.forEach((key, value) {
        var aitMsg = value as AitMsg;
        aitMsg.segments.forEach((segment) {
          aitSegments.add(AitItemModel(key, aitMsg.text, segment));
        });
      });
    } catch (e) {
      Alog.e(
          tag: 'ChatKitMessageTextItem',
          content: 'aitContactsModel.fromMap error: $e');
    }
    //如果没有解析到@消息,则直接返回
    if (aitSegments.isEmpty) {
      spans.add(TextSpan(
          text: text,
          style: TextStyle(fontSize: textSize, color: textColor)));
      return spans;
    }

    //根据@消息的位置,将文本分成多个部分
    aitSegments.sort((a, b) => a.segment.start.compareTo(b.segment.start));
    int preIndex = start;
    for (var aitItem in aitSegments) {
      //@之前的部分
      if (aitItem.segment.start > preIndex) {
        spans.add(TextSpan(
            text: text.substring(
                preIndex, min(aitItem.segment.start, text.length)),
            style: TextStyle(fontSize: textSize, color: textColor)));
      }
      //@部分
      spans.add(TextSpan(
          text: aitItem.text,
          style: TextStyle(fontSize: textSize, color: textAitColor),
          recognizer: TapGestureRecognizer()
            ..onTap = () {
              //点击@消息,如果有自定义回调,则回调,否则跳转到用户详情页
              if (chatUIConfig?.onTapAitLink != null) {
                chatUIConfig?.onTapAitLink
                    ?.call(aitItem.account, aitItem.text);
              } else if (aitItem.account != AitContactsModel.accountAll) {
                if (IMKitClient.account() != aitItem.account) {
                  goToContactDetail(context, aitItem.account);
                } else {
                  gotoMineInfoPage(context);
                }
              }
            }));
      preIndex = end == null
          ? aitItem.segment.endIndex
          : end - aitItem.segment.endIndex;
    }
    //最后一个@之后的部分
    if (preIndex < text.length - 1) {
      spans.add(TextSpan(
          text: text.substring(preIndex, text.length),
          style: TextStyle(fontSize: textSize, color: textColor)));
    }
  } else {
    //没有@消息,直接返回
    spans.add(TextSpan(
        text: text, style: TextStyle(fontSize: textSize, color: textColor)));
  }
  return spans;
}