Flutter搜索栏插件flappy_search_bar_ns的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter搜索栏插件flappy_search_bar_ns的使用

插件介绍

flappy_search_bar_ns 是一个处理大多数搜索情况的SearchBar小部件,目前由Abdirahman Baabale维护。

使用方法

要在您的项目中使用此插件,请在 pubspec.yaml 文件中添加 flappy_search_bar_ns 作为依赖项。

示例代码

以下是一个完整的示例演示如何使用 flappy_search_bar_ns 插件:

import 'dart:math';
import 'package:flappy_search_bar_ns/flappy_search_bar_ns.dart';
import 'package:flappy_search_bar_ns/scaled_tile.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  // 这个小部件是应用程序的根。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Home(),
    );
  }
}

// 定义Post类
class Post {
  final String title;
  final String body;

  Post(this.title, this.body);
}

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

class _HomeState extends State<Home> {
  final SearchBarController<Post> _searchBarController = SearchBarController();
  bool isReplay = false;

  // 模拟获取帖子列表
  Future<List<Post>> _getALlPosts(String? text) async {
    await Future.delayed(Duration(seconds: text!.length == 4 ? 10 : 1));
    if (isReplay) return [Post("Replaying !", "Replaying body")];
    if (text.length == 5) throw Error();
    if (text.length == 6) return [];
    List<Post> posts = [];

    var random = new Random();
    for (int i = 0; i < 10; i++) {
      posts.add(
        Post("$text $i", "body random number : ${random.nextInt(100)}"),
      );
    }
    return posts;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: SearchBar<Post>(
          searchBarPadding: EdgeInsets.symmetric(horizontal: 10), // 设置搜索栏的填充
          headerPadding: EdgeInsets.symmetric(horizontal: 10), // 设置头部的填充
          listPadding: EdgeInsets.symmetric(horizontal: 10), // 设置列表的填充
          onSearch: _getALlPosts, // 回调函数,用于获取搜索结果
          searchBarController: _searchBarController, // 控制器,用于排序和过滤
          onError: (error) => Text('ERROR: ${error.toString()}'), // 错误回调
          placeHolder: Text("placeholder"), // 占位符文本
          cancellationWidget: Text("Cancel"), // 取消按钮文本
          emptyWidget: Text("empty"), // 空结果时显示的文本
          indexedScaledTileBuilder: (int index) =>
              ScaledTile.count(1, index.isEven ? 2 : 1), // 设置每个项目的大小
          header: Row(
            children: <Widget>[
              TextButton(
                child: Text("sort"), // 排序按钮
                onPressed: () {
                  _searchBarController.sortList((Post a, Post b) {
                    return a.body.compareTo(b.body); // 根据body字段进行排序
                  });
                },
              ),
              TextButton(
                child: Text("Desort"), // 取消排序按钮
                onPressed: () {
                  _searchBarController.removeSort(); // 移除排序
                },
              ),
              TextButton(
                child: Text("Replay"), // 重放按钮
                onPressed: () {
                  isReplay = !isReplay;
                  _searchBarController.replayLastSearch(); // 重新执行上次搜索
                },
              ),
            ],
          ),
          onCancelled: () {
            print("Cancelled triggered"); // 取消操作触发的回调
          },
          mainAxisSpacing: 10, // 主轴间距
          crossAxisSpacing: 10, // 交叉轴间距
          crossAxisCount: 2, // 交叉轴数量
          onItemFound: (Post? post, int index) { // 回调函数,用于构建每个搜索结果的小部件
            return Container(
              color: Colors.lightBlue,
              child: ListTile(
                title: Text(post!.title), // 显示标题
                isThreeLine: true, // 是否为三行文本
                subtitle: Text(post.body), // 显示副标题
                onTap: () {
                  Navigator.of(context).push(MaterialPageRoute(builder: (context) => Detail())); // 跳转到详情页面
                },
              ),
            );
          },
        ),
      ),
    );
  }
}

class Detail extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Column(
          children: <Widget>[
            IconButton(
              icon: Icon(Icons.arrow_back), // 返回按钮
              onPressed: () => Navigator.of(context).pop(), // 返回上一页
            ),
            Text("Detail"), // 显示详细信息
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中集成和使用flappy_search_bar_ns插件的示例代码。这个插件提供了一个高度可定制的搜索栏,适用于多种场景。

步骤1:添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flappy_search_bar_ns: ^最新版本号  # 请替换为实际最新版本号

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

步骤2:导入插件

在你的Dart文件中导入插件:

import 'package:flappy_search_bar_ns/flappy_search_bar.dart';

步骤3:使用FlappySearchBar

下面是一个简单的示例,展示如何在你的Flutter应用中使用FlappySearchBar

import 'package:flutter/material.dart';
import 'package:flappy_search_bar_ns/flappy_search_bar.dart';

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  final List<String> suggestions = List.generate(20, (i) => "Suggestion $i");
  final List<String> filteredSuggestions = [];
  String searchQuery = "";

  void _filterSuggestions(String query) {
    setState(() {
      searchQuery = query;
      filteredSuggestions.clear();
      if (query.isNotEmpty) {
        filteredSuggestions.addAll(suggestions.where((p) {
          var lowerCaseQuery = query.toLowerCase();
          return p.toLowerCase().contains(lowerCaseQuery);
        }).toList());
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('FlappySearchBar Demo'),
      ),
      body: Column(
        children: [
          FlappySearchBar(
            placeholder: "Search...",
            onChanged: _filterSuggestions,
            onSubmitted: (query) {
              // Handle search submission
              print("Search submitted: $query");
            },
            suggestions: filteredSuggestions,
            builder: (context, state) {
              return Column(
                children: state.suggestions.map((suggestion) {
                  return ListTile(
                    leading: Icon(Icons.search),
                    title: Text(suggestion),
                    onTap: () {
                      state.close();
                      // Handle suggestion tap
                      print("Suggestion tapped: $suggestion");
                    },
                  );
                }).toList(),
              );
            },
          ),
          Expanded(
            child: ListView.builder(
              itemCount: filteredSuggestions.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(filteredSuggestions[index]),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

解释

  1. 依赖导入:确保在pubspec.yaml中添加了flappy_search_bar_ns依赖。
  2. 状态管理:在_MyHomePageState中管理搜索查询和过滤后的建议列表。
  3. FlappySearchBar
    • placeholder:搜索栏的占位符文本。
    • onChanged:当搜索查询更改时调用的回调。
    • onSubmitted:当搜索查询提交时调用的回调。
    • suggestions:传递给搜索栏的建议列表。
    • builder:用于构建建议列表的Widget。

注意事项

  • 确保你已经正确安装并配置了Flutter开发环境。
  • 根据你的需求,你可以进一步自定义FlappySearchBar的样式和行为。
  • 请查阅flappy_search_bar_ns的官方文档以获取更多详细信息和高级用法。
回到顶部