Flutter文本搜索插件searchable_text_field的使用
Flutter文本搜索插件searchable_text_field的使用
本文将介绍如何在Flutter项目中使用searchable_text_field
插件来实现动态数据的搜索和选择功能。此插件非常适合需要从列表中动态筛选和选择项目的场景。
searchable_text_field 插件简介
searchable_text_field
是一个用于支持动态搜索和选项选择的Flutter插件。通过它可以轻松地实现用户输入触发的动态筛选功能,并且支持自定义筛选逻辑和样式。
使用步骤
以下是一个完整的示例,展示如何在Flutter应用中集成并使用 searchable_text_field
插件。
1. 添加依赖
在 pubspec.yaml
文件中添加插件依赖:
dependencies:
searchable_text_field: ^版本号
运行 flutter pub get
安装依赖。
2. 创建示例数据
首先,我们需要一些示例数据来演示搜索功能。这里我们创建了一个城市列表:
// 示例城市数据
List<Map<String, dynamic>> cities = [
{"id": 1, "city": "New York"},
{"id": 2, "city": "Los Angeles"},
{"id": 3, "city": "Chicago"},
{"id": 4, "city": "Houston"},
{"id": 5, "city": "Phoenix"},
];
然后将其映射为 City
模型类:
// City 模型类
class City {
final int id;
final String city;
City({required this.id, required this.city});
factory City.fromJson(Map<String, dynamic> json) {
return City(id: json['id'], city: json['city']);
}
}
3. 集成 searchable_text_field
接下来,我们将 searchable_text_field
集成到应用中。以下是完整的代码示例:
import 'package:flutter/material.dart';
import 'package:searchable_text_field/searchable_text_field.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Searchable Text Field Demo',
theme: ThemeData(primarySwatch: Colors.blue),
home: const MyHomePage(title: 'Searchable Text Field'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
List<City> cities = [];
List<City> searchedCities = [];
TextEditingController controller = TextEditingController();
City? selectedCity;
bool loading = false;
[@override](/user/override)
void initState() {
super.initState();
getCities();
}
void getCities() {
cities = List<City>.from(citiesData.map((e) => City.fromJson(e)));
setState(() {});
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: SearchableTextField<City>(
controller: controller,
status: controller.text.trim().isEmpty
? SearchableTextFieldStatus.none
: selectedCity != null
? SearchableTextFieldStatus.itemSelected
: loading
? SearchableTextFieldStatus.loading
: searchedCities.isEmpty
? SearchableTextFieldStatus.noItemFound
: SearchableTextFieldStatus.itemFound,
menuOption: MenuOption(),
decoration: const InputDecoration(hintText: "Search City Here"),
onChanged: (val) {
if (val != null) {
// 动态筛选数据
selectedCity = null;
searchedCities.clear();
searchedCities.addAll(cities
.where((element) =>
element.city!.toLowerCase().contains(val.toLowerCase()))
.toList());
setState(() {});
}
},
onSelectedItem: (City city) {
// 用户选择城市
selectedCity = city;
setState(() {});
},
validator: (val) {
if (val == null || val.isEmpty) {
return "Required Field!!";
} else if (selectedCity == null) {
return "Please Select City";
} else {
return null;
}
},
items: searchedCities.map((e) => SearchableItem<City>(
value: e,
title: e.city!,
style: const TextStyle(color: Colors.blue),
)).toList(),
),
),
),
);
}
}
更多关于Flutter文本搜索插件searchable_text_field的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter文本搜索插件searchable_text_field的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
searchable_text_field
是一个 Flutter 插件,用于在文本字段中实现搜索功能。它允许用户在文本字段中输入内容,并根据输入的内容进行搜索和过滤。以下是如何使用 searchable_text_field
插件的基本步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 searchable_text_field
插件的依赖:
dependencies:
flutter:
sdk: flutter
searchable_text_field: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 导入包
在你的 Dart 文件中导入 searchable_text_field
包:
import 'package:searchable_text_field/searchable_text_field.dart';
3. 使用 SearchableTextField
SearchableTextField
是一个可搜索的文本字段组件。你可以像使用普通的 TextField
一样使用它,但它还提供了搜索功能。
以下是一个简单的示例:
import 'package:flutter/material.dart';
import 'package:searchable_text_field/searchable_text_field.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Searchable TextField Example'),
),
body: SearchableTextFieldExample(),
),
);
}
}
class SearchableTextFieldExample extends StatefulWidget {
[@override](/user/override)
_SearchableTextFieldExampleState createState() => _SearchableTextFieldExampleState();
}
class _SearchableTextFieldExampleState extends State<SearchableTextFieldExample> {
List<String> items = ['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry', 'Fig', 'Grape'];
List<String> filteredItems = [];
[@override](/user/override)
void initState() {
super.initState();
filteredItems = items;
}
void onSearchTextChanged(String text) {
setState(() {
if (text.isEmpty) {
filteredItems = items;
} else {
filteredItems = items.where((item) => item.toLowerCase().contains(text.toLowerCase())).toList();
}
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return Column(
children: [
SearchableTextField(
onChanged: onSearchTextChanged,
decoration: InputDecoration(
labelText: 'Search',
border: OutlineInputBorder(),
),
),
Expanded(
child: ListView.builder(
itemCount: filteredItems.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(filteredItems[index]),
);
},
),
),
],
);
}
}