我正在尝试从SearchDelegate返回FutureBuilder,但显示的结果不正确。
查询似乎是正确的,并且从网络上我可以看到所有http调用均正确完成,因此问题与列表数据更新本身有关。
在(SearchDelegate的)buildSuggestions中,返回一个名为“ ResultList”的StatefulWidget。此小部件的状态为:
我需要这些变量才能实现无限滚动,因此在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))
];
});
}
}
有任何提示吗?预先感谢。
答案 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})
并在初始化状态下调用您的未来(以及何时要获得新项目(下一页))