Flutter实用工具Indexer列表索引和Search搜索帮助。

1.列表索引

效果图:

indexer.dart

import 'package:json_annotation/json_annotation.dart';abstract class Indexer {///用于排序的字母@JsonKey(includeFromJson: false, includeToJson: false)String? sortLetter;///用于排序的拼音@JsonKey(includeFromJson: false, includeToJson: false)String? fullLetter;///用于继承类设置需要索引的字段String? getFullName();
}

indexer_util.dart

import 'package:kq_flutter_widgets/utils/ex/string_ex.dart';
import 'package:lpinyin/lpinyin.dart';import 'indexer.dart';class IndexerUtil {///始终排在列表最顶端,可自己改为特定值static String ALWAYS_TOP_SYMBOL = "★";///始终排在列表最底部,可自己改为特定值static String ALWAYS_BOTTOM_SYMBOL = "#";///给数据排序,默认根据{@link IndexModel#getSortLetter()}内容升序排列,其中有两个特殊字符{@link #ALWAYS_TOP_SYMBOL}///和{@link #ALWAYS_BOTTOM_SYMBOL}。如果{@link IndexModel#getSortLetter()}获取内容为{@link #ALWAYS_TOP_SYMBOL},///则始终排在最顶端,如果{@link IndexModel#getSortLetter()}获取内容为{@link #ALWAYS_BOTTOM_SYMBOL},则始终排在最低端。///通常情况下都无需调用{@link IndexModel#setSortLetter(String)},除非你想干预某个数据在列表的排序结果/// @param isIndexNumber 是否索引数字,如果不索引,则全部放到{@linkplain #ALWAYS_BOTTOM_SYMBOL #}号分组///                      {@code true} 索引///                     {@code false} 不索引/// @param isUserName    是否是人名,{@code true} 处理多音字作为姓氏时的正确读音static List<String> getIndexData<T extends Indexer>({required List<T> data,LatterType type = LatterType.lowerCase,bool isIndexNumber = false}) {for (T t in data) {_swap(t, isIndexNumber, type);}_sortData(data);///TODO 优化,从sectionData直接过去keyList<String> indexData = [];for (T t in data) {if (t.sortLetter == null && !indexData.contains(ALWAYS_BOTTOM_SYMBOL)) {indexData.add(ALWAYS_BOTTOM_SYMBOL);} else if (!indexData.contains(t.sortLetter)) {indexData.add(t.sortLetter!);}}return indexData;}///给数据排序,默认根据{@link IndexModel#getSortLetter()}内容升序排列,其中有两个特殊字符{@link #ALWAYS_TOP_SYMBOL}///和{@link #ALWAYS_BOTTOM_SYMBOL}。如果{@link IndexModel#getSortLetter()}获取内容为{@link #ALWAYS_TOP_SYMBOL},///则始终排在最顶端,如果{@link IndexModel#getSortLetter()}获取内容为{@link #ALWAYS_BOTTOM_SYMBOL},则始终排在最低端。///通常情况下都无需调用{@link IndexModel#setSortLetter(String)},除非你想干预某个数据在列表的排序结果/// @param isIndexNumber 是否索引数字,如果不索引,则全部放到{@linkplain #ALWAYS_BOTTOM_SYMBOL #}号分组///                      {@code true} 索引///                     {@code false} 不索引/// @param isUserName    是否是人名,{@code true} 处理多音字作为姓氏时的正确读音static Map<String, List<T>> getSectionData<T extends Indexer>({required List<T> data,LatterType type = LatterType.lowerCase,bool isIndexNumber = false}) {for (T t in data) {_swap(t, isIndexNumber, type);}_sortData(data);Map<String, List<T>> sectionData = {};List<String>? indexData = [];for (T t in data) {if (t.sortLetter == null && !indexData.contains(ALWAYS_BOTTOM_SYMBOL)) {indexData.add(ALWAYS_BOTTOM_SYMBOL);sectionData.putIfAbsent(ALWAYS_BOTTOM_SYMBOL, () => [t]);} else if (!indexData.contains(t.sortLetter)) {indexData.add(t.sortLetter!);sectionData.putIfAbsent(t.sortLetter!, () => [t]);} else {sectionData.update(t.sortLetter!, (value) {value.add(t);return value;});}}return sectionData;}///排序static _sortData<T extends Indexer>(List<T> data) {data.sort((left, right) {if (left.sortLetter == ALWAYS_TOP_SYMBOL) {return -1;} else if (left.sortLetter != ALWAYS_TOP_SYMBOL &&right.sortLetter == ALWAYS_TOP_SYMBOL) {return 1;} else if (left.sortLetter == ALWAYS_BOTTOM_SYMBOL &&right.sortLetter != ALWAYS_BOTTOM_SYMBOL) {return 1;} else if (right.sortLetter == ALWAYS_BOTTOM_SYMBOL) {return -1;} else {return (left.sortLetter ?? "").compareTo(right.sortLetter ?? "");}});}///获取汉字全拼首字母static String? _getSelling<T extends Indexer>(T t) {String? latter = t.getFullName();if (latter.isNullOrEmpty) {return null;}return PinyinHelper.getFirstWordPinyin(latter!);}///根据全拼获取首字母static String _getFirstLetter(String pinyin, bool isIndexNumber, LatterType type) {if (pinyin.isNullOrEmpty) {return ALWAYS_BOTTOM_SYMBOL;}String sortString = pinyin.substring(0, 1);if (RegExp(r"[A-Za-z]").hasMatch(sortString)) {return type == LatterType.upperCase? sortString.toUpperCase(): sortString.toLowerCase();} else if (isIndexNumber && RegExp(r"\d").hasMatch(sortString)) {return sortString;} else {return ALWAYS_BOTTOM_SYMBOL;}}///数据转化static _swap<T extends Indexer>(T t, bool isIndexNumber, LatterType type) {t.fullLetter ??= _getSelling(t);t.sortLetter ??= _getFirstLetter(t.fullLetter!, isIndexNumber, type);if (t.sortLetter != null && t.sortLetter!.isEmpty) {t.sortLetter = ALWAYS_BOTTOM_SYMBOL;}}
}enum LatterType {///大写upperCase,///小写lowerCase
}

上面的只是帮助类,帮助数据分组和索引,界面的分组和展示需要自己布局实现。

2.搜索帮助

search_able.dart

abstract class SearchAble{String toSearch();
}

search_util.dart

import 'package:kq_flutter_widgets/utils/ex/string_ex.dart';
import 'package:kq_flutter_widgets/utils/search/search_able.dart';/// 搜索帮助类
class SearchUtil {/// 根据搜索内容搜索出相关数据/// 用户需要搜索的数据类需要继承[SearchAble],并实现[toSearch]方法static List<T> search<T extends SearchAble>(String? searchText, List<T> data) {List<T> searchData = [];if (searchText.isNotNullOrEmpty) {for (T t in data) {if (t.toSearch().isNotNullOrEmpty &&t.toSearch().toLowerCase().trim().contains(searchText!.toLowerCase())) {searchData.add(t);}}}return searchData;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/123071.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何有效防止服务器被攻击?

随着互联网的快速发展&#xff0c;服务器安全问题日益引起人们的关注。近期&#xff0c;全球范围内频繁发生的服务器攻击事件引发了广泛关注。为了保护企业和个人的数据安全&#xff0c;有效防止服务器被攻击已成为迫在眉睫的任务。 首先&#xff0c;及时更新服务器的操作系统和…

基于SpringBoot的医院挂号系统

基于SpringBootVue的医院挂号、预约、问诊管理系统&#xff0c;前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 角色&#xff1a;管理员、用户、医生 管…

系统架构技能之设计模式-组合模式

一、上篇回顾 我们上篇主要讲述了结构型模式中的外观模式&#xff0c;外观模式作为结构型模式中的一个简单又实用的模式&#xff0c;外观模式通过封装细节来提供大粒度的调用&#xff0c; 直接的好处就是&#xff0c;封装细节&#xff0c;提供了应用写程序的可维护性和易用性。…

十二、集合(4)

本章概要 集合 Set映射 Map队列 Queue 优先级队列 PriorityQueue 集合与迭代器 集合Set Set 不保存重复的元素。 如果试图将相同对象的多个实例添加到 Set 中&#xff0c;那么它会阻止这种重复行为。 Set 最常见的用途是测试归属性&#xff0c;可以很轻松地询问某个对象是否…

命名空间的详讲

本篇文章旨在讲解C中命名空间的概念以及其相关注意事项&#xff01; C的介绍 C作为C语言的衍生&#xff0c;其对C语言中的一些缺陷进行了一些的补充和优化。但是C也对C语言具有兼容性&#xff01; 本文旨在讲解C对C语言中当声明的变量与库函数的一些标识符&#xff0c;关键字…

【数论】容斥问题教程+符号含义+公式(c++)

容斥问题是什么 比如我们平常考试&#xff0c;我们会统计有几个语文及格&#xff0c;有几个数学及格&#xff0c;比如5个语文及格&#xff0c;2个数学及格&#xff0c;当然了&#xff0c;也会有大学霸两科都及格&#xff0c;比如1个人语文数学都及格&#xff0c;那我们班上一共…

Hadoop的第二个核心组件:MapReduce框架第四节

Hadoop的第二个核心组件&#xff1a;MapReduce框架 十、MapReduce的特殊应用场景1、使用MapReduce进行join操作2、使用MapReduce的计数器3、MapReduce做数据清洗 十一、MapReduce的工作流程&#xff1a;详细的工作流程第一步&#xff1a;提交MR作业资源第二步&#xff1a;运行M…

vnc与windows之间的复制粘贴

【原创】VNC怎么和宿主机共享粘贴板 假设目标主机是linux&#xff0c;终端主机是windows&#xff08;就是在windows上使用VNC登陆linux&#xff09; 在linux中执行 vncconfig -nowin& 在linux选中文字后&#xff0c;无需其他按键&#xff0c;直接在windows中可以黏贴。 …

【C++基础】5. 变量作用域

文章目录 【 1. 局部变量 】【 2. 全局变量 】【 3. 局部变量和全局变量的初始化 】 作用域是程序的一个区域&#xff0c;一般来说有三个地方可以定义变量&#xff1a; 在函数或一个代码块内部声明的变量&#xff0c;称为局部变量。 在函数参数的定义中声明的变量&#xff0c;称…

【前端demo】圣诞节灯泡 CSS动画实现轮流闪灯

文章目录 效果过程灯泡闪亮实现&#xff08;animation和box-shadow&#xff09;控制灯泡闪亮时间和顺序&#xff08;animation-delay&#xff09;按钮开关 代码htmlcssjs 参考代码1代码2 前端demo目录 效果 效果预览&#xff1a;https://codepen.io/karshey/pen/zYyBRWZ 参考…

Vue + Element UI 前端篇(十二):用户管理模块

Vue Element UI 实现权限管理系统 前端篇&#xff08;十二&#xff09;&#xff1a;用户管理模块 用户管理模块 添加接口 在 http/moduls/user.js 中添加用户管理相关接口。 import axios from ../axios/* * 用户管理模块*/// 保存 export const save (params) > {ret…

React中消息订阅与发布(PubSubJS)——两个组件之间通信

结合案例&#xff1a;github搜索案例 结果如下图 1.父容器代码 import React, { Component } from react import Search from ./components/Search import List from ./components/List export default class App extends Component {render() {return (<div className&…

【面试题】如何实现数组去重的?有几种方式?

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 【国庆头像】- 国庆爱国 程序员头像&#xff01;总有一款适合你&#xff01; 1. 方法一&#xff1a;利用两层循环数组的splice方法 通过两层循环对数组…

zabbix监控平台部署

目录 前言 一、zabbix的基本概述 &#xff08;一&#xff09;、zabbix的工作流程 &#xff08;二&#xff09;、zabbix的构成 &#xff08;三&#xff09;、zabbix的监控对象 &#xff08;四&#xff09;、zabbix的常用术语 &#xff08;五&#xff09;、zabbix进程详解…

MySQL数据库的增删改查(进阶)

目录 数据库约束 约束类型 NULL约束 UNIQUE&#xff1a;唯一约束 DEFAULT&#xff1a;默认值约束 PRIMARY KEY&#xff1a;主键约束 FOREIGN KEY&#xff1a;外键约束 表的设计 一对一关系 一对多关系 多对多关系 查询 聚合查询 聚合函数 GROUP BY子句 HAVING …

深入协议栈了解TCP的三次握手、四次挥手、CLOSE-WAIT、TIME-WAIT。

TCP网络编程的代码网上很多&#xff0c;这里就不再赘述&#xff0c;简单用一个图展示一下tcp网络编程的流程&#xff1a; 1、深入connect、listen、accept系统调用&#xff0c;进一步理解TCP的三次握手 这三个函数都是系统调用&#xff0c;我们可以分为请求连接方和被…

项目(智慧教室)第四部分,页面交互功能

一。页面构思 1.标题栏 大标题&#xff1a;智慧教室管理系统 小标题&#xff1a;灯光&#xff0c;报警&#xff0c;风扇&#xff0c;温度&#xff0c;湿度&#xff0c;光照 2.样式设计 背景设置。字体设置&#xff08;字体大小&#xff0c;格式&#xff0c;颜色&#xff09; 3.…

简单使用_matlab生成数据帧

文章目录 生成数据帧参考 生成数据帧 代码如下&#xff0c;代码很简单&#xff0c;有几点要注意&#xff0c; 较高版本的MATLAB中支持0x的写法使用bitand进行位运算使用strcat函数进行字符串拼接时&#xff0c;如果需要插入空格&#xff0c;要使用双引号 cmd_ay(1) 0x33; …

【跟小嘉学 Rust 编程】二十三、Cargo 使用指南

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…

【MySQL】CRUD (增删改查) 基础

CRUD&#xff08;增删改查&#xff09;基础 一. CRUD二. 新增 &#xff08;Create&#xff09;1. 单行数据 全列插入2. 多行数据 指定列插入 三. 查询&#xff08;Retrieve&#xff09;1. 全列查询2. 指定列查询3. 查询字段为表达式4. 别名5. 去重&#xff1a;DISTINCT6. 排序…