ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

flutter 高亮字符,富文本

flutter 高亮字符,富文本 高亮【keywords】关键字importpackage:flutter/material.dart;/// 富文本高亮字符classHighlightedTextextendsStatelessWidget{final String text;final ListStringkeywords;//关键字final Color highlightColor;//高亮颜色final TextStyle normalStyle;//正常字体样式final TextStyle highlightStyle;//高亮字体样式final int?maxLines;final TextOverflow overflow;final TextAlign textAlign;constHighlightedText({super.key,requiredthis.text,requiredthis.keywords,this.highlightColorColors.red,this.normalStyleconstTextStyle(),this.highlightStyleconstTextStyle(),this.textAlignTextAlign.start,this.maxLines,this.overflowTextOverflow.ellipsis,});override Widgetbuild(BuildContext context){/// 如果没有关键词直接返回普通文本if(keywords.isEmpty||text.isEmpty){returnText(text,style:normalStyle);}/// 过滤掉空关键词final validKeywordskeywords.where((keyword)keyword.isNotEmpty).toList();if(validKeywords.isEmpty){returnText(text,style:normalStyle);}/// 创建正则表达式来匹配所有关键词按长度降序排列避免短关键词优先匹配validKeywords.sort((a,b)b.length.compareTo(a.length));final patternRegExp(validKeywords.map((keyword)RegExp.escape(keyword)).join(|),caseSensitive:false,);final matchespattern.allMatches(text);final spansTextSpan[];int lastEnd0;/// 遍历所有匹配项for(final matchinmatches){/// 添加匹配前的普通文本if(match.startlastEnd){spans.add(TextSpan(text:text.substring(lastEnd,match.start),style:normalStyle,));}/// 获取匹配的文本final matchedTexttext.substring(match.start,match.end);/// 添加高亮的关键词 - 修复样式合并问题spans.add(TextSpan(text:matchedText,style:highlightStyle.merge(TextStyle(color:highlightColor,fontWeight:FontWeight.bold,)),));lastEndmatch.end;}/// 添加剩余的普通文本if(lastEndtext.length){spans.add(TextSpan(text:text.substring(lastEnd),style:normalStyle,));}/// 如果没有匹配到任何关键词返回普通文本if(spans.isEmpty){returnText(text,style:normalStyle);}returnRichText(maxLines:maxLines,overflow:overflow,textAlign:textAlign,text:TextSpan(children:spans),);}}
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进