在SearchDelegate中使FutureBuilder颤抖

时间:2020-10-02 11:00:00

标签: flutter

我正在尝试从SearchDelegate返回FutureBuilder,但显示的结果不正确。

查询似乎是正确的,并且从网络上我可以看到所有http调用均正确完成,因此问题与列表数据更新本身有关。

在(SearchDelegate的)buildSuggestions中,返回一个名为“ ResultList”的StatefulWidget。此小部件的状态为:

  1. previousQuery-重新呈现前的最后一个搜索词
  2. 列表-期货返回的数据列表
  3. 从-显示的第一个元素
  4. pageSize-返回的元素数

我需要这些变量才能实现无限滚动,因此在ResultList构建方法中,我首先检查widget.query是否已从上次渲染更改

if (previousQuery != widget.query) {
  setState(() {
    from = 0;
    list.clear();
    previousQuery = widget.query;
  });
}

我正在使用ScrollController,因此当用户到达屏幕底部时,在ResultList的initState中,我只是更新“来自”:

setState(() {
    from += pageSize;
});

在FutureBuilder构建器方法中,如果快照具有新数据,则将其追加到列表中。我应该在setState中更新列表,但无法在构建器中执行此操作。

builder: (context, snapshot) {
      List<int> ids = [];
      List<int> newids = [];
      if (snapshot.hasData) {
        ids = list.map((item) => item.id as int).toSet().toList();
        newids = (snapshot.data.results as List)
            .map((item) => item.id as int)
            .toSet()
            .toList()
            .where((id) => !ids.contains(id))
            .toList();
        if (newids.length != 0) {
           setState(() {//can't do this here
               list = [
                   ...list,
                   ...(snapshot.data.results as List)
                       .where((element) => newids.contains(element.id as int))
               ];
           });
        }    
      }

有任何提示吗?预先感谢。

1 个答案:

答案 0 :(得分:0)

当我们在StateFull小部件内使用Future Builder时,我们应该在每个SetState上都知道 Future Builder调用Future Function。并自行重建 因此,如果您删除Future Builder,您的问题将得到解决,

因此,请将您的代码更改为如下所示的内容...

if somthing happens :
    return render(request, 'all/debug.html', context={"z": z, "t": t})
else:
    return render(request, 'all/debug.html', context={"x": x, "y": y})
return render(request, 'all/debug.html', context={"x": x, "y": y})

并在初始化状态下调用您的未来(以及何时要获得新项目(下一页))