Flutter搜索栏插件forking_search_bar的使用

Flutter搜索栏插件forking_search_bar的使用

变更

  • 更新了依赖项
  • 使其能够在新版本的Flutter中编译

预览

默认AppBar预览 浮动AppBar预览

安装

在你的Flutter项目的pubspec.yaml文件中,添加以下依赖:

dependencies:
  ...
  forking_search_bar: ^3.0.0

基本示例与建议

你可以通过以下示例创建一个带有建议的简单搜索栏示例小部件:

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

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

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key}) : super(key: key);

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

class _MyHomePageState extends State<MyHomePage> {
  String searchValue = '';
  final List<String> _suggestions = [
    'Afeganistan',
    'Albania',
    'Algeria',
    'Australia',
    'Brazil',
    'German',
    'Madagascar',
    'Mozambique',
    'Portugal',
    'Zambia'
  ];

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Example',
      theme: ThemeData(
        primarySwatch: Colors.orange
      ),
      home: Scaffold(
        appBar: ForkingSearchBar(
          title: const Text('Example'),
          onSearch: (value) => setState(() => searchValue = value),
          suggestions: _suggestions
        ),
        drawer: Drawer(
          child: ListView(
            padding: EdgeInsets.zero,
            children: [
              const DrawerHeader(
                decoration: BoxDecoration(
                  color: Colors.blue,
                ),
                child: Text('Drawer Header'),
              ),
              ListTile(
                title: const Text('Item 1'),
                onTap: () => Navigator.pop(context)
              ),
              ListTile(
                title: const Text('Item 2'),
                onTap: () => Navigator.pop(context)
              )
            ]
          )
        ),
        body: Center(
          child: Text('Value: $searchValue')
        )
      )
    );
  }
}

注意: 如果你想创建一个浮动AppBar,并且希望body内容在AppBar后面,你需要将Scaffold属性extendBodyBehindAppBar设置为true。并且建议将Scaffold包裹在一个SafeArea内。

API

属性 类型 必填 描述 默认值
title Widget ✔️ 在AppBar内部显示的标题
onSearch Function(String) ✔️ 返回当前搜索值。当搜索关闭时,此方法返回空值以清除当前搜索
actions List<Widget> ❌ 可以显示在AppBar内的额外自定义操作
leading Widget ❌ 可用于向AppBar添加前导图标
backgroundColor Color ❌ 可用于更改AppBar背景颜色
foregroundColor Color ❌ 可用于更改AppBar前景色
elevation double ❌ 可用于更改AppBar的阴影高度 5
iconTheme IconThemeData ❌ 可用于设置AppBar图标的自定义图标主题
appBarHeight double ❌ 可用于更改AppBar的高度 56
animationDuration Duration ❌ 可用于设置AppBar搜索显示和隐藏动画的持续时间 Duration(milliseconds: 450)
isFloating bool ❌ 可用于确定它是普通AppBar还是浮动AppBar false
openOverlayOnSearch bool ❌ 可用于确定点击搜索时是否打开建议覆盖层 false
titleTextStyle TextStyle ❌ 可用于设置AppBar标题样式
searchBackgroundColor Color ❌ 可用于设置搜索输入框的背景颜色
searchCursorColor Color ❌ 可用于设置搜索文本框光标颜色
searchHintText String ❌ 可用于设置搜索文本框提示文本
searchHintStyle TextStyle ❌ 可用于设置搜索文本框提示样式
searchTextStyle TextStyle ❌ 可用于设置搜索文本框文本样式
searchTextKeyboardType KeyboardType ❌ 可用于设置搜索文本框键盘类型
searchBackIconTheme IconThemeData ❌ 可用于设置搜索文本框后退按钮的自定义图标主题
systemOverlayStyle SystemUiOverlayStyle ❌ 可用于设置AppBar的SystemUiOverlayStyle
suggestions List<String> ❌ 可用于创建建议列表
asyncSuggestions Future<List<String>> Function(String value) ❌ 可用于设置异步建议列表
suggestionsElevation double ❌ 可用于更改建议列表的阴影高度 5
suggestionLoaderBuilder Widget Function() ❌ 可用于创建自定义建议加载器的widget
suggestionTextStyle TextStyle ❌ 可用于更改建议文本样式
suggestionBackgroundColor Color ❌ 可用于更改建议列表背景颜色
suggestionBuilder Widget Function(String data) ❌ 可用于创建自定义建议项widget
onSuggestionTap Function(String data) ❌ 可用于设置点击建议项的自定义动作(而不是默认填充文本框)
debounceDuration Duration ❌ 可用于设置异步数据获取的去抖时间 Duration(milliseconds: 400)
showClearSearchIcon bool ❌ 可用于显示搜索文本框清除按钮 false
searchClearIconTheme IconThemeData ❌ 可用于设置搜索文本框清除按钮的自定义图标主题
searchTextDirection TextDirection ❌ 可用于更改文本方向 TextDirection.ltr
putActionsOnRight bool ❌ 可用于确定动作按钮是否放置在AppBar右侧 false
cancelableSuggestions bool ❌ 可用于允许用户通过按ESC或移动设备上的后退键取消建议覆盖层 false

问题与建议

如果你遇到任何问题或有任何建议,可以通过提交问题来反馈。

贡献者

以下是我们的优秀贡献者名单:

  • Seiji Tanaka
  • Victor Gabriel
  • Ivan Terekhin
  • Dolev Franco
  • Esaias Westberg (forked)

感谢支持!


完整示例

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

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

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key}) : super(key: key);

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

class _MyHomePageState extends State<MyHomePage> {
  String searchValue = '';
  final List<String> _suggestions = [
    'Afeganistan',
    'Albania',
    'Algeria',
    'Australia',
    'Brazil',
    'German',
    'Madagascar',
    'Mozambique',
    'Portugal',
    'Zambia'
  ];

  Future<List<String>> _fetchSuggestions(String searchValue) async {
    await Future.delayed(const Duration(milliseconds: 750));

    return _suggestions.where((element) {
      return element.toLowerCase().contains(searchValue.toLowerCase());
    }).toList();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Example',
      theme: ThemeData(
        primarySwatch: Colors.orange
      ),
      home: Scaffold(
        appBar: ForkingSearchBar(
          title: const Text('Example'),
          onSearch: (value) => setState(() => searchValue = value),
          actions: [
            IconButton(icon: const Icon(Icons.person), onPressed: () {})
          ],
          asyncSuggestions: (value) async => await _fetchSuggestions(value),
        ),
        drawer: Drawer(
          child: ListView(
            padding: EdgeInsets.zero,
            children: [
              const DrawerHeader(
                decoration: BoxDecoration(
                  color: Colors.blue,
                ),
                child: Text('Drawer Header'),
              ),
              ListTile(
                title: const Text('Item 1'),
                onTap: () => Navigator.pop(context)
              ),
              ListTile(
                title: const Text('Item 2'),
                onTap: () => Navigator.pop(context)
              )
            ]
          )
        ),
        body: Center(
          child: Text('Value: $searchValue')
        )
      )
    );
  }
}

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

1 回复

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


forking_search_bar 是一个用于 Flutter 的搜索栏插件,它提供了一个可定制的搜索栏组件,允许用户输入搜索查询并触发搜索操作。以下是如何在 Flutter 项目中使用 forking_search_bar 的基本步骤。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  forking_search_bar: ^1.0.0  # 请检查最新版本

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

2. 导入包

在你的 Dart 文件中导入 forking_search_bar:

import 'package:forking_search_bar/forking_search_bar.dart';

3. 使用 ForkingSearchBar

ForkingSearchBar 可以像其他 Flutter 组件一样使用。以下是一个简单的示例:

class SearchPage extends StatefulWidget {
  [@override](/user/override)
  _SearchPageState createState() => _SearchPageState();
}

class _SearchPageState extends State<SearchPage> {
  String _searchQuery = '';

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Search Example'),
      ),
      body: Column(
        children: [
          ForkingSearchBar(
            onChanged: (query) {
              setState(() {
                _searchQuery = query;
              });
            },
            onSubmitted: (query) {
              // 处理搜索提交
              print('Search submitted: $query');
            },
            hintText: 'Search...',
          ),
          Expanded(
            child: ListView.builder(
              itemCount: 10, // 假设有10个搜索结果
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text('Result $index'),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

4. 自定义 ForkingSearchBar

ForkingSearchBar 提供了多个可定制的属性,例如:

  • hintText: 搜索栏的提示文本。
  • onChanged: 当用户输入时触发的回调。
  • onSubmitted: 当用户提交搜索时触发的回调。
  • decoration: 自定义搜索栏的外观。
ForkingSearchBar(
  hintText: 'Search for something...',
  onChanged: (query) {
    setState(() {
      _searchQuery = query;
    });
  },
  onSubmitted: (query) {
    print('Search submitted: $query');
  },
  decoration: InputDecoration(
    border: OutlineInputBorder(
      borderRadius: BorderRadius.circular(8.0),
    ),
    filled: true,
    fillColor: Colors.grey[200],
    prefixIcon: Icon(Icons.search),
  ),
)

5. 处理搜索逻辑

你可以根据 _searchQuery 的状态来过滤或显示搜索结果。例如:

List<String> _searchResults = [];

void _performSearch(String query) {
  setState(() {
    _searchResults = _allItems.where((item) => item.contains(query)).toList();
  });
}

[@override](/user/override)
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text('Search Example'),
    ),
    body: Column(
      children: [
        ForkingSearchBar(
          onChanged: (query) {
            _performSearch(query);
          },
          onSubmitted: (query) {
            _performSearch(query);
          },
          hintText: 'Search...',
        ),
        Expanded(
          child: ListView.builder(
            itemCount: _searchResults.length,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text(_searchResults[index]),
              );
            },
          ),
        ),
      ],
    ),
  );
}
回到顶部