Flutter:簡單搞一個內容高亮

內容高亮并不陌生,特別是在搜索內容頁面,可以說四處可見,就拿掘金這個應用而言,針對某一個關鍵字,我們搜索之后,與關鍵字相同的內容,則會高亮展示,如下圖所示:

如上的效果,在Flutter當中,實現起來可以說是無比的簡單,畢竟原生的組件都給我們提供了,那就是富文本組件RichText。

針對今天的內容,簡單的列一個大綱,主要內容如下:

1、案例簡單效果

2、認識RichText

3、文本的高亮實現邏輯

4、高亮組件源碼

一、案例簡單效果

1、簡單的內容高亮展示

2、列表形式內容展示

二、認識RichText

要實現高亮效果,那么我們必須了解富文本組件RichText,話又說回來,什么是富文本呢?簡單來說,它是一種特殊的文本格式,比普通文本更加豐富多彩,可以包含各種字體、顏色、大小等元素,使文本更加生動、有趣,比如我們常見的閱讀協議等場景,均可采用富文本形式,這是原生的文本無法實現的效果。

初識構造

構造屬性需要注意的是,這里的text,和文本Text中的text是不一樣的,文本Text指的是字符串,這里的text指的是InlineSpan,當然了InlineSpan是抽象基類,一般我們使用TextSpan。

RichText({super.key,required this.text,this.textAlign = TextAlign.start,this.textDirection,this.softWrap = true,this.overflow = TextOverflow.clip,this.textScaleFactor = 1.0,this.maxLines,this.locale,this.strutStyle,this.textWidthBasis = TextWidthBasis.parent,this.textHeightBehavior,this.selectionRegistrar,this.selectionColor,}) : assert(text != null),assert(textAlign != null),assert(softWrap != null),assert(overflow != null),assert(textScaleFactor != null),assert(maxLines == null || maxLines > 0),assert(textWidthBasis != null),assert(selectionRegistrar == null || selectionColor != null),super(children: _extractChildren(text));

常見構造屬性概述:

const TextSpan({this.text,this.children,super.style,this.recognizer,MouseCursor? mouseCursor,this.onEnter,this.onExit,this.semanticsLabel,this.locale,this.spellOut,}) : mouseCursor = mouseCursor ??(recognizer == null ? MouseCursor.defer : SystemMouseCursors.click),assert(!(text == null && semanticsLabel != null));

屬性

類型

概述

textAlign

TextAlign

文本對齊方式

TextAlign.left
TextAlign.right
TextAlign.cente
TextAlign.justify
TextAlign.start
TextAlign.end

textDirection

TextDirection

文本的方向

TextDirection.ltr
TextDirection.rtl

overflow

TextOverflow

文字溢出的處理方式
TextOverflow.clip:剪切溢出的文本填滿容器。
TextOverflow.fade:將溢出的文本淡化為透明。
TextOverflow.ellipsis:使用省略號表示文本已溢出。
TextOverflow.visible:呈現容器外溢出的文本

maxLines

int

最大行數

textWidthBasis

TextWidthBasis

文本的寬度

TextWidthBasis.parent

TextWidthBasis.longestLine

TextSpan常見屬性

屬性

說明

text

String類型的文本

children

子組件

style

TextStyle類型的文本樣式可以設置文字的大小、顏色、樣式等

recognizer

指定手勢交互
recognizer: TapGestureRecognizer()..onTap = () {},可以監聽點擊事件

簡單案例:

RichText(text: const TextSpan(children: [TextSpan(text: "床前明月光,", style: TextStyle(color: Colors.black)),TextSpan(text: "疑是地上霜。", style: TextStyle(color: Colors.red)),TextSpan(text: "舉頭望明月,", style: TextStyle(color: Colors.blueAccent)),TextSpan(text: "低頭思故鄉。", style: TextStyle(color: Colors.tealAccent))])

效果:

當然了,除了上述寫法之外,也可以使用Text.rich來實現,代碼如下:

 const Text.rich(TextSpan(children: [TextSpan(text: "床前明月光,", style: TextStyle(color: Colors.black)),TextSpan(text: "疑是地上霜。", style: TextStyle(color: Colors.red)),TextSpan(text: "舉頭望明月,", style: TextStyle(color: Colors.blueAccent)),TextSpan(text: "低頭思故鄉。", style: TextStyle(color: Colors.tealAccent))]))

三、文本的高亮實現邏輯

RichText可以實現一個富文本展示,那么如何利用這個組件實現某個內容高亮展示呢?首先,我們要明白,高亮的內容是不固定的,一段內容的每個字符都有可能會高亮,所以針對TextSpan,我們就需要動態的創建,然后動態的改變其樣式。

這里的動態也是十分的簡單,無非就是字符串的截取,分別是開頭、結尾、和中間三種情況進行截取,如下圖所示。

當然了,需要注意,有可能要搜索的這個內容,在整個內容中是多處存在的,這個時候,針對以上的邏輯,就需要遍歷循環了,直至找到最后一個搜索的內容。

主要的邏輯如下:

 //搜索內容為空if (_searchContent == "") {return Text(_content,style: _ordinaryStyle,);}List<TextSpan> richList = [];int start = 0;int end;//遍歷,進行多處高亮while ((end = _content.indexOf(_searchContent, start)) != -1) {//如果搜索內容在開頭位置,直接高亮,此處不執行if (end != 0) {richList.add(TextSpan(text: _content.substring(start, end), style: _ordinaryStyle));}//高亮內容richList.add(TextSpan(text: _searchContent, style: _highlightStyle));//賦值索引start = end + _searchContent.length;}//搜索內容只有在開頭或者中間位置,才執行if (start != _content.length) {richList.add(TextSpan(text: _content.substring(start, _content.length),style: _ordinaryStyle));}return RichText(text: TextSpan(children: richList),);

四、高亮組件源碼

源碼很簡單,可以結合列表組件或者單獨使用,當然了,有一些特殊需求,文字加大或者改變背景等需求,都可以進行擴展。

class TextHighlight extends StatelessWidget {final TextStyle _ordinaryStyle; //普通的樣式final TextStyle _highlightStyle; //高亮的樣式final String _content; //文本內容final String _searchContent; //搜索的內容const TextHighlight(this._content, this._searchContent, this._ordinaryStyle,this._highlightStyle,{super.key});@overrideWidget build(BuildContext context) {//搜索內容為空if (_searchContent == "") {return Text(_content,style: _ordinaryStyle,);}List<TextSpan> richList = [];int start = 0;int end;//遍歷,進行多處高亮while ((end = _content.indexOf(_searchContent, start)) != -1) {//如果搜索內容在開頭位置,直接高亮,此處不執行if (end != 0) {richList.add(TextSpan(text: _content.substring(start, end), style: _ordinaryStyle));}//高亮內容richList.add(TextSpan(text: _searchContent, style: _highlightStyle));//賦值索引start = end + _searchContent.length;}//搜索內容只有在開頭或者中間位置,才執行if (start != _content.length) {richList.add(TextSpan(text: _content.substring(start, _content.length),style: _ordinaryStyle));}return RichText(text: TextSpan(children: richList),);}
}

案例Demo很是簡單,上邊是搜索框,下面是展示的內容,這里就不貼了,高亮組件已經給大家提供了,大家可以直接復制使用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39186.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39186.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39186.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Linux操作系統】舉例解釋Linux系統編程中文件io常用的函數

在Linux系統編程中&#xff0c;文件IO操作是非常常見和重要的操作之一。通過文件IO操作&#xff0c;我們可以打開、讀取、寫入和關閉文件&#xff0c;對文件進行定位、復制、刪除和重命名等操作。本篇博客將介紹一些常用的文件IO操作函數。 文章目錄 1. open()1.1 原型、參數及…

讀書筆記 |【項目思維與管理】? 順勢而動

讀書筆記 |【項目思維與管理】? 順勢而動 一、企業步入“終結者時代”二、過去成功的經驗也許是最可怕的三、做好非重復性的事四、適應客戶是出發點五、向知識型企業轉變六、速度是決勝條件 &#x1f496;The Begin&#x1f496;點點關注&#xff0c;收藏不迷路&#x1f496; …

docker私有倉庫harbor

一、安裝docker-compose yum install docker-compose -y 二、下載harbor安裝包 tar -xf harbor-online-installer-v2.1.0.tgz cp harbor.yml.tmpl harbor.yml 三、修改harbor配置 [rootharbor ~]# vim harbor.ymlhostname: "修改為本機ip" harboradminpassword:…

每天一道leetcode:1218. 最長定差子序列(動態規劃中等)

今日份題目&#xff1a; 給你一個整數數組 arr 和一個整數 difference&#xff0c;請你找出并返回 arr 中最長等差子序列的長度&#xff0c;該子序列中相鄰元素之間的差等于 difference 。 子序列 是指在不改變其余元素順序的情況下&#xff0c;通過刪除一些元素或不刪除任何…

iTOP-i.MX8M開發板添加USB網絡設備驅動

選中支持 USB 網絡設備驅動&#xff0c;如下圖所示&#xff1a; [*] Device Drivers→ *- Network device support → USB Network Adapters→ {*} Multi-purpose USB Networking Framework 將光標移動到 save 保存&#xff0c;如下圖所示&#xff1a; 保存到 arch/arm64/c…

樹形動態規劃——樹形dp

樹形動態規劃 樹形 d p dp dp算法是一種用于解決樹相關問題的動態規劃算法。它把樹的問題分解成了子問題&#xff0c;并通過子問題的求解來構建整個問題的解。 當我們面對一棵樹的問題時&#xff0c;我們可以使用樹形 d p dp dp來解決。這種算法的基本思想是通過定義一個用于…

C語言入門 Day_5 四則運算

目錄 前言 1.四則運算 2.其他運算 3.易錯點 4.思維導圖 前言 圖為世界上第一臺通用計算機ENIAC,于1946年2月14日在美國賓夕法尼亞大學誕生。發明人是美國人莫克利&#xff08;JohnW.Mauchly&#xff09;和艾克特&#xff08;J.PresperEckert&#xff09;。 計算機的最開始…

代碼隨想錄第四十四天

代碼隨想錄第四十四天 Leetcode 518. 零錢兌換 IILeetcode 377. 組合總和 Ⅳ Leetcode 518. 零錢兌換 II 題目鏈接: 零錢兌換 II 自己的思路:想不到&#xff0c;忘記這個遞推公式了&#xff01;&#xff01;&#xff01;而且初始化也要值得注意&#xff01; 正確思路:由于這個…

js數組學習(ES6+)

文章目錄 js(ES6)數組學習1.Array.prototype.forEach(fn)2.Array.prototype.map(fn)3.Array.prototype.filter(fn)4.Array.prototype.reduce(fn)5.Array.prototype.some(fn) every6.Array.prototype.find(fn)7.Array.prototype.includes(item) js(ES6)數組學習 1.Array.protot…

kube-prometheus 系列3 使用 blackbox-exporter 進行 icmp 和 http 監控

安裝kube-prometheus 后默認在monitoring namespace中有創建 blackbox-exporter deployment。但默認沒有icmp的module配置&#xff0c;無法執行ping探測。因為即使有icmp module&#xff0c;默認配置也是無法執行ping探測的&#xff08;這篇文章要解決的就是這個問題&#xff0…

CentOS 7 下 Keepalived + Nginx 實現雙機高可用

CentOS 7 下 Keepalived Nginx 實現雙機高可用 文章目錄 CentOS 7 下 Keepalived Nginx 實現雙機高可用服務器準備服務信息服務架構 服務安裝nginxKeepalived 服務配置nginxKeepalived 啟動服務nginxkeepalived 服務驗證查看 VIP 狀態CURL 命令訪問瀏覽器訪問 高可用驗證停止…

146. LRU 緩存

題目描述 請你設計并實現一個滿足 LRU (最近最少使用) 緩存 約束的數據結構。 實現 LRUCache 類&#xff1a; LRUCache(int capacity) 以 正整數 作為容量 capacity 初始化 LRU 緩存int get(int key) 如果關鍵字 key 存在于緩存中&#xff0c;則返回關鍵字的值&#xff0c;否…

vue+springboot 前后端分離 上傳文件處理后再下載,并且傳遞參數

vue代碼 <template><div><input type"file" ref"fileInput" accept".json"/><el-button click"upload">上傳</el-button></div> </template><script> export default {name: "…

【第二階段】kotlin的lambda學習

匿名函數lambdm表達式 1.兩數相加 fun main() {//匿名函數lambda表達式//兩數相加 等價&#xff1a;val addResult:(Int,Int)->String{a,b->"兩數相加結果&#xff1a;${ab}"}val addResult{a:Int,b:Int->"兩數相加結果${ab}"}println(addResul…

Stable Diffusion WebUI 從零基礎到入門

本文主要介紹Stable Diffusion WebUI的實際操作方法&#xff0c;涵蓋prompt推導、lora模型、vae模型和controlNet應用等內容&#xff0c;并給出了可操作的文生圖、圖生圖實戰示例。適合對Stable Diffusion感興趣&#xff0c;但又對Stable Diffusion WebUI使用感到困惑的同學&am…

CSS變形與動畫(二):perspctive透視效果 與 preserve-3d 3d效果(奧運五環例子)

文章目錄 perspective 3d透視效果preserve-3d 3d嵌套效果例子 奧運五環 backface-visibility 背面效果 perspective 3d透視效果 perspective 指定了觀察者與 z0 平面的距離&#xff0c;使具有三維位置變換的元素產生透視效果。z>0 的三維元素比正常大&#xff0c;而 z<0 …

試崗第一天問題

1、公司的一個項目拉下來 &#xff0c;npm i 不管用顯示 后面百度 使用了一個方法 雖然解決 但是在增加別的依賴不行&#xff0c;后面發現是node版本過高&#xff0c;更換node版本解決。 2、使用插件動態的使數字從0到100&#xff08;vue-animate-number插件&#xff09; 第一…

ChatGPT or BingChat

你相信我們對大模型也存在「迷信權威」嗎&#xff1f; ChatGPT 的 GPT-4 名聲在外&#xff0c;我們就不自覺地更相信它&#xff0c;優先使用它。但我用 ChatALL 比較 AI 大模型們這么久&#xff0c;得到的結論是&#xff1a; ChatGPT GPT-4 在大多數情況下確實是最強&#xf…

插入、希爾、歸并、快速排序(java實現)

目錄 插入排序 希爾排序 歸并排序 快速排序 插入排序 排序原理&#xff1a; 1.把所有元素分為兩組&#xff0c;第一組是有序已經排好的&#xff0c;第二組是亂序未排序。 2.將未排序一組的第一個元素作為插入元素&#xff0c;倒序與有序組比較。 3.在有序組中找到比插入…

Linux 內核內存管理 page_address 函數

文章目錄 一、page_address1.1 page_address1.2 page_to_pfn1.3 PFN_PHYS1.4 __va(x)1.5 總結1.6 page_to_virt 二、使用demo 一、page_address 1.1 page_address 內核用 struct page 結構體來表示系統中的每個物理頁面&#xff0c;該結構體用來跟蹤和管理這些物理頁面的使用…