按下退格键时颤振“.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如何阻止按下退格键页面回退 但 不阻止文本框使用退格键删除文本

有啥方法可以在运行时屏蔽进入 jText 区域的值,如果一直按下退格键,应该清除内容

UITextView:输入退格键时字符数不正确

如何在自动完成字段角度启用退格

如何将加速键赋予键盘退格键