【问题标题】:flutter FutureBuilder in SearchDelegate在 SearchDelegate 中颤动 FutureBuilder
【发布时间】:2021-01-18 01:29:11
【问题描述】:

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

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

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

  1. previousQuery - 重新呈现前的最后一个搜索词
  2. list - 从 Future 返回的数据列表
  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))
               ];
           });
        }    
      }

有什么提示吗?提前致谢。

【问题讨论】:

  • FutureBuilder 不是默认设置状态 - 所以不需要/不可能在其中设置状态?只是一个提示,因为您在声誉方面与我相当:看看 BLoC。我花了 2 天时间才进入,但现在处理业务逻辑和状态是一种魅力
  • 你的意思是bloclibrary.dev
  • 是的,扩展 bloc 和 flutter_bloc
  • 谢谢我试试

标签: flutter


【解决方案1】:

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

所以请将您的代码更改为如下所示...

  @override
  Widget build(BuildContext context) {
    return newids.Empty && ids.Empty ? CircularProgressIndicator() : MyWidget();
  }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-12
    • 2019-10-07
    • 1970-01-01
    • 2021-05-14
    • 2019-05-01
    • 2021-10-06
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多