Flutter列表搜索功能插件list_search的使用

Flutter列表搜索功能插件list_search的使用

在Flutter中,list_search 是一个非常实用的插件,可以帮助你在列表中执行搜索操作。如果你不想在列表中进行搜索操作,可以通过设置 isFieldShow 的值为 false 来禁用搜索框。你还可以自定义搜索框的设计。

此外,你可以通过 searchEmptyWidget 变量来显示一个特定的 widget,当搜索的值在列表中未找到时会显示该 widget。默认情况下,它会显示一个居中的文本提示:“No Result”。

使用示例

以下是一个完整的示例代码,展示了如何使用 list_search 插件实现列表搜索功能。

示例代码

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // 模拟的数据列表
  List<String> dataList = [
    'Apple',
    'Banana',
    'Orange',
    'Grapes',
    'Mango',
    'Pineapple',
    'Strawberry',
    'Watermelon',
    'Kiwi',
    'Blueberry'
  ];

  // 当前搜索的关键字
  String searchKey = '';

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          children: [
            // 搜索框
            TextField(
              onChanged: (value) {
                setState(() {
                  searchKey = value;
                });
              },
              decoration: InputDecoration(
                labelText: 'Search',
                border: OutlineInputBorder(),
              ),
            ),
            const SizedBox(height: 10),
            // 列表搜索组件
            Expanded(
              child: ListView.builder(
                itemCount: dataList.where((element) {
                  // 如果搜索关键字为空,则显示所有数据
                  if (searchKey.isEmpty) {
                    return true;
                  }
                  // 否则根据关键字过滤数据
                  return element.toLowerCase().contains(searchKey.toLowerCase());
                }).length,
                itemBuilder: (context, index) {
                  // 获取过滤后的数据
                  final filteredData = dataList.where((element) {
                    if (searchKey.isEmpty) {
                      return true;
                    }
                    return element.toLowerCase().contains(searchKey.toLowerCase());
                  }).toList();

                  // 如果搜索结果为空,显示提示信息
                  if (filteredData.isEmpty && searchKey.isNotEmpty) {
                    return Center(
                      child: Text(
                        'No Result',
                        style: TextStyle(fontSize: 16, color: Colors.grey),
                      ),
                    );
                  }

                  // 显示搜索结果
                  return ListTile(
                    title: Text(filteredData[index]),
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter列表搜索功能插件list_search的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter列表搜索功能插件list_search的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,list_search 是一个用于在列表中实现搜索功能的插件。它可以帮助你快速过滤列表项,使用户能够轻松地找到他们需要的内容。以下是如何使用 list_search 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 list_search 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  list_search: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你的 Dart 文件中导入 list_search 插件:

import 'package:list_search/list_search.dart';

3. 创建数据列表

假设你有一个包含多个项目的列表:

List<String> items = [
  "Apple",
  "Banana",
  "Cherry",
  "Date",
  "Elderberry",
  "Fig",
  "Grape",
  "Honeydew"
];

4. 使用 ListSearch 组件

在你的 build 方法中使用 ListSearch 组件来实现搜索功能:

class MySearchableList extends StatefulWidget {
  @override
  _MySearchableListState createState() => _MySearchableListState();
}

class _MySearchableListState extends State<MySearchableList> {
  List<String> filteredItems = [];

  @override
  void initState() {
    super.initState();
    filteredItems = List.from(items);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Searchable List'),
      ),
      body: Column(
        children: [
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: ListSearch(
              list: items,
              onUpdate: (filteredList) {
                setState(() {
                  filteredItems = filteredList;
                });
              },
              queryBuilder: (query, item) {
                return item.toLowerCase().contains(query.toLowerCase());
              },
              child: TextField(
                decoration: InputDecoration(
                  labelText: 'Search',
                  border: OutlineInputBorder(),
                ),
              ),
            ),
          ),
          Expanded(
            child: ListView.builder(
              itemCount: filteredItems.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(filteredItems[index]),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

5. 运行应用

现在,你可以运行你的应用,并在搜索框中输入关键字来过滤列表项。

6. 自定义搜索逻辑

queryBuilder 参数允许你自定义搜索逻辑。例如,如果你想根据项目的前缀进行搜索,可以这样实现:

queryBuilder: (query, item) {
  return item.toLowerCase().startsWith(query.toLowerCase());
},
回到顶部