Flutter搜索功能插件search_page的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter搜索功能插件search_page的使用

简介

search_page 是一个快速且简单的方式来构建自定义搜索体验的Flutter插件。它基于Flutter框架提供的资源,特别是SearchDelegate来创建Material风格的搜索界面。这个包的一个特别之处是filter参数,它提供了一种简单的方法来过滤列表中的项目,支持通过不同的字符串表示进行筛选。

主要特性

  • 基于SearchDelegate实现。
  • 提供了简单的过滤机制。
  • 支持自定义建议和错误提示界面。
  • 可以提供自定义的搜索过滤器。
  • 允许更改AppBar的主题等。

screenshot1 screenshot2 screenshot3

示例代码

以下是一个完整的示例demo,展示了如何在应用程序中集成search_page插件:

// 忽略未使用的导入警告
import 'package:flutter/material.dart';
import 'package:search_page/search_page.dart';

/// 用于演示`SearchPage`包的非常简单的类
class Person implements Comparable<Person> {
  final String name, surname;
  final num age;

  const Person(this.name, this.surname, this.age);

  @override
  int compareTo(Person other) => name.compareTo(other.name);
}

void main() => runApp(const MyApp());

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'search_page',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  static const people = [
    Person('Mike', 'Barron', 64),
    Person('Todd', 'Black', 30),
    Person('Ahmad', 'Edwards', 55),
    Person('Anthony', 'Johnson', 67),
    Person('Annette', 'Brooks', 39),
  ];

  const MyHomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Search Page'),
      ),
      body: ListView.builder(
        itemCount: people.length,
        itemBuilder: (context, index) {
          final person = people[index];

          return ListTile(
            title: Text(person.name),
            subtitle: Text(person.surname),
            trailing: Text('${person.age} yo'),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        tooltip: 'Search people',
        onPressed: () => showSearch(
          context: context,
          delegate: SearchPage(
            onQueryUpdate: print, // 当查询更新时触发
            items: people, // 要搜索的项列表
            searchLabel: 'Search people', // 搜索框占位符文本
            suggestion: const Center( // 当没有输入时显示的建议内容
              child: Text('Filter people by name, surname or age'),
            ),
            failure: const Center( // 当没有找到匹配项时显示的内容
              child: Text('No person found :('),
            ),
            filter: (person) => [ // 定义如何从每个项目中提取用于搜索的字符串
              person.name,
              person.surname,
              person.age.toString(),
            ],
            sort: (a, b) => a.compareTo(b), // 排序规则
            builder: (person) => ListTile( // 搜索结果项的构建方式
              title: Text(person.name),
              subtitle: Text(person.surname),
              trailing: Text('${person.age} yo'),
            ),
          ),
        ),
        child: const Icon(Icons.search),
      ),
    );
  }
}

使用步骤

  1. pubspec.yaml文件中添加依赖:
    dependencies:
      flutter:
        sdk: flutter
      search_page: ^最新版本号
    
  2. 根据上述示例代码修改你的Dart文件,确保你已经正确地引入了必要的库,并按照需要调整数据模型(如Person类)。
  3. 运行你的应用并测试搜索功能。

更多详细信息可以参考官方GitHub仓库。如果你有任何问题或需要进一步的帮助,请随时提问!


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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用search_page插件来实现搜索功能的示例代码。search_page是一个可以帮助你快速实现搜索界面的插件。下面是一个简单的示例,展示了如何集成和使用该插件。

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

dependencies:
  flutter:
    sdk: flutter
  search_page: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter项目中,你可以按照以下步骤实现搜索功能:

  1. 导入必要的包
import 'package:flutter/material.dart';
import 'package:search_page/search_page.dart';
  1. 创建搜索页面和结果页面
void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SearchScreen(),
    );
  }
}

class SearchScreen extends StatefulWidget {
  @override
  _SearchScreenState createState() => _SearchScreenState();
}

class _SearchScreenState extends State<SearchScreen> {
  final List<String> searchItems = List.generate(100, (index) => "Item ${index + 1}");

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Search Example'),
      ),
      body: SearchPage(
        key: ValueKey('searchPage'),
        searchBarController: _createSearchBarController(),
        placeholder: 'Search...',
        resultsFor: (query) => searchItems
            .where((item) => item.toLowerCase().contains(query.toLowerCase()))
            .toList(),
        onSearchStateChanged: (state) {
          // Handle search state changes if needed
        },
        builder: (context, results) {
          return ListView.builder(
            itemCount: results.length,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text(results[index]),
              );
            },
          );
        },
      ),
    );
  }

  SearchBarController _createSearchBarController() {
    return SearchBarController()
      ..addListener(() {
        // Handle search bar controller changes if needed
      });
  }
}

在上面的代码中:

  • SearchPage组件用于创建搜索页面。
  • placeholder属性设置了搜索栏的占位符文本。
  • resultsFor属性是一个函数,它根据查询字符串返回匹配的结果列表。
  • builder属性是一个函数,它接收上下文和搜索结果列表,并返回一个用于显示这些结果的Widget。
  • SearchBarController用于监听和控制搜索栏的状态。
  1. 运行应用

确保你已经正确安装了所有依赖,并保存了所有文件。然后,你可以通过运行flutter run来启动你的应用,并测试搜索功能。

这个示例展示了如何使用search_page插件来创建一个简单的搜索界面,并显示搜索结果。你可以根据需求进一步自定义和扩展这个示例。

回到顶部