如何在SearchDelegate的buildResults中传递更新UI值?

时间:2020-04-10 19:50:19

标签: android flutter dart mobile mobile-application

我正在尝试使用Orders显示实时http json数据mtgCardNames。数据似乎已成功传递(它们已正确打印),但不知何故它们没有显示在屏幕上。为了了解这种情况,我尝试显示一些其他数据(搜索buildResultsquery),它们按预期显示在屏幕上。

为什么会这样?

我重写了所有必需的4种方法,但在这里只是简单地粘贴testList

buildResults

UI

此刻,http数据不是基于查询,而是硬编码的url,而是实时数据。我在Ubuntu上运行,但我的医生似乎没有问题。

任何建议或帮助都非常感谢!

1 个答案:

答案 0 :(得分:1)

问题是网络调用getData()是异步执行的:

1)您致电getData()

2)同步代码继续执行:return Column(...)仍然为空时调用mtgCardNames

3)您在屏幕上看到空白列

4)网络通话结束,执行then(...),并填充mtgCardNames


要实际显示带有网络调用数据的列,您应该在加载时返回一个小部件,然后再返回一个。一种方法是使用FutureBuilder。基本思想是

@override
Widget buildResults(BuildContext context) {
  GetHTTP getHTTP = GetHTTP();
  return FutureBuilder<List<MTGCard>>(
    future: getHTTP.getData(),
    builder: (context, snapshot) {
      if (!snapshot.hasData)
        return Text('Loading...');
      return Column(
        children: <Widget>[
          Text(query),
          for (MTGCard c in snapshot.data)
            Text(c.name),
        ],
      );
    },
  );
}

但是还有更多细节。例如。将网络调用放入build()方法中不是一个好主意。如果网络调用失败,您还可以显示一些错误窗口小部件。查看tutorial

中的详细信息