这篇文章是关于在 Flutter 中制作过滤/搜索 ListView。我们将快速浏览完成工作的方法,然后通过一个具体而完整的示例来应用该方法。不需要第三方软件包。

概述

我们将创建一个函数来过滤结果,当文本字段更改 (onChanged) 时将调用此函数。搜索算法可能因情况而异,但最简单和最流行的是使用以下方法:

  • where():返回一个新的惰性 Iterable,其中包含满足一个或多个条件的所有元素。
  • contains():用于确定一个字符串是否包含另一个字符串(您可以尝试其他字符串方法,如startsWith()、**endsWith()**等)。
  • toLowerCase():这个字符串方法会将这个字符串中的所有字符转换为小写,这样搜索关键字是大写还是小写都没有关系。

这些词可能会令人困惑。请参阅示例以获得更清晰的信息。

例子

假设我们有一个用户列表,其中包含一些信息,包括 ID、姓名和年龄。一开始,所有这些用户都显示在一个 ListView 中。如果您在搜索字段中键入内容,则只会显示名称与关键字匹配的用户。如果您清除搜索字段,将再次显示完整的用户列表。

预览

编码

lib/main.dart 中的完整源代码以及注释中的解释:

// main.dart
import 'package:flutter/material.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(// Remove the debug bannerdebugShowCheckedModeBanner: false,title: 'Kindacode.com',home: HomePage(),);}
}class HomePage extends StatefulWidget {@override_HomePageState createState() => _HomePageState();
}class _HomePageState extends State<HomePage> {// This holds a list of fiction users// You can use data fetched from a database or cloud as wellfinal List<Map<String, dynamic>> _allUsers = [{"id": 1, "name": "Andy", "age": 29},{"id": 2, "name": "Aragon", "age": 40},{"id": 3, "name": "Bob", "age": 5},{"id": 4, "name": "Barbara", "age": 35},{"id": 5, "name": "Candy", "age": 21},{"id": 6, "name": "Colin", "age": 55},{"id": 7, "name": "Audra", "age": 30},{"id": 8, "name": "Banana", "age": 14},{"id": 9, "name": "Caversky", "age": 100},{"id": 10, "name": "Becky", "age": 32},];// This list holds the data for the list viewList<Map<String, dynamic>> _foundUsers = [];@overrideinitState() {// at the beginning, all users are shown_foundUsers = _allUsers;super.initState();}// This function is called whenever the text field changesvoid _runFilter(String enteredKeyword) {List<Map<String, dynamic>> results = [];if (enteredKeyword.isEmpty) {// if the search field is empty or only contains white-space, we'll display all usersresults = _allUsers;} else {results = _allUsers.where((user) =>user["name"].toLowerCase().contains(enteredKeyword.toLowerCase())).toList();// we use the toLowerCase() method to make it case-insensitive}// Refresh the UIsetState(() {_foundUsers = results;});}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Kindacode.com'),),body: Padding(padding: const EdgeInsets.all(10),child: Column(children: [SizedBox(height: 20,),TextField(onChanged: (value) => _runFilter(value),decoration: InputDecoration(labelText: 'Search', suffixIcon: Icon(Icons.search)),),SizedBox(height: 20,),Expanded(child: _foundUsers.length > 0? ListView.builder(itemCount: _foundUsers.length,itemBuilder: (context, index) => Card(key: ValueKey(_foundUsers[index]["id"]),color: Colors.amberAccent,elevation: 4,margin: EdgeInsets.symmetric(vertical: 10),child: ListTile(leading: Text(_foundUsers[index]["id"].toString(),style: TextStyle(fontSize: 24),),title: Text(_foundUsers[index]['name']),subtitle: Text('${_foundUsers[index]["age"].toString()} years old'),),),): Text('No results found',style: TextStyle(fontSize: 24),),),],),),);}
}

实际上,在这种情况下我们不需要TextEditingController

结论

您已经学习了如何在 Flutter 中创建过滤器/搜索 ListView。

如何在Flutter(2021)中创建过滤器搜索列表视图相关推荐

  1. 如何在React Native中创建精美的动画加载器

    by Vikrant Negi 通过Vikrant Negi 如何在React Native中创建精美的动画加载器 (How to create a beautifully animated load ...

  2. 如何安装html启动器,如何在Spring Boot中创建自己的启动器?

    如何在Spring Boot中创建自己的启动器? 也许你有一个内部库包或一个在整个应用程序环境中常用的开源库,如果要在多个Spring Boot应用程序中使用它,为它创建一个Spring Boot启动 ...

  3. 微软teams软件_如何在Microsoft Teams中创建和管理团队

    微软teams软件 With its friendly user interface, seamless integration with Office 365, and low price tag, ...

  4. Mac家谱制作软件MacFamilyTree 9好用吗?如何在MacFamilyTree 9中创建数据库的备份?

    Mac家谱制作软件MacFamilyTree 9好用吗?MacFamilyTree 能够帮助你记录.储存.和显示您的家庭信息,打印家族树.列表.卡片.遗传图表,能够让你清晰的了解你的家族人员情况,是一 ...

  5. 如何在sqlite3连接中创建并调用自定义函数

    #!/user/bin/env python # @Time :2018/6/8 14:44 # @Author :PGIDYSQ #@File :CreateFunTest.py '''如何在sql ...

  6. react中纯函数_如何在纯React中创建电子邮件芯片

    react中纯函数 by Andreas Remdt 由Andreas Remdt 如何在纯React中创建电子邮件芯片 (How to create email chips in pure Reac ...

  7. 如何在ORACLE CLOUD中创建和访问容器集群丨内附官方文档链接

    墨墨导读:本文描述如何在Oracle Cloud中创建并访问容器服务.为了简单,所有的操作都是针对root隔离区. 创建允许容器运行的政策官方文档链接 这一步是必须的,否则可以增加容器容器. 官方文档 ...

  8. java 线程中创建线程_如何在Java 8中创建线程安全的ConcurrentHashSet?

    java 线程中创建线程 在JDK 8之前,还没有办法在Java中创建大型的线程安全的ConcurrentHashSet. java.util.concurrent包甚至没有一个名为Concurren ...

  9. 如何在Java 8中创建线程安全的ConcurrentHashSet?

    在JDK 8之前,还没有办法在Java中创建大型的线程安全的ConcurrentHashSet. java.util.concurrent包甚至没有一个名为ConcurrentHashSet的类,但是 ...

最新文章

  1. php类方法语法错误捕获,php语法错误捕获
  2. 【Google Play】应用 “更新被拒“ 后续处理 ( 上传新版本后 , 一定要停用被拒的版本, 才可以通过审核 | 停用被拒的版本 | 送审 )
  3. 高可用架构-- MySQL主从复制的配置
  4. 转 OFBIZ webservice简介
  5. js返回上一页并刷新、返回上一页、自动刷新页面
  6. 小白也会用的SQL优化工具推荐
  7. 基于SSM实现的旅游管理系统【附源码】(毕设)
  8. A69G-HDMI问题解决集锦
  9. asp.net 设置div带颜色透明
  10. ​​​​尚硅谷—尚医通—前台用户系统—预约挂号—预约下单功能实现(155-160)
  11. commit 和 push 的临界点
  12. Maven详细入门及教学视频推荐
  13. hansontable编辑器
  14. LLVM IR转CFG
  15. 单片机 数字电压表(TLC2543)
  16. 谷歌浏览器打开CSDN老是弹出安卓网页
  17. win10注册mysql到windows服务报错:Install/Remove of the Service Denied
  18. 太和二中计算机考试,太和二中网上阅卷系统|翰林金榜太和二中查分系统 网页版_最火软件站...
  19. 高精度气体压力控制中TESCOM ER5000及其配套背压阀的国产化替代案例分析
  20. 例举电脑一键重装系统win10简单的步骤操作

热门文章

  1. php 字符串内容过滤,php过滤字符串内容的
  2. 西安交大计算机考研分数线2020院线,西安交通大学2020研究生复试分数线预计4月中旬左右公布...
  3. win10自启动文件夹目录
  4. 1、leetcode437 路和总径3
  5. ubuntu开启客户端nfs服务_LINUX系统使用NFS文件共享
  6. python语言写九九乘法表_【酷叮课堂】--Python语言完成99乘法表
  7. PHP新浪乐居面试题,一个朋友去新浪乐居面试时的面试题(PHP)
  8. php detailview,GridView以及DetailView的数据格式化
  9. abb变频器acs880说明书_常见品牌变频器修改功率方法大全
  10. python 导入其他上级目录的模块