按下退格键时颤振“.Where”过滤器不更新
Posted
技术标签:
【中文标题】按下退格键时颤振“.Where”过滤器不更新【英文标题】:Flutter ".Where" Filter Doesn't Update When Pressing Backspace 【发布时间】:2021-10-18 01:08:51 【问题描述】:我目前正在尝试构建一个可以过滤国家/地区的搜索窗口。
TextFormField(
onChanged: (value)
setState(()
_countrySearchQuery = value;
_countryCodes = _countryCodes.where((element) =>
element.name.toLowerCase().contains(_countrySearchQuery.toLowerCase())
).toList();
);
print(_countrySearchQuery);
print(_countryCodes);
);
,
),
它似乎工作正常,直到我按下退格键(随着搜索变得更广泛,它应该显示更多列表值),但它似乎继续添加到现有查询(进一步缩小搜索范围)而不重置它。
如果我为英国输入“kingdo” 然后按退格键到“king”它不会根据“king”更新它似乎仍然停留在“kingdo”上并继续附加到它,直到列表没有返回任何内容。
打印语句显示搜索查询返回的正是输入的内容,所以我不确定为什么会发生这种情况。
【问题讨论】:
您的onChanged
回调在每次更改时设置_countryCodes = _countryCodes.where(...).toList()
。因此_countryCodes
只能变小而不能变大。相反,您需要保留原始列表的副本并对其进行过滤。
正如上面的评论,将 _countryCodes 改为其他 var。不要将其分配回自己的
【参考方案1】:
我更喜欢为结果创建不同的列表。
class TestCenter extends StatefulWidget
const TestCenter(Key? key) : super(key: key);
@override
_TestCenterState createState() => _TestCenterState();
class _TestCenterState extends State<TestCenter>
String _countrySearchQuery = "";
List<String> _countryCodes =
List.generate(10, (index) => "$index$index * 2");
List<String> matches = [];
@override
Widget build(BuildContext context)
return SingleChildScrollView(
child: Column(
children: [
Text("data: $_countryCodes.toString()"),
TextFormField(
onChanged: (value)
setState(
()
_countrySearchQuery = value;
matches = _countryCodes
.where((element) => element
.toLowerCase()
.contains(_countrySearchQuery.toLowerCase()))
.toList();
,
);
print("countryCode: $_countryCodes");
print("match: $matches");
,
),
Text(_countrySearchQuery.length > 0
? matches.length > 0
? matches.toString()
: "could not found"
: "start typing")
],
),
);
【讨论】:
以上是关于按下退格键时颤振“.Where”过滤器不更新的主要内容,如果未能解决你的问题,请参考以下文章
前端javascript如何阻止按下退格键页面回退 但 不阻止文本框使用退格键删除文本