搜索插件、代码仓与 APP 分类

插件详情v1.0.2+2

search_app_bar

一个动画搜索栏库,可轻松控制列表中任何类型数据的搜索。

近 30 天下载
6
喜欢数
45
Pub 分数
30

安装插件

flutter pub add search_app_bar

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

search_app_bar 是一个 Flutter 包,提供了一个动画搜索栏小部件,简化了在各种数据列表中实现搜索功能的过程。它支持流畅的过渡效果和直观的用户交互,使动态过滤和显示结果变得简单。该库专注于在搜索操作期间通过视觉反馈提升用户体验。专为寻求轻量级、可自定义解决方案的开发者设计,无需复杂设置即可将搜索功能集成到应用中。

适合场景

  • 实时过滤动态列表
  • 通过动画搜索界面提升用户体验
  • 在表单或仪表板中实现搜索
  • 将搜索功能集成到列表视图中
  • 创建响应式搜索界面
  • 支持移动应用中的文本过滤

主要特点

  • 动画搜索栏过渡
  • 与任何列表数据轻松集成
  • 可自定义的外观和行为
  • 实时搜索结果更新
  • 轻量级且依赖项最少
  • 支持文本输入和清除操作

适合对象

  • 开发搜索密集型应用的开发者
  • 以UI为中心的Flutter项目
  • 需要流畅搜索动画的应用
  • 移动应用程序中的大型数据集
  • 前端团队优先考虑用户体验
  • 搜索功能的快速原型设计

使用建议

  • 仅限基本文本搜索(无高级筛选)
  • 无内置的远程 API 支持
  • 需要手动处理数据源逻辑
  • 未针对非常大的数据集进行优化
  • 无内置本地化支持
  • 取决于自定义实现的排序或分组

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

search_app_bar

An animated SearchAppBar Widget, to be used with Flutter.

Usage

Simply use the SearchAppBar widget as a regular AppBar. The only required attribute in the widget is called searcher.

You must implement the Searcher<T> interface in a class of yours (a Bloc, for example), to control a list of data (of type T) and react to the list filtering provided by SearchAppBar.

Here's a simple example of SearchAppBar's usage with bloc:

Scaffold(
  appBar: SearchAppBar<String>(
    searcher: bloc,
  ),
  body: ...
);

Implementing Searcher

When you implement the Searcher interface in your class, you must provide an implementation for both overrides:

class BlocExample implements Searcher<String> {
    ...

    @override
    List<String> get data => ...

    @override
    get onDataFiltered => ...
}

data should simply return your full data list (in this case, a list of Strings), in which you will search for elements.

onDataFiltered expects a function that receives a List<T>. This is the filtered data list, based on what was typed on the SearchAppBar. Use that list as you will. For example, if you are using Bloc, add this filtered list to your data's StreamController.

Complete Example

Here's a complete example of a view using SearchAppBar:

import 'package:flutter/material.dart';
import 'package:search_app_bar/filter.dart';
import 'package:search_app_bar/search_app_bar.dart';

import 'home_bloc.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Search App Bar Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(
        title: 'Search App Bar Demo',
        bloc: HomeBloc(),
      ),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final String title;
  final HomeBloc bloc;

  MyHomePage({
    this.title,
    this.bloc,
  });

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: SearchAppBar<String>(
        title: Text(title),
        searcher: bloc,
        iconTheme: IconThemeData(color: Colors.white),
      ),
      body: StreamBuilder<List<String>>(
        stream: bloc.filteredData,
        builder: (context, snapshot) {
          if (!snapshot.hasData) return Container();
          final list = snapshot.data;
          return ListView.builder(
            itemBuilder: (context, index) {
              return ListTile(
                title: Text(list[index]),
              );
            },
            itemCount: list.length,
          );
        },
      ),
    );
  }
}

Below is an example of a HomeBloc class that implements Searcher: (This example also uses the bloc_pattern library to implement a bloc class)

import 'package:bloc_pattern/bloc_pattern.dart';
import 'package:rxdart/subjects.dart';
import 'package:search_app_bar/searcher.dart';

class HomeBloc extends BlocBase implements Searcher<String> {
  final _filteredData = BehaviorSubject<List<String>>();

  final dataList = [
    'Thaís Fernandes',
    'Vinicius Santos',
    'Gabrielly Costa',
    'Olívia Sousa',
    'Diogo Lima',
    'Lucas Assunção',
    'Conceição Cardoso'
  ];

  Stream<List<String>> get filteredData => _filteredData.stream;

  HomeBloc() {
    _filteredData.add(dataList);
  }

  @override
  get onDataFiltered => _filteredData.add;

  @override
  get data => dataList;

  @override
  void dispose() {
    _filteredData.close();
    super.dispose();
  }
}

Filters

Note how, in our example, we used a data list of type List<String>.

In this specific case, we can omit the filter parameter if we want. It will be implied that we will search for strings in our data list that start with whatever we type on the SearchAppBar.

However, let's say that we need to search for a person's name inside a list of Person:

class Person {
    final String name;
    final String occupation;
    final int age;
    ...
}

In this case, we will need to implement a Searcher<Person> and provide a way for SearchAppBar to filter Person data as we want.

Enter the filter parameter:

SearchAppBar<Person>(
    searcher: bloc,
    filter: (Person person, String query) => Filters.startsWith(person.name, query),
);

Here we are instructing our SearchAppBar to filter only the Person objects whose names start with the typed query on the search bar.

The Filters class is provided with this library and contain the following pre-made String filters: startsWith, equalsand contains.

These filters compare strings unregarding upper/lower case and diacritics.

You can also create your own Filter if you need.

Parameters

Here's a list of all SearchAppBar parameters and what they do:

searcher: You must provide an object that implements Searcher<T> here.

filter: You can provide a customized filter here if needed.

title: The title widget on the app bar.

centerTitle: If true, this centralizes the title widget.

iconTheme: Used to define the colors of IconButtons on the app bar.

backgroundColor: AppBar's Background color.

searchBackgroundColor: The color used as the AppBar's background when the search is active.

searchElementsColor: Mainly used for icons, such as the back arrow button, when the search is active.

hintText: The text shown as a hint when the search is active.

flattenOnSearch: If true, removes the AppBar's elevation when the search is active.

capitalization: The capitalization rule for the search text on the AppBar.

actions: You can provide other IconButton within this array. They will appear besides the search button.

searchButtonPosition: The index that the search button should occupy in the actions array. It defaults to the last position.

Disclaimer

This small library was developed (and later, improved) based on the excellent tutorial provided by Nishant Desai at: https://blog.usejournal.com/change-app-bar-in-flutter-with-animation-cfffb3413e8a

All due credit goes to him :)

所属分类

依赖

依赖清单 3 项

源码仓库

使用此插件的项目

暂无相关数据。