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]),
              );
            },
          ),
        ),
      ],
    ),
  );
}
回到顶部