flutter - 按值颤动过滤器数组
问题描述
我需要按搜索值过滤数据
这是我的数据
{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 列表中获取输出,
此代码的输出将是
[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),
),
),
这将过滤掉所有建议,并为您提供一个列表和一个小意见,我建议向小部件添加一个按钮,因此一旦用户单击搜索,您就可以只运行一次此过程,即如果您有大量数据,则可以提高性能,但是如果数据很小,那么我们可以采用这种方法,并且我使用过
Map<String, List> 为您指定的数据,请随意更改它,如果您使用 dart:convert,它将更有用,因为我们可以像处理对象一样处理它们。
快乐编码
根据评论,您需要做的就是直接取“i”的值而不是取它的名字,
{ID: 1195, Name: Fajita Pizza (S)}
{ID: 1195, Name: Fajita Pizza (S)}
{ID: 1195, Name: Fajita Pizza (S)}
这将是您的输出。
根据评论更新使用此逻辑将它们添加为地图
Map<dynamic, dynamic>_result = {};
for(var i in _sample["Items"]){
if(i["Name"].toLowerCase().contains(searchString)){
_result[i["ID"]] = i;
}
}
print(_result);
输出
{Fajita Pizza (S): {ID: 1195, Name: Fajita Pizza (S)}, Fajita Pizza (S): {ID: 1195, Name: Fajita Pizza (S)}}
谢谢
推荐阅读
- unit-testing - 如何重写 gocov 命令去工具覆盖?
- java - 片段包
- c# - ASP.NET Core Web API 中的 Azure AD 仅应用身份验证
- reactjs - 在展示/容器模式中使用 PureComponents
- javascript - 如何自定义 vaadin-upload 聚合物组件的结果?
- javascript - 如何从角度通用构建中删除 sourceMappingURL?
- postgresql - PostgreSQL 本地时间
- mysql - 按组中的最大值排序
- c - 使用 C 编译 DLL
- python - Datetime Pandas 函数仅转换单个系列