Flutter搜索功能插件simple_search的使用

Flutter搜索功能插件simple_search的使用

简介

simple_search 插件提供了简单的搜索功能,并且使用了 infinite_scroll_pagination 库来分页和展示数据。

使用方法

  1. 添加依赖

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

    dependencies:
      infinite_scroll_pagination: any
      simple_search: any
    
  2. 导入库

    在 Dart 文件中导入 simple_search 库:

    import 'package:simple_search/simple_search.dart';
    

基本用法

SimpleSearch 组件依赖于 infinite_scroll_pagination 库中的 PagedSliverList

SimpleSearch<int, Person>(
  pagedSliverList: PagedSliverList(
    pagingController: _pagingController,
    builderDelegate: PagedChildBuilderDelegate(
      animateTransitions: true,
      itemBuilder: (context, item, index) => ListTile(
        title: Text(item.name),
      ),
    ),
  ),
  searchBar: SimpleSearchBar(
    searchBarElevation: 3.0,
    padding: EdgeInsets.all(24),
    leading: IconButton(
      onPressed: () {
        Navigator.of(context).pop();
      },
      icon: Icon(Icons.close),
    ),
    topLeading: true,
    title: Padding(
      padding: const EdgeInsets.all(8.0),
      child: Text(
        'Find a pokemon or people',
        style: Theme.of(context)
            .textTheme
            .titleMedium
            ?.copyWith(fontWeight: FontWeight.w500),
      ),
    ),
    clearAction: Icon(Icons.delete),
    textFieldDecoration: BoxDecoration(
        color: Colors.white, borderRadius: BorderRadius.circular(8)),
    inputDecoration: InputDecoration(
      prefixIcon: Icon(Icons.search),
      border: InputBorder.none,
    ),
    onChangeSearch: (text) {
      // 不进行搜索如果文本没有变化
      if (text != _searchTerm) {
        _searchTerm = text;
        _pagingController.refresh();
      }
    },
    searchTermValidator: (value) {
      if (value != null && value.length < 3) {
        return false;
      }
      return true;
    },
  ),
),

持久化搜索栏

你也可以将搜索栏固定在顶部或其他位置。

SimpleSearch<int, Person>.persistent(
  pinnedSearchBar: true,
  floatingSearchBar: false,
  persistentSearchBar: SimpleSearchBar(
    searchBarElevation: 8.0,
    leading: IconButton(
      onPressed: () {
        Navigator.of(context).pop();
      },
      icon: Icon(Icons.arrow_back),
    ),
    clearAction: Icon(Icons.clear),
    textFieldDecoration: BoxDecoration(
        color: Colors.white, borderRadius: BorderRadius.circular(8)),
    onChangeSearch: (text) {
      _searchTerm = text;
      _pagingController.refresh();
    },
    searchTermValidator: (value) {
      if (value != null && value.length < 3) {
        return false;
      }
      return true;
    },
  ),
  pagedSliverList: PagedSliverList(
    pagingController: _pagingController,
    builderDelegate: PagedChildBuilderDelegate(
      animateTransitions: true,
      itemBuilder: (context, item, index) => ListTile(
        title: Text(item.name),
      ),
    ),
  ),
),

圆角搜索栏

你可以为搜索栏设置圆角。

SimpleSearchBar.google(
  leading: IconButton(
    onPressed: () {
      Navigator.of(context).pop();
    },
    ...
)

完整示例

以下是一个完整的示例代码,展示了如何使用 simple_search 插件。

import 'package:flutter/material.dart';
import 'package:sample/seach_persist.dart';
import 'package:sample/search_normal.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomePage(title: 'Simple Search Sample'),
    );
  }
}

class HomePage extends StatelessWidget {
  final String title;
  const HomePage({Key? key, required this.title}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () {
                Navigator.of(context).push(
                  MaterialPageRoute<void>(
                    builder: (BuildContext context) => SearchDemoNormal(),
                  ),
                );
              },
              child: Text('Demo normal'),
            ),
            SizedBox.fromSize(
              size: Size.fromRadius(8),
            ),
            ElevatedButton(
              onPressed: () {
                Navigator.of(context).push(
                  MaterialPageRoute<void>(
                    builder: (BuildContext context) => SearchDemoPersist(),
                  ),
                );
              },
              child: Text('Demo persist'),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用simple_search插件来实现搜索功能的代码示例。simple_search插件提供了一个简单的方法来在Flutter应用中实现搜索功能。

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

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

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

接下来,是一个简单的示例,展示如何使用simple_search插件。

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  // 示例数据
  final List<Map<String, String>> items = [
    {'id': '1', 'name': 'Apple'},
    {'id': '2', 'name': 'Banana'},
    {'id': '3', 'name': 'Cherry'},
    {'id': '4', 'name': 'Date'},
    {'id': '5', 'name': 'Elderberry'},
  ];

  // 搜索控制器
  final TextEditingController searchController = TextEditingController();

  // SimpleSearch 对象
  late SimpleSearch<Map<String, String>> search;

  @override
  void initState() {
    super.initState();
    // 初始化搜索对象
    search = SimpleSearch<Map<String, String>>(items);
  }

  @override
  void dispose() {
    searchController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Simple Search Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TextField(
              controller: searchController,
              decoration: InputDecoration(
                prefixIcon: Icon(Icons.search),
                hintText: 'Search...',
                border: OutlineInputBorder(),
              ),
              onChanged: (value) {
                // 根据搜索词过滤数据
                setState(() {
                  search.search(value);
                });
              },
            ),
            SizedBox(height: 16),
            Expanded(
              child: search.buildResults(
                (item) => ListTile(
                  title: Text(item['name']),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们首先创建了一些示例数据,这些数据存储在一个List<Map<String, String>>中。
  2. 使用TextEditingController来管理搜索输入框中的文本。
  3. 初始化了一个SimpleSearch<Map<String, String>>对象,并传入示例数据。
  4. TextFieldonChanged回调中,每当用户输入文本时,就会调用search.search(value)方法来根据输入的文本过滤数据。
  5. 使用search.buildResults方法来构建搜索结果列表,并为每个搜索结果项提供了一个简单的ListTile

这样,你就可以在Flutter应用中实现一个基本的搜索功能了。希望这个示例对你有帮助!

回到顶部