For loop ';其中';方法在';onChange';方法

For loop ';其中';方法在';onChange';方法,for-loop,flutter,dart,match,For Loop,Flutter,Dart,Match,我试图根据搜索字段输入值过滤列表中的数据。我正在运行列表上的where方法。因为列表在不同的索引上有不同的项,所以我在for循环中运行这段代码 下面是列表中第一项的示例 打印(页面数据[0]。个人); //输出###### 人员(id:2,姓名:詹姆斯,昵称:,角色:客人,电话:,电子邮件:,实际地址:s,创建日期:2020-02-18 09:12:56.000,更新日期:2020-02-18 09:12:56.000) 下面我尝试使用where方法查找匹配项,但我得到的是非匹配项 Widge

我试图根据搜索字段输入值过滤列表中的数据。我正在运行列表上的where方法。因为列表在不同的索引上有不同的项,所以我在for循环中运行这段代码

下面是列表中第一项的示例

打印(页面数据[0]。个人);
//输出######
人员(id:2,姓名:詹姆斯,昵称:,角色:客人,电话:,电子邮件:,实际地址:s,创建日期:2020-02-18 09:12:56.000,更新日期:2020-02-18 09:12:56.000)
下面我尝试使用
where
方法查找匹配项,但我得到的是非匹配项

Widget\u buildSearchField(){
返回新的文本字段(
控制器:新文本编辑控制器(),
自动对焦:对,
装饰:常量输入装饰(
hintText:“搜索…”,
边框:InputBorder.none,
hintStyle:const TextStyle(颜色:Colors.white30),
),
样式:const TextStyle(颜色:Colors.white,fontSize:16.0),
一旦更改:(val){
var i;
var结果=[];
对于(i=0;i
(data.person.name.toLowerCase()包含('james'))||
data.person.nickname.toLowerCase()包含('james');
///下面的代码未执行
如果(匹配!=null){
打印(“找到匹配项”);
结果。添加(匹配项);
}
if(i==pageData.length){
设置状态(){
搜索结果=结果;
});
}
}
},
);
}
我该如何解决这个问题?我做错了什么


谢谢你,用爱发帖。

我想你不需要for循环和where语句。 试着这样做:

Widget _buildSearchField() {
return new TextField(
  controller: new TextEditingController(),
  autofocus: true,
  decoration: const InputDecoration(
    hintText: 'Search...',
    border: InputBorder.none,
    hintStyle: const TextStyle(color: Colors.white30),
  ),
  style: const TextStyle(color: Colors.white, fontSize: 16.0),
  onChanged: (val) {
    var i;
    var results = [];

      results = pageData.where((data) =>
       data.person.name.toLowerCase().contains('james') ||
              data.person.nickname.toLowerCase().contains('james');


      );

      setState(() {
        searchResults = results;
      });
    }
  }
);
}

我认为您不需要for循环和where语句。 试着这样做:

Widget _buildSearchField() {
return new TextField(
  controller: new TextEditingController(),
  autofocus: true,
  decoration: const InputDecoration(
    hintText: 'Search...',
    border: InputBorder.none,
    hintStyle: const TextStyle(color: Colors.white30),
  ),
  style: const TextStyle(color: Colors.white, fontSize: 16.0),
  onChanged: (val) {
    var i;
    var results = [];

      results = pageData.where((data) =>
       data.person.name.toLowerCase().contains('james') ||
              data.person.nickname.toLowerCase().contains('james');


      );

      setState(() {
        searchResults = results;
      });
    }
  }
);
}

for循环在我看来很奇怪。为什么要这样迭代数组,然后调用循环中的where?我实现了一个与您在过去尝试实现的功能非常相似的功能,我所做的是这样的:

Widget _buildSearchField() {
return new TextField(
  controller: new TextEditingController(),
  autofocus: true,
  decoration: const InputDecoration(
    hintText: 'Search...',
    border: InputBorder.none,
    hintStyle: const TextStyle(color: Colors.white30),
  ),
  style: const TextStyle(color: Colors.white, fontSize: 16.0),
  onChanged: (val) {
    var i;
    var results = [];

      results = pageData.where((data) =>
       data.person.name.toLowerCase().contains('james') ||
              data.person.nickname.toLowerCase().contains('james');


      );

      setState(() {
        searchResults = results;
      });
    }
  }
);
}
final filtered=testUsers
。其中((用户)=>
user.name.toLowerCase().contains(nameOrNick.toLowerCase())||
user.nick.toLowerCase()包含(nameOrNick.toLowerCase())
.toList();
我有一个
testUsers
列表
,其中包含
用户
对象的列表。我直接在列表上使用
where
来检查是否有任何对象具有包含我要查找的字符串的名称或刻痕。然后,我从过滤后的搜索中创建一个列表,并将其分配给
filtered
变量


应该可以,除了你的循环,我没有看到任何其他问题。

for循环在我看来很奇怪。为什么要这样迭代数组,然后调用循环中的where?我实现了一个与您在过去尝试实现的功能非常相似的功能,我所做的是这样的:

Widget _buildSearchField() {
return new TextField(
  controller: new TextEditingController(),
  autofocus: true,
  decoration: const InputDecoration(
    hintText: 'Search...',
    border: InputBorder.none,
    hintStyle: const TextStyle(color: Colors.white30),
  ),
  style: const TextStyle(color: Colors.white, fontSize: 16.0),
  onChanged: (val) {
    var i;
    var results = [];

      results = pageData.where((data) =>
       data.person.name.toLowerCase().contains('james') ||
              data.person.nickname.toLowerCase().contains('james');


      );

      setState(() {
        searchResults = results;
      });
    }
  }
);
}
final filtered=testUsers
。其中((用户)=>
user.name.toLowerCase().contains(nameOrNick.toLowerCase())||
user.nick.toLowerCase()包含(nameOrNick.toLowerCase())
.toList();
我有一个
testUsers
列表
,其中包含
用户
对象的列表。我直接在列表上使用
where
来检查是否有任何对象具有包含我要查找的字符串的名称或刻痕。然后,我从过滤后的搜索中创建一个列表,并将其分配给
filtered
变量


应该可以,除了您的循环之外,我看不到任何其他问题。

您从哪里获取页面数据?它是snapshot.data<代码>页面数据=snapshot.data从哪里获取页面数据?它是snapshot.data<代码>页面数据=snapshot.data