Flutter:简单搞一个内容高亮

简介: 如上的效果,在Flutter当中,实现起来可以说是无比的简单,毕竟原生的组件都给我们提供了,那就是富文本组件RichText。

内容高亮并不陌生,特别是在搜索内容页面,可以说四处可见,就拿掘金这个应用而言,针对某一个关键字,我们搜索之后,与关键字相同的内容,则会高亮展示,如下图所示:



如上的效果,在Flutter当中,实现起来可以说是无比的简单,毕竟原生的组件都给我们提供了,那就是富文本组件RichText。

针对今天的内容,简单的列一个大纲,主要内容如下:

1、案例简单效果

2、认识RichText

3、文本的高亮实现逻辑

4、高亮组件源码

一、案例简单效果


1、简单的内容高亮展示



2、列表形式内容展示





二、认识RichText


要实现高亮效果,那么我们必须了解富文本组件RichText,话又说回来,什么是富文本呢?简单来说,它是一种特殊的文本格式,比普通文本更加丰富多彩,可以包含各种字体、颜色、大小等元素,使文本更加生动、有趣,比如我们常见的阅读协议等场景,均可采用富文本形式,这是原生的文本无法实现的效果。



初识构造


构造属性需要注意的是,这里的text,和文本Text中的text是不一样的,文本Text指的是字符串,这里的text指的是InlineSpan,当然了InlineSpan是抽象基类,一般我们使用TextSpan。


RichText({
super.key,
requiredthis.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));


常见构造属性概述:


constTextSpan({
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: constTextSpan(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来实现,代码如下:


constText.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=="") {
returnText(
_content,
style: _ordinaryStyle,
      );
    }
List<TextSpan>richList= [];
intstart=0;
intend;
//遍历,进行多处高亮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));
    }
returnRichText(
text: TextSpan(children: richList),
    );


四、高亮组件源码


源码很简单,可以结合列表组件或者单独使用,当然了,有一些特殊需求,文字加大或者改变背景等需求,都可以进行扩展。


classTextHighlightextendsStatelessWidget {
finalTextStyle_ordinaryStyle; //普通的样式finalTextStyle_highlightStyle; //高亮的样式finalString_content; //文本内容finalString_searchContent; //搜索的内容constTextHighlight(this._content, this._searchContent, this._ordinaryStyle,
this._highlightStyle,
      {super.key});
@overrideWidgetbuild(BuildContextcontext) {
//搜索内容为空if (_searchContent=="") {
returnText(
_content,
style: _ordinaryStyle,
      );
    }
List<TextSpan>richList= [];
intstart=0;
intend;
//遍历,进行多处高亮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));
    }
returnRichText(
text: TextSpan(children: richList),
    );
  }
}


案例Demo很是简单,上边是搜索框,下面是展示的内容,这里就不贴了,高亮组件已经给大家提供了,大家可以直接复制使用。

相关文章
|
8月前
|
开发框架 前端开发 数据安全/隐私保护
【Flutter 前端技术开发专栏】Flutter 中的布局与样式设计
【4月更文挑战第30天】本文探讨了Flutter的布局和样式设计,关键点包括:1) 布局基础如Column、Row和Stack用于创建复杂结构;2) Container、Center和Expanded等常用组件的作用;3) Theme和Decoration实现全局样式和组件装饰;4) 实战应用如登录界面和列表页面的构建;5) 响应式布局利用MediaQuery和弹性组件适应不同屏幕;6) 性能优化,避免过度复杂设计。了解并掌握这些,有助于开发者创建高效美观的Flutter应用。
214 0
【Flutter 前端技术开发专栏】Flutter 中的布局与样式设计
|
3月前
|
开发者
flutter:总结所有需要用到的方法与实战 (十六)
本文介绍了Flutter中路由和顶部导航的使用方法,包括简单路由、命名路由、返回及返回根路由的实现。同时,详细讲解了顶部导航的定义与属性设置,并通过实战案例展示了复杂布局、新闻列表和页面制作的思路。最后,还提供了父类向子类传递参数的方法以及如何添加依赖库。
|
5月前
|
JSON Android开发 数据格式
Flutter笔记:美工设计.导出视频到RIVE
Flutter笔记:美工设计.导出视频到RIVE
95 0
|
8月前
|
前端开发 UED 开发者
【Flutter前端技术开发专栏】Flutter中的列表与滚动视图优化
【4月更文挑战第30天】Flutter开发中,优化列表和滚动视图至关重要。本文介绍了几种优化方法:1) 使用`ListView.builder`和`GridView.builder`实现懒加载;2) 复用子组件以减少实例创建;3) 利用`CustomScrollView`和`Slivers`提升滚动性能;4) 通过`NotificationListener`监听滚动事件;5) 使用`KeepAlive`保持列表项状态。掌握这些技巧能提升应用性能和用户体验。
122 1
【Flutter前端技术开发专栏】Flutter中的列表与滚动视图优化
|
7月前
|
移动开发 前端开发 小程序
[保姆级教程]uniapp实现底部导航栏
【6月更文挑战第6天】
373 0
|
8月前
|
前端开发 搜索推荐 开发者
【Flutter前端技术开发专栏】Flutter中的自定义主题与暗黑模式
【4月更文挑战第30天】本文介绍了如何在Flutter中自定义主题和实现暗黑模式。通过`ThemeData`类定义应用的外观,包括颜色、字体和样式。示例展示了如何设置主色、强调色及文本、按钮主题。暗黑模式可通过`darkTheme`属性启用,结合`ThemeData.dark()`方法定制。利用`MediaQuery`监听系统亮度变化,动态调整暗黑模式状态。Flutter的这些特性有助于开发者创建独特且用户友好的界面。
318 0
【Flutter前端技术开发专栏】Flutter中的自定义主题与暗黑模式
|
8月前
|
缓存 前端开发 数据安全/隐私保护
【Flutter 前端技术开发专栏】Flutter 中的键盘处理与输入框优化
【4月更文挑战第30天】本文探讨了Flutter中键盘处理与输入框优化的关键技术,包括监听键盘显示隐藏、焦点管理、键盘类型适配、输入框高度自适应、处理键盘遮挡问题及性能优化。通过使用WidgetsBindingObserver、FocusNode和TextInputType等工具,开发者能提升用户体验,确保输入框在各种场景下的良好表现。实例分析和实践建议有助于开发者将这些方法应用于实际项目。
401 0
【Flutter 前端技术开发专栏】Flutter 中的键盘处理与输入框优化
|
8月前
|
前端开发 开发者 UED
【Flutter前端技术开发专栏】Flutter中的图标、字体与样式管理
【4月更文挑战第30天】本文介绍了在Flutter中管理图标、字体和样式的做法。Flutter提供`Icons`类用于内置矢量图标,支持第三方图标库如FontAwesome。自定义字体可通过添加字体文件至`assets`目录并配置`pubspec.yaml`,然后使用`TextStyle`设置。借助`ThemeData`,开发者能统一管理应用主题样式,局部样式可覆盖全局。通过集中管理样式,提升代码复用性和应用一致性。
195 0
【Flutter前端技术开发专栏】Flutter中的图标、字体与样式管理
|
8月前
|
开发框架 前端开发 搜索推荐
【Flutter前端技术开发专栏】Flutter中的自定义Widget与渲染流程
【4月更文挑战第30天】探索Flutter的自定义Widget与渲染流程。自定义Widget是实现复杂UI设计的关键,优点在于个性化设计、功能扩展和代码复用,但也面临性能优化和复杂性管理的挑战。创建步骤包括设计结构、定义Widget类、实现构建逻辑和处理交互。Flutter渲染流程涉及渲染对象树、布局、绘制和合成阶段。实践案例展示如何创建带渐变背景和阴影的自定义按钮。了解这些知识能提升应用体验并应对开发挑战。查阅官方文档以深入学习。
93 0
【Flutter前端技术开发专栏】Flutter中的自定义Widget与渲染流程
|
8月前
|
XML JSON 前端开发
【Flutter前端技术开发专栏】Flutter中的图片、视频与网络资源加载
【4月更文挑战第30天】Flutter是谷歌的开源前端框架,因其高性能、流畅UI和多端运行能力受开发者喜爱。本文聚焦于Flutter中的资源加载:使用`Image`组件加载静态、网络和本地图片;通过`video_player`库加载和播放视频;利用`http`包进行网络资源请求。掌握这些技巧将有助于提升Flutter应用的开发效率和质量。
59 0
【Flutter前端技术开发专栏】Flutter中的图片、视频与网络资源加载