Flutter底部搜索栏插件bottom_sheet_search的使用

Flutter底部搜索栏插件bottom_sheet_search的使用

Bottom Sheet Search 演示

Bottom Sheet Search Demo

目录

简介

Bottom Sheet Search 是一个功能强大的 Flutter 包,提供高度可定制的底部搜索栏小部件。该小部件受 Arc 浏览器优雅设计的启发,无缝地将搜索功能集成到您的应用界面中,为用户提供直观且高效的搜索体验。

特性

  • 可定制的外观:可以调整颜色、文本样式、内边距等以匹配您的应用主题。
  • 动态搜索:用户输入查询时实时过滤项目。
  • 自动完成支持:根据用户输入提供建议的相关项目,增强搜索体验。
  • 语义化访问:通过语义标签改善无障碍性,提升用户体验。
  • 灵活布局:通过调整边距和内边距轻松集成到现有 UI 中。
  • 后缀图标:在搜索栏中添加自定义图标以实现额外功能,如筛选或语音搜索。
  • 平滑动画:交互时享受流畅的过渡和动画效果。

安装

要在您的 Flutter 项目中添加 bottom_sheet_search,请将其包含在您的 pubspec.yaml 文件中:

dependencies:
  bottom_sheet_search: ^1.0.0

然后运行以下命令以获取包:

flutter pub get

开始使用

基本用法

以下是一个 BottomSheetSearchWidget 的基本实现示例:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:bottom_sheet_search/bottom_sheet_search.dart';

/// 使用 Consumer 实现 BottomSheetSearchWidget 示例。
///
/// 展示如何在 Flutter 应用程序中集成 BottomSheetSearchWidget,并利用 Provider 包进行状态管理。
class UserSearchPage extends StatelessWidget {
  /// 创建一个 UserSearchPage 小部件。
  const UserSearchPage({super.key});

  /// 处理从搜索结果中选择用户的逻辑。
  void _handleUserSelection(BuildContext context, User selectedUser) {
    // 在此处实现您的选择逻辑。
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(content: Text('Selected user: ${selectedUser.name}')),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('User Search'),
      ),
      body: Consumer<UserProvider>(
        builder: (context, userProvider, child) {
          return BottomSheetSearchWidget<User>(
            items: userProvider.users,
            searchableText: (user) => user.name,
            onItemSelected: (user) => _handleUserSelection(context, user),
            itemBuilder: (context, user) {
              return ListTile(
                title: Text(user.name),
                subtitle: Text(user.email),
              );
            },
            decoration: const BottomSheetDecoration(
              backgroundColor: Colors.white,
              searchBarColor: Colors.grey,
              borderRadius: BorderRadius.only(
                topLeft: Radius.circular(24),
                topRight: Radius.circular(24),
              ),
            ),
            suffixIcons: [
              IconButton(
                icon: const Icon(Icons.filter_list),
                onPressed: () {
                  // 在此处实现筛选功能。
                },
              ),
            ],
            autoCompleteBuilder: (context, suggestion) {
              return ListTile(
                title: Text(suggestion.name),
              );
            },
          );
        },
      ),
    );
  }
}

/// 一个简单的用户模型。
class User {
  /// 用户名称。
  final String name;

  /// 用户电子邮件。
  final String email;

  /// 创建一个 User 实例。
  User({required this.name, required this.email});
}

/// 用于管理用户数据的 Provider。
class UserProvider with ChangeNotifier {
  /// 用户列表。
  final List<User> _users = [
    User(name: 'Alice', email: 'alice@example.com'),
    User(name: 'Bob', email: 'bob@example.com'),
    // 添加更多用户。
  ];

  /// 公开用户列表。
  List<User> get users => _users;

  // 如果需要,添加修改用户列表的方法。
}

高级定制

通过自定义装饰和添加更多功能来增强 BottomSheetSearchWidget

import 'package:flutter/material.dart';
import 'package:bottom_sheet_search/bottom_sheet_search.dart';

/// 为 BottomSheetSearchWidget 自定义装饰。
const BottomSheetDecoration customDecoration = BottomSheetDecoration(
  backgroundColor: Colors.blueAccent,
  searchBarColor: Colors.white,
  borderRadius: BorderRadius.only(
    topLeft: Radius.circular(16),
    topRight: Radius.circular(16),
  ),
  borderColor: Colors.blue,
  borderWidth: 2.0,
  contentPadding: EdgeInsets.all(20),
  searchBarPadding: EdgeInsets.symmetric(horizontal: 20, vertical: 10),
  cursorColor: Colors.blueAccent,
  searchTextStyle: TextStyle(color: Colors.black, fontSize: 18),
  hintTextStyle: TextStyle(color: Colors.grey, fontSize: 16),
);

API 参考

BottomSheetSearchWidget<T>

一个通用的小部件,显示具有集成搜索功能的底部栏。

参数

  • items (List<T>): 要显示和搜索的项目列表。
  • searchableText (String Function(T)): 返回每个项目中要搜索的文本的函数。
  • onItemSelected (void Function(T)): 项目被选中时触发的回调。
  • itemBuilder (Widget Function(BuildContext, T)): 列表中每个项目的构建函数。
  • decoration (BottomSheetDecoration): 自定义底部栏和搜索栏的外观。
  • suffixIcons (List<Widget>): 显示在搜索栏中的后缀图标列表。
  • autoCompleteBuilder (Widget Function(BuildContext, T)): 自动完成建议的构建函数。

BottomSheetDecoration

定义 BottomSheetSearchWidget 的视觉样式。

属性

  • backgroundColor (Color): 底部栏的背景色。
  • searchBarColor (Color): 搜索栏的背景色。
  • borderRadius (BorderRadius): 底部栏的边框半径。
  • borderColor (Color): 底部栏周围边框的颜色。
  • borderWidth (double): 底部栏周围边框的宽度。
  • contentPadding (EdgeInsets): 底部栏内容区域内的填充。
  • searchBarPadding (EdgeInsets): 搜索栏内的填充。
  • cursorColor (Color): 搜索栏中光标的颜色。
  • searchTextStyle (TextStyle): 搜索输入的文本样式。
  • hintTextStyle (TextStyle): 搜索栏中提示文本的样式。

定制

添加后缀图标

通过向搜索栏添加自定义后缀图标来增强搜索栏的功能。

import 'package:flutter/material.dart';
import 'package:bottom_sheet_search/bottom_sheet_search.dart';

/// 向搜索栏添加后缀图标的示例。
List<Widget> suffixIcons = [
  IconButton(
    icon: const Icon(Icons.filter_list),
    onPressed: () {
      // 在此处实现筛选功能。
    },
  ),
  IconButton(
    icon: const Icon(Icons.mic),
    onPressed: () {
      // 在此处实现语音搜索功能。
    },
  ),
];

主题与样式

通过自定义底部栏和搜索栏的外观来匹配您的应用主题。

import 'package:flutter/material.dart';
import 'package:bottom_sheet_search/bottom_sheet_search.dart';

/// 为 BottomSheetSearchWidget 自定义主题。
const BottomSheetDecoration themedDecoration = BottomSheetDecoration(
  backgroundColor: Colors.deepPurple,
  searchBarColor: Colors.white,
  borderRadius: BorderRadius.only(
    topLeft: Radius.circular(20),
    topRight: Radius.circular(20),
  ),
  borderColor: Colors.deepPurpleAccent,
  borderWidth: 1.5,
  contentPadding: EdgeInsets.all(16),
  searchBarPadding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
  cursorColor: Colors.deepPurple,
  searchTextStyle: TextStyle(color: Colors.black87, fontSize: 16),
  hintTextStyle: TextStyle(color: Colors.black54, fontSize: 14),
);

示例

要查看 BottomSheetSearchWidget 的实际效果,请运行示例提供的 main.dart 文件:

flutter run example/lib/main.dart

确保通过导航到 example 目录并运行以下命令来获取必要的依赖项:

flutter pub get

贡献

欢迎贡献!要为 Bottom Sheet Search 做出贡献,请遵循以下步骤:

  1. 克隆您的分支:点击存储库页面右上角的“Fork”按钮。
  2. 克隆您的分支
    git clone https://github.com/hberkayozdemir/bottom_sheet_search.git
    
  3. 创建新分支 以实现您的功能或修复错误:
    git checkout -b feature/your-feature-name
    
  4. 做出更改:实现您的功能或修复错误。
  5. 提交您的更改,并附带清晰且描述性的消息:
    git commit -m "添加功能 X"
    
  6. 推送至您的分支
    git push origin feature/your-feature-name
    

更多关于Flutter底部搜索栏插件bottom_sheet_search的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,以下是如何在Flutter应用中使用bottom_sheet_search插件的一个简单示例。bottom_sheet_search插件允许你轻松地在应用中实现一个底部搜索栏。

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

dependencies:
  flutter:
    sdk: flutter
  bottom_sheet_search: ^2.0.0  # 请检查最新版本号

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

接下来,是一个完整的示例代码,展示如何在你的Flutter应用中使用bottom_sheet_search插件:

import 'package:flutter/material.dart';
import 'package:bottom_sheet_search/bottom_sheet_search.dart';

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final List<String> items = List<String>.generate(100, (i) => "Item $i");
  String? searchResult;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Bottom Sheet Search Demo'),
      ),
      body: Center(
        child: searchResult != null
            ? Text(
                'Selected: $searchResult',
                style: TextStyle(fontSize: 24),
              )
            : Text(
                'Search for an item',
                style: TextStyle(fontSize: 24),
              ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          showSearchBottomSheet(
            context: context,
            title: 'Search Items',
            searchHint: 'Search...',
            onSearch: (String query) {
              if (query.isNotEmpty) {
                setState(() {
                  searchResult = items.firstWhere(
                    (item) => item.toLowerCase().contains(query.toLowerCase()),
                    orElse: () => null,
                  );
                });
              } else {
                setState(() {
                  searchResult = null;
                });
              }
            },
            onClear: () {
              setState(() {
                searchResult = null;
              });
            },
            itemBuilder: (context, query) {
              return items
                  .where((item) =>
                      item.toLowerCase().contains(query.toLowerCase()))
                  .map(
                    (item) => SearchItem(
                      title: item,
                    ),
                  )
                  .toList();
            },
          );
        },
        tooltip: 'Search',
        child: Icon(Icons.search),
      ),
    );
  }
}

在这个示例中:

  1. 我们首先定义了一个包含100个项目的列表items
  2. searchResult变量用于存储搜索结果。
  3. build方法中,我们创建了一个简单的界面,显示当前搜索结果(如果有的话)。
  4. floatingActionButton用于触发底部搜索栏。当用户点击浮动按钮时,showSearchBottomSheet函数被调用,显示搜索底部表单。
  5. onSearch回调用于处理用户的搜索输入,并更新searchResult状态。
  6. itemBuilder回调用于根据用户的搜索查询生成搜索项目列表。

这个示例提供了一个基本的框架,你可以根据需要进行扩展和自定义,例如添加更多复杂的搜索逻辑、处理搜索结果点击事件等。

回到顶部