繁体   English   中英

flutter 滤波器数组按一个值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM