json - 如何使用 json 文件为 listview.Builder 添加搜索栏?
问题描述
在我的应用程序 Flutter 中,我有一个带有这个主体的小部件
body: ListView.builder(
itemCount: data.length,
itemBuilder: (BuildContext context, int index) {
return Column(
children: <Widget>[
ListTile(
title: Text(data[index]['name']),
leading: Icon(Icons.arrow_forward_ios),
onTap: () => {
Navigator.pushNamed(context, data[index]['routes'])
// Your Logout method
},
//title: Text(data[index]['name']),
)
],
);
},
),
可变数据取决于本地 json 文件。json文件是这样的:
[
{
"name" : "name",
"routes" : "/routes1"
},
{
"name" : "name2",
"routes" : "/routes2"
},
]
对于更新 json 文件,我使用此代码
Future<String> loadJsonData() async {
var jsonText =
await rootBundle.loadString('assets/file.json');
setState(() {
data = json.decode(jsonText);
});
print(jsonText);
}
@override
// ignore: must_call_super
void initState() {
this.loadJsonData();
}
使用此代码,我有一个列表,可以让我看到名称并通过“路线”将我发送到另一个页面。
我需要添加一个搜索栏,它允许我在输入名称时只显示相似的名称。例如,如果 json 文件中的列表名称是:Martin Mike James
当我开始输入“M”时,我将看到 Martin Mike 的列表。
有什么建议么?
谢谢
解决方案
由于列表是本地的,不会更改。可以通过使用简单的有状态小部件来实现搜索。
最简单的方法是在状态中为过滤器名称添加一个变量,并根据搜索文本使用过滤器名称设置状态。在这里,我使用了一个字符串项目,请使用适合您需要的类。
allNames
变量包含所有名称。
searchedNames
变量包含所有名称。
_searchChanged
函数 setsState 与 searchedName 基于输入的测试TextField
// Widget for searching through a string list.
class SearchNameWidget extends StatefulWidget {
SearchNameWidget({Key key}) : super(key: key);
@override
_SearchNameState createState() => _SearchNameState();
}
class _SearchNameState extends State<SearchNameWidget> {
// All names
List<String> allNames = [
'one',
'two',
'three',
'four',
'five',
'six',
'seven',
'eight',
'nine',
'ten'
];
// searched names
List<String> searchedNames = [
'one',
'two',
'three',
'four',
'five',
'six',
'seven',
'eight',
'nine',
'ten'
];
// changes the filtered name based on search text and sets state.
void _searchChanged(String searchText) {
if (searchText != null && searchText.isNotEmpty) {
setState(() {
searchedNames =
List.from(allNames.where((name) => name.contains(searchText)));
});
}
else {
setState(() {
searchedNames =
List.from(allNames);
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Demos'),
),
body: Column(
children: [
TextField(
// calls the _searchChanged on textChange
onChanged: (search) => _searchChanged(search),
),
Expanded(
child: ListView.builder(
itemCount: searchedNames.length,
itemBuilder: (context, index) => Container(
padding: EdgeInsets.all(5),
child: Text(searchedNames[index]),
),
),
),
],
),
);
}
}
推荐阅读
- python - 如何在日期中的空格之间添加/
- r - 由于错误“库中的错误(MVN):没有名为'MVN'的包”,无法在 RStudio 中使用 MVN 库
- javascript - 如何在 switch 块的每种情况下解决不同的承诺并将它们的结果传递给相同的函数?
- android - 热传递值会引发 onSuccess 响应可运行?
- wordpress - Wordpress 插件:add_submenu_page 添加顶级菜单项
- csv - 使用AWK根据多个条件合并两个文件
- amazon-ec2 - java oracle数据库变更通知
- c# - 指定 PagedListPager 选项
- dart - 导航到其他页面
- linux - 打印命令行参数 x86 程序集