Flutter搜索功能插件ruki_search的使用
Flutter搜索功能插件ruki_search的使用
特性
- ISearchable:确保实现
ISearchable
类。搜索页面允许对已实现此接口的任何模型进行搜索。 - 搜索按钮:可以使用
SearchPage.SearchBarButton
作为触发搜索页面的按钮,或者直接实现搜索页面。 - 懒加载和分页:支持懒加载和分页功能。
- 直接异步数据获取:在搜索时直接获取异步数据。
开始使用
- 添加依赖:
dart pub add ruki_search
- 在你的模型上实现
ISearchable
接口。
使用示例
搜索页面示例
class Test implements ISearchable {
String name;
Test({required this.name});
[@override](/user/override)
Map<String, dynamic> data() {
return {
'name': name,
};
}
[@override](/user/override)
String searchId() {
return name;
}
}
主页面示例
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
Future<List<ISearchable>> _httpPunkApi({dynamic offset, limit = 5}) async {
print("Fetching data: https://api.punkapi.com/v2/beers?page=${offset ?? 1}&per_page=${limit}");
final response = await http.get(Uri.parse(
'https://api.punkapi.com/v2/beers?page=${offset ?? 1}&per_page=${limit}'));
print(response.statusCode);
if (response.statusCode == 200) {
final decoded = jsonDecode(response.body);
final List<Beer> beers = (decoded as List).map((e) {
return Beer.fromJson(e);
}).toList();
return beers;
} else {
throw Exception('Failed to load beers');
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: DefaultTabController(
length: 3,
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
const TabBar(
tabs: [
Tab(icon: Text("Search Page")),
Tab(icon: Text("Search Page Lazy")),
],
),
Expanded(
child: TabBarView(
children: [
Align(
alignment: Alignment.topCenter,
child: Padding(
child: _buildSearchByPage(),
padding: const EdgeInsets.all(12.0),
),
),
Align(
alignment: Alignment.topCenter,
child: Padding(
child: _buildSearchpageWithPagination(),
padding: const EdgeInsets.all(12.0),
),
)
],
),
),
],
),
),
);
}
_buildSearchpageWithPagination() {
return SearchPage.searchBarButton(context,
placeholder: "Search by name",
enableLazyLoading: true,
paginateByPageNumber: true,
enableLoadMoreScroll: false,
liveSearch: true,
showExit: false,
lazyRequest: (query, page) {
return _httpPunkApi(offset: page, limit: 5);
},
resultBuilder: (result) {
final modelData = result as Beer;
return Container(
child: ListTile(
leading: const Icon(Icons.wine_bar_rounded),
title: Text(modelData.name ?? ""),
),
);
});
}
_buildSearchByPage() {
return SearchPage.searchBarButton(context,
placeholder: "Search by name",
enableLazyLoading: false,
showExit: false,
request: (query) {
return Future.value([
Test(name: "Ruki"),
Test(name: "Ruki2"),
Test(name: "Ruki3"),
Test(name: "Ruki4"),
Test(name: "Ruki5"),
Test(name: "Ruki6")
]
.where((element) =>
element.name.toLowerCase().contains(query.toLowerCase()))
.toList());
},
resultBuilder: (result) {
final modelData = result as Test;
return Container(
color: Colors.red,
child: ListTile(
title: Text(modelData.name),
),
);
});
}
}
更多关于Flutter搜索功能插件ruki_search的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter搜索功能插件ruki_search的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
ruki_search
是一个用于 Flutter 的搜索功能插件,它提供了简单易用的接口来实现搜索功能。通过 ruki_search
,你可以轻松地为你的应用添加搜索功能,支持多种自定义选项。以下是如何使用 ruki_search
插件的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 ruki_search
插件的依赖:
dependencies:
flutter:
sdk: flutter
ruki_search: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 导入插件
在你的 Dart 文件中导入 ruki_search
插件:
import 'package:ruki_search/ruki_search.dart';
3. 使用 RukiSearch
组件
RukiSearch
是一个 Widget,你可以将它放在你的 UI 中的任何地方。它提供了一个搜索框和搜索结果列表。
class SearchPage extends StatelessWidget {
final List<String> items = [
'Apple',
'Banana',
'Cherry',
'Date',
'Elderberry',
'Fig',
'Grape',
];
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Search Example'),
),
body: RukiSearch<String>(
items: items,
onSearch: (query) {
return items.where((item) => item.toLowerCase().contains(query.toLowerCase())).toList();
},
itemBuilder: (context, item) {
return ListTile(
title: Text(item),
);
},
hintText: 'Search...',
),
);
}
}
4. 参数说明
items
: 这是一个包含所有可搜索项的列表。onSearch
: 这是一个回调函数,用于定义如何根据搜索查询过滤项目。它接收一个query
参数,返回一个过滤后的项目列表。itemBuilder
: 这是一个构建搜索结果的回调函数,用于定义每个搜索结果的显示方式。hintText
: 这是搜索框中的提示文本。
5. 自定义
你可以通过修改 RukiSearch
的参数来自定义搜索框的样式、搜索结果的外观等。
6. 运行应用
现在,你可以运行你的应用并测试搜索功能。当你输入搜索查询时,插件会自动过滤并显示匹配的结果。
7. 其他功能
ruki_search
还支持其他一些功能,比如:
- Debounce: 可以设置搜索查询的防抖时间,避免频繁搜索。
- SearchController: 你可以通过
SearchController
来控制搜索框的行为。
示例代码
以下是一个完整的示例代码:
import 'package:flutter/material.dart';
import 'package:ruki_search/ruki_search.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Ruki Search Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: SearchPage(),
);
}
}
class SearchPage extends StatelessWidget {
final List<String> items = [
'Apple',
'Banana',
'Cherry',
'Date',
'Elderberry',
'Fig',
'Grape',
];
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Search Example'),
),
body: RukiSearch<String>(
items: items,
onSearch: (query) {
return items.where((item) => item.toLowerCase().contains(query.toLowerCase())).toList();
},
itemBuilder: (context, item) {
return ListTile(
title: Text(item),
);
},
hintText: 'Search...',
),
);
}
}