Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
颤振ListView.builder()动态列表-显示无限重复的条目_Listview_Dart_Flutter - Fatal编程技术网

颤振ListView.builder()动态列表-显示无限重复的条目

颤振ListView.builder()动态列表-显示无限重复的条目,listview,dart,flutter,Listview,Dart,Flutter,我有一个很大的,大约5千件物品的清单 我想做的是为这些项目编写一个搜索视图 我尝试了以下方法- List<String> items; String query; ListView.builder( itemBuilder: (context, index) { for (int i = index; i < items.length; i++) { var item = items[i]; if (ite

我有一个很大的,大约5千件物品的清单

我想做的是为这些项目编写一个搜索视图

我尝试了以下方法-

   List<String> items;
   String query;

   ListView.builder(
    itemBuilder: (context, index) {
      for (int i = index; i < items.length; i++) {
        var item = items[i];
        if (item.contains(query)) {
          return ItemTile(item);
        }
      }
    }
但随后我收到一个错误,说-
setState()或markNeedsBuild(),在生成过程中调用。

在不完全搜索每个查询的项的情况下,正确的方法是什么


(我的目标是在键入UX时进行搜索)

您正在Listview.builder中使用for循环,这不是必需的。ListView.builder将自动循环到列表中的项目数

试试这个

List<String> items;
String query;

ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
  var item = items[index];
  if (item.contains(query)) {
      setState(() => _count += 1);
      return ItemTile(item);
  }
}
列表项;
字符串查询;
ListView.builder(
itemCount:items.length,
itemBuilder:(上下文,索引){
var项目=项目[索引];
if(项包含(查询)){
设置状态(()=>_计数+=1);
返回项目(项目);
}
}

您在Listview.builder中使用的for循环不是必需的。Listview.builder将自动循环到列表中的项目数

试试这个

List<String> items;
String query;

ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
  var item = items[index];
  if (item.contains(query)) {
      setState(() => _count += 1);
      return ItemTile(item);
  }
}
列表项;
字符串查询;
ListView.builder(
itemCount:items.length,
itemBuilder:(上下文,索引){
var项目=项目[索引];
if(项包含(查询)){
设置状态(()=>_计数+=1);
返回项目(项目);
}
}

在将列表传递给构建器之前,可以尝试过滤列表

List<String> items;
List<String> _queryResults;
String query;

_queryResults = items.where((item) => item.contains(query)).toList();
列表项;
列出查询结果;
字符串查询;
_queryResults=items.where((item)=>item.contains(query)).toList();
然后可以将其传递到ListView.builder,而无需反复设置状态。不确定与其他选项相比,它的性能如何,应该不会有太大区别,因为在大多数情况下,过滤列表可能会短得多。它比在生成器中进行过滤和设置状态要干净得多,所以我至少会这样做至少要测试一下


此外,如果您要在键入解决方案时进行搜索,则应取消筛选。这意味着您需要在每次输入后等待500毫秒或某个合适的时间,以查看用户在执行筛选之前是否键入了更多内容。这将为您节省大量不必要的调用,并使您的解决方案执行得更好。

您可以尝试在输入之前筛选列表你要把它交给建筑商吗

List<String> items;
List<String> _queryResults;
String query;

_queryResults = items.where((item) => item.contains(query)).toList();
列表项;
列出查询结果;
字符串查询;
_queryResults=items.where((item)=>item.contains(query)).toList();
然后可以将其传递到ListView.builder,而无需反复设置状态。不确定与其他选项相比,它的性能如何,应该不会有太大区别,因为在大多数情况下,过滤列表可能会短得多。它比在生成器中进行过滤和设置状态要干净得多,所以我至少会这样做至少要测试一下


此外,如果您要在键入解决方案时进行搜索,则应取消筛选。这意味着您需要在每次输入后等待500毫秒或某个合适的时间,以查看用户是否在执行筛选之前键入更多内容。这将为您节省大量不必要的调用,并使您的解决方案性能更好。

这里有一种可能添加取消筛选的方法e:-

var _controller = TextEditingController();
List<dynamic> _filtered;

@override
void initState() {
  _filtered = widget.items;

  _controller.addListener(() {
    var query = _controller.text;
    Future.delayed(Duration(milliseconds: 250), () {
      if (!mounted) {
        return;
      }
      if (_controller.text == query) {
        setState(() {
          _filtered = widget.items
              .where((item) => item.contains(query)).toList())
              .toList();
        });
      }
    });
  });

  super.initState();
}

...

ListView.builder(
  itemBuilder: (context, index) => ItemTile(_filtered[index]),
  itemCount: _filtered.length,
)
var\u controller=TextEditingController();
已筛选的列表;
@凌驾
void initState(){
_过滤=widget.items;
_controller.addListener(){
var query=\u controller.text;
延迟(持续时间(毫秒:250),(){
如果(!已安装){
返回;
}
if(_controller.text==查询){
设置状态(){
_filtered=widget.items
.where((项)=>item.contains(查询)).toList()
.toList();
});
}
});
});
super.initState();
}
...
ListView.builder(
itemBuilder:(上下文,索引)=>ItemTile(_filtered[index]),
itemCount:_.length,
)

这里有一种可能的方法来添加去抖动:-

var _controller = TextEditingController();
List<dynamic> _filtered;

@override
void initState() {
  _filtered = widget.items;

  _controller.addListener(() {
    var query = _controller.text;
    Future.delayed(Duration(milliseconds: 250), () {
      if (!mounted) {
        return;
      }
      if (_controller.text == query) {
        setState(() {
          _filtered = widget.items
              .where((item) => item.contains(query)).toList())
              .toList();
        });
      }
    });
  });

  super.initState();
}

...

ListView.builder(
  itemBuilder: (context, index) => ItemTile(_filtered[index]),
  itemCount: _filtered.length,
)
var\u controller=TextEditingController();
已筛选的列表;
@凌驾
void initState(){
_过滤=widget.items;
_controller.addListener(){
var query=\u controller.text;
延迟(持续时间(毫秒:250),(){
如果(!已安装){
返回;
}
if(_controller.text==查询){
设置状态(){
_filtered=widget.items
.where((项)=>item.contains(查询)).toList()
.toList();
});
}
});
});
super.initState();
}
...
ListView.builder(
itemBuilder:(上下文,索引)=>ItemTile(_filtered[index]),
itemCount:_.length,
)

对于与查询不匹配的列表项,此方法是否会导致更长的代码路径?无所谓。这并不能解决我原来的问题。这个方法会不会导致不匹配查询的列表项的代码路径变长?没关系。这并不能解决我原来的问题。谢谢你,这似乎很有效。250毫秒的去盎司效果会更好!谢谢,这似乎很有效。250毫秒的去盎司效果会更好!