chatapp3-flutter/lib/shared/tools/sc_text_utils.dart
2026-04-09 21:32:23 +08:00

95 lines
3.0 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:ui';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
richText({required String txt, required String key, Color highlight = Colors.red, Color defaultColor = Colors.black}) {
assert(txt != null);
assert(key != null);
if (txt.contains(key)) {
// 采用正则表达式环视保留分割的文本
// 目前只考虑命中一次的情况简单分割
// List<String> sps = txt.trim().split('$key'); //new RegExp('[?=$key]')
// 使用最新的算法来计算
List<String> sps = splitStr(txt, key);
if (sps.length > 0) {
List<TextSpan> textSpanList = [];
for (String sp in sps) {
print(sp);
textSpanList.add(TextSpan(text: sp, style: TextStyle(color: sp == key ? highlight : defaultColor)));
}
return Text.rich(TextSpan(children: textSpanList));
}
}
return Text(txt, style: TextStyle(color: defaultColor),);
}
List<String> splitStr(String txt, String key) {
int keyLength = key.length;
int index = txt.indexOf(key);
// 因为要replace所以使用备份的字符串
String bakTxt = txt;
if (index > -1) {
List<int> indexes = [];
indexes.add(index);
int count = 0;
while (index > -1) {
bakTxt = bakTxt.replaceFirst('$key', '');
int localIndex = bakTxt.indexOf(key);
if (localIndex > -1) {
count += 1;
indexes.add(localIndex + keyLength * count);
index = localIndex + keyLength * count;
} else {
index = localIndex;
}
}
print('所有的索引:${indexes.toString()}');
List<String> results = [];
// 对上一步算出的所有索引进行迭代,导出分割后的数组
int indexArrayIndex = 0;
while (indexArrayIndex < indexes.length) {
// 从左往后迭代。
if (indexArrayIndex == 0) {
if (indexes[indexArrayIndex] == 0) {
results.add(txt.substring(0, keyLength));
} else {
results.add(txt.substring(0, indexes[indexArrayIndex]));
results.add(txt.substring(indexes[indexArrayIndex], indexes[indexArrayIndex] + keyLength));
}
} else {
results.add(txt.substring(indexes[indexArrayIndex], indexes[indexArrayIndex] + keyLength));
}
int endIndex = indexes[indexArrayIndex] + keyLength;
// 如果还有索引,这一次只能算到下一个索引前
if (indexArrayIndex < indexes.length - 1) {
if (endIndex < indexes[indexArrayIndex + 1]) {
results.add(txt.substring(endIndex, indexes[indexArrayIndex + 1]));
} else {
// 刚好是下一个自己,等下一次循环再说
}
} else {
//只有一个索引的情况
if (endIndex < txt.length) {
results.add(txt.substring(endIndex, txt.length));
} else {
//结束了
}
}
indexArrayIndex += 1;
}
print('迭代的结果:$results');
return results;
}
return [];
}