Flutter搜索栏插件flappy_search_bar_ns的使用
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]),
);
},
),
),
],
),
);
}
}
解释
- 依赖导入:确保在
pubspec.yaml
中添加了flappy_search_bar_ns
依赖。 - 状态管理:在
_MyHomePageState
中管理搜索查询和过滤后的建议列表。 - FlappySearchBar:
placeholder
:搜索栏的占位符文本。onChanged
:当搜索查询更改时调用的回调。onSubmitted
:当搜索查询提交时调用的回调。suggestions
:传递给搜索栏的建议列表。builder
:用于构建建议列表的Widget。
注意事项
- 确保你已经正确安装并配置了Flutter开发环境。
- 根据你的需求,你可以进一步自定义
FlappySearchBar
的样式和行为。 - 请查阅flappy_search_bar_ns的官方文档以获取更多详细信息和高级用法。