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

这篇具有很好参考价值的文章主要介绍了Flutter实用工具Indexer列表索引和Search搜索帮助。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.列表索引

效果图:

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

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直接过去key
    List<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文章来源地址https://www.toymoban.com/news/detail-697555.html

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;
  }
}

到了这里,关于Flutter实用工具Indexer列表索引和Search搜索帮助。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 编程实用工具推荐

    Snipaste,一款简单强大的截图贴图利器 下载地址:Snipaste Codelf通过搜索在线开源平台Github, Bitbucket, Google Code, Codeplex, Sourceforge, Fedora Projec的项目源码,帮开发者从中找出已有的匹配的变量名。这个搜索服务支持直接搜索中文。codeif支持中文查询,输入中文意思,codeif可

    2024年02月12日
    浏览(29)
  • 【实用工具】vim常用命令

    快速移动(上下左右箭头可替代) 在本行操作 跨行移动光标 复制,粘贴,删除(d,y,p) 撤销操作和恢复 快速注释 取消注释 参考链接: https://zhuanlan.zhihu.com/p/68111471 https://cloud.tencent.com/developer/article/1463765

    2024年02月03日
    浏览(23)
  • 【工具篇】Firmwalker车联网安全实用小工具介绍

    前言 firmwalker这个小工具在工作中也一直在用,正好领导说要写一篇这个工具的分析说明文章,经过询问可以发表博客。由于一直在用,所以末尾优劣势部分存在一些主观想法。 编写不易,如果能够帮助到你,希望能够点赞收藏加关注哦Thanks♪(・ω・)ノ PS:文章末尾有联系方

    2024年01月21日
    浏览(39)
  • Paragon NTFS2023最新mac免费实用工具磁盘工具

    mac虽然系统稳定,但在使用过程中也有一些瑕疵,如当mac连接到ntfs格式移动磁盘时,可能会出现移动磁盘无法在mac被正常读写的状况。遇到移动磁盘无法正常读写的状况,我们可以在mac中使用磁盘工具,以使mac获得对ntfs格式移动磁盘的正常读写权限。下面我们就来看mac实用

    2024年02月12日
    浏览(33)
  • 微软出品的实用小工具

    分享一些微软出品的实用小工具,希望对大家有所帮助。 Sysinternals Suite是微软发布的一套非常强大的免费工具程序集,一共包括74个Windows工具,通过Sysinternals Suite能够帮助我们快速进行配置,优化,测试,检测和修复Windows操作系统故障。 Sysinternals Suite集合了来自 Windows Sys

    2024年02月04日
    浏览(35)
  • ffmpeg工具实用命令

    说明:ffmpeg是一款非常好用的媒体操作工具,包含了许多对于视频、音频的操作,有些视频播放器,实际上就是套了一个ffmpeg的壳子。本文介绍ffmpeg的使用以及一些较为实用的命令。 ffmpeg是命令行操作的,不需要安装,可在官网下载压缩包; 解压到一个没有中文、没有数字

    2024年02月13日
    浏览(20)
  • 分享一些实用的工具

    网址:  JavaScript mapping library: amCharts 5 https://www.amcharts.com/javascript-maps/ Demo地址: Chart Demos - amCharts https://www.amcharts.com/demos/#maps  他分为amCharts4和5,5看起来更完善。很多都是我们平时看到的能实现的效果,比如航线图、业务分布图、数据分析、股票k线图等等。设计师可以用来

    2024年04月28日
    浏览(29)
  • 电脑实用增效工具

    1、腾讯电脑管家 强力卸载特别有用。本来挺排斥这类软件,但真正用一段时间后发现,已经能做到无骚扰,只需在关键时刻排上用场 2、Snipaste 桌面贴图软件,高效好用 3、DeskPins 置顶工具,可自定义快捷键 4、向日葵远程连接 多设备控制,外出手机控制PC 后续还有新发现在

    2024年02月06日
    浏览(31)
  • tcping实用小工具

    Tcping----实用小工具tcping命令详解 tcping:tcping命令基于tcp协议监控,可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从容硬线连接到分组交换或电路交换网络的各种通信系统之上操作。 ①ping:1、ping:是Windows、Unix和Linux系统下的一个命

    2023年04月08日
    浏览(21)
  • 实用小工具

    云图片:https://imgse.com/ 高清壁纸:https://bz.zzzmh.cn/

    2024年01月25日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包