[英]flutter filter array by a value
我需要按搜索值过滤数据
这是我的数据
{Items: [{ID: 1195, Name: Fajita Pizza (S)}, {ID: 1195, Name: Fajita Pizza (S)}, {ID: 1195, Name: Fajita Pizza (S)}]}
我有这样的简单搜索字段
TextField (
onChanged: (val) {
print(val);
//here i need to just print a filter result
},
decoration: InputDecoration(
hintText: tr('search.search'),
alignLabelWithHint: true,
hintStyle: Theme.of(context).textTheme.subtitle2,
prefixIcon: Icon(Icons.search),
),
),
我只需要过滤它 onChanged 只需按名称过滤产品
我正在尝试这样的事情
onChanged: (val) {
print(val);
print(items['Items'].where((food) => food.Name.toLowerCase().contains(val.toLowerCase()).toList()));
},
但它没有打印列表:(
所以你需要做的是通过 MAP 数据运行循环并将它们过滤掉,方法看起来像这样
//from dartpad so ignore the void main()
void main() {
List<String> _result = [];
String searchString = "pizza"; //pass it from the onChanged Listner so itll be dynamic
Map<String,List> _searchData = {"Items": [{"ID": 1195, "Name": "Fajita Pizza (S)"}, {"ID": 1195, "Name": "Fajita Pizza (S)"}, {"ID": 1195, "Name": "Fajita Pizza (S)"}]};
for(var i in _searchData["Items"]){
if(i["Name"].toLowerCase().contains(searchString)){
_result.add(i["Name"]);
}
}
print(_result);
}
这将为您提供与该短语匹配的建议,您可以从 _result 列表中获取 output,
此代码的 output 将是
[Fajita Pizza (S), Fajita Pizza (S), Fajita Pizza (S)]
并根据您的想法插入您的代码,它看起来像
//On Global Scope for the Widgets
Map<String,List> _searchData = {"Items": [{"ID": 1195, "Name": "Fajita Pizza (S)"}, {"ID": 1195, "Name": "Fajita Pizza (S)"}, {"ID": 1195, "Name": "Fajita Pizza (S)"}]};
... inside widget Tree
TextField (
onChanged: (val) {
print(val);
String searchString = val;
for(var i in _searchData["Items"]){
if(i["Name"].toLowerCase().contains(searchString)){
print(i);
}
}
},
decoration: InputDecoration(
hintText: tr('search.search'),
alignLabelWithHint: true,
hintStyle: Theme.of(context).textTheme.subtitle2,
prefixIcon: Icon(Icons.search),
),
),
这将过滤掉所有建议,并为您提供一个列表和一个小意见,我建议向小部件添加一个按钮,因此一旦用户单击搜索,您就可以只运行一次此过程,即如果您有大量数据,则可以提高性能,但是如果数据很小,那么我们可以使用这种方法 go,我已经使用
Map<String, List> 为您指定的数据,请随意更改它,如果您使用 dart:convert,它将更有用,因为我们可以像处理对象一样处理它们。
快乐编码
根据评论,您需要做的就是直接取“i”的值而不是取它的名字,
{ID: 1195, Name: Fajita Pizza (S)}
{ID: 1195, Name: Fajita Pizza (S)}
{ID: 1195, Name: Fajita Pizza (S)}
这将是您的 output。
根据评论更新使用此逻辑将它们添加为 map
Map<dynamic, dynamic>_result = {};
for(var i in _sample["Items"]){
if(i["Name"].toLowerCase().contains(searchString)){
_result[i["ID"]] = i;
}
}
print(_result);
output
{Fajita Pizza (S): {ID: 1195, Name: Fajita Pizza (S)}, Fajita Pizza (S): {ID: 1195, Name: Fajita Pizza (S)}}
谢谢
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.