【发布时间】:2021-01-18 01:29:11
【问题描述】:
我正在尝试从 SearchDelegate 返回 FutureBuilder,但显示的结果不正确。
查询似乎是正确的,从网络上我可以看到所有 http 调用都正确完成,所以问题与列表数据更新本身有关。
在(SearchDelegate 的)buildSuggestions 中,返回了一个名为“ResultList”的 StatefulWidget。这个小部件有状态:
- previousQuery - 重新呈现前的最后一个搜索词
- list - 从 Future 返回的数据列表
- 从 - 要显示的第一个元素
- 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))
];
});
}
}
有什么提示吗?提前致谢。
【问题讨论】:
-
FutureBuilder 不是默认设置状态 - 所以不需要/不可能在其中设置状态?只是一个提示,因为您在声誉方面与我相当:看看 BLoC。我花了 2 天时间才进入,但现在处理业务逻辑和状态是一种魅力
-
你的意思是bloclibrary.dev?
-
是的,扩展 bloc 和 flutter_bloc
-
谢谢我试试
标签: flutter