From a4078c0a8e1f409cbae611f8c740425532b0ddc4 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Mon, 21 Aug 2023 14:55:32 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=90=9C=E7=B4=A2=E6=8E=A8=E8=8D=90?= =?UTF-8?q?=E8=AF=8DrichText?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/models/search/suggest.dart | 79 ++++++++++++++++++++++++++-------- lib/pages/search/view.dart | 24 +++-------- 2 files changed, 67 insertions(+), 36 deletions(-) diff --git a/lib/models/search/suggest.dart b/lib/models/search/suggest.dart index eff7cb50..ff161476 100644 --- a/lib/models/search/suggest.dart +++ b/lib/models/search/suggest.dart @@ -1,3 +1,6 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + class SearchSuggestModel { SearchSuggestModel({ this.tag, @@ -19,32 +22,74 @@ class SearchSuggestItem { SearchSuggestItem({ this.value, this.term, - this.name, this.spid, + this.textRich, }); String? value; String? term; - List? name; int? spid; + Widget? textRich; SearchSuggestItem.fromJson(Map json, String inputTerm) { value = json['value']; term = json['term']; - String reg = '$inputTerm'; - try { - if (json['name'].indexOf(inputTerm) != -1) { - String str = json['name'].replaceAll(reg, '^'); - List arr = str.split('^'); - arr.insert(arr.length - 1, inputTerm); - name = arr; - } else { - name = ['', '', json['term']]; - } - } catch (err) { - name = ['', '', json['term']]; - } - - spid = json['spid']; + textRich = highlightText(json['name']); } } + +Widget highlightText(String str) { + // 创建正则表达式,匹配 ... 格式的文本 + RegExp regex = RegExp(r'(.*?)<\/em>'); + + // 用于存储每个匹配项的列表 + List children = []; + + // 获取所有匹配项 + Iterable matches = regex.allMatches(str); + + // 当前索引位置 + int currentIndex = 0; + + // 遍历每个匹配项 + for (var match in matches) { + // 获取当前匹配项之前的普通文本部分 + String normalText = str.substring(currentIndex, match.start); + + // 获取需要高亮显示的文本部分 + String highlightedText = match.group(1)!; + + // 如果普通文本部分不为空,则将其添加到 children 列表中 + if (normalText.isNotEmpty) { + children.add(TextSpan( + text: normalText, + style: DefaultTextStyle.of(Get.context!).style, + )); + } + + // 将需要高亮显示的文本部分添加到 children 列表中,并设置相应样式 + children.add(TextSpan( + text: highlightedText, + style: TextStyle( + fontWeight: FontWeight.bold, + color: Theme.of(Get.context!).colorScheme.primary), + )); + + // 更新当前索引位置 + currentIndex = match.end; + } + + // 如果当前索引位置小于文本长度,表示还有剩余的普通文本部分 + if (currentIndex < str.length) { + String remainingText = str.substring(currentIndex); + + // 将剩余的普通文本部分添加到 children 列表中 + children.add(TextSpan( + text: remainingText, + style: DefaultTextStyle.of(Get.context!).style, + )); + } + + // 使用 Text.rich 创建包含高亮显示的富文本小部件,并返回 + return Text.rich(TextSpan(children: children)); +} diff --git a/lib/pages/search/view.dart b/lib/pages/search/view.dart index d4190e47..786500bf 100644 --- a/lib/pages/search/view.dart +++ b/lib/pages/search/view.dart @@ -45,6 +45,10 @@ class _SearchPageState extends State with RouteAware { return OpenContainer( closedElevation: 0, openElevation: 0, + onClosed: (_) { + // 在 openBuilder 关闭时触发的回调函数 + _searchController.onClear(); + }, openColor: Theme.of(context).colorScheme.background, middleColor: Theme.of(context).colorScheme.background, closedColor: Theme.of(context).colorScheme.background, @@ -176,25 +180,7 @@ class _SearchPageState extends State with RouteAware { // child: Text( // _searchController.searchSuggestList[index].term!, // ), - child: Text.rich( - TextSpan( - children: [ - TextSpan( - text: _searchController - .searchSuggestList[index].name![0]), - TextSpan( - text: _searchController - .searchSuggestList[index].name![1], - style: TextStyle( - color: Theme.of(context).colorScheme.primary, - fontWeight: FontWeight.bold), - ), - TextSpan( - text: _searchController - .searchSuggestList[index].name![2]), - ], - ), - ), + child: _searchController.searchSuggestList[index].textRich, ), ); },