Flutter搜索功能插件simple_search的使用
Flutter搜索功能插件simple_search的使用
简介
simple_search
插件提供了简单的搜索功能,并且使用了 infinite_scroll_pagination
库来分页和展示数据。
使用方法
-
添加依赖
在你的
pubspec.yaml
文件中添加以下依赖:dependencies: infinite_scroll_pagination: any simple_search: any
-
导入库
在 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
更多关于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']),
),
),
),
],
),
),
);
}
}
在这个示例中:
- 我们首先创建了一些示例数据,这些数据存储在一个
List<Map<String, String>>
中。 - 使用
TextEditingController
来管理搜索输入框中的文本。 - 初始化了一个
SimpleSearch<Map<String, String>>
对象,并传入示例数据。 - 在
TextField
的onChanged
回调中,每当用户输入文本时,就会调用search.search(value)
方法来根据输入的文本过滤数据。 - 使用
search.buildResults
方法来构建搜索结果列表,并为每个搜索结果项提供了一个简单的ListTile
。
这样,你就可以在Flutter应用中实现一个基本的搜索功能了。希望这个示例对你有帮助!