我正在尝试根据搜索字段输入值过滤列表内的数据。我正在运行列表中的where方法。由于列表在不同的索引上具有不同的项目,因此我在for循环中运行此代码。
以下是列表中第一项的示例;
print(pageData[0].person);
// ###### OUTPUT ######
Person(id: 2, name: james, nickname: , role: guest, phone: , email: , physical_address: s, created: 2020-02-18 09:12:56.000, updated: 2020-02-18 09:12:56.000)
下面,我尝试使用
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 = [];
for (i = 0; i < pageData.length; i++) {
print('in pageData for loop');
var matches = pageData[i].where((data) =>
(data.person.name.toLowerCase().contains('james') ||
data.person.nickname.toLowerCase().contains('james')));
/// Code below is not executing
if (matches != null) {
print('matches found');
results.add(matches);
}
if (i == pageData.length) {
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-loop - “where”方法在 'onChange'方法中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60276432/