返回新值时已构建FutureBuilder

时间:2020-03-29 20:13:50

标签: flutter

所以我有一个StatelessWidget和一个FutureBuilder。 问题是我的Future首先返回一个cachedFile,然后从我的API中获取新数据。但是我认为我的小部件已经使用cachedFile构建,这就是为什么它不返回新数据的原因。 我正在使用Flutter Cache Manger软件包,而我的Future如下所示:

final response = await CacheManager().getSingleFile(url, headers: headers);
 if (response != null && await response.exists()) {
   final res = await response.readAsString();
   final finalList = MyData.fromJson(json.decode(res));
   return finalList;
 }
throw Exception();

我可能可以将小部件转换为StateFul,然后在setState的末尾调用Future

关于如何解决该问题的其他想法?

编辑:我现在用StreamStreamBuilder进行了尝试: 流:

  Stream<MyData> getStats() async* {

    final response = await CacheManager().getSingleFile(url, headers: headers);

    if (response != null && await response.exists()) {
      final res = await response.readAsString();
      final finalList = MyData.fromJson(json.decode(res));
      yield finalList;
    } else {
      throw Exception();
    }
  }

和我的StreamBuilder

return StreamBuilder<MyData>(
      stream: getStats(),
      builder: (context, snapshot) {
        if (snapshot.hasError) {
          return Text(
            "Please Check Your Internet Connection",
          );
        } else if (snapshot.connectionState == ConnectionState.waiting) {
          return Center(
            child: Spinner(),
          );
        } else {
          return Text(snapshot.data.total)
        }
);

2 个答案:

答案 0 :(得分:1)

未来不能传递很多值,它们将执行并返回一个值,然后完成。

如果您需要传递多个值,请改为使用Stream 。首先,您的Stream发出缓存中的值,然后您的Stream发出您从API中获得的值。

在将服务修改为使用Stream而不是Future之后,将您的build()修改为使用StreamBuilder 而不是FutureBuilder


编辑:

对于您已编辑的代码,您的屏幕无法更新的原因是您只进行了一次yield,因此从缓存中获取值时必须屈服,而从API中获取值时必须屈服。

如果愿意,也可以使用StreamController代替yield

答案 1 :(得分:0)

您可以使用StreamBuilder代替FutureBuilder

StreamBuilder(
 stream: getMyData(),
 builder: (context, snapshot) {
  if (snapshot.hasData) {
   return Text('${snapshot.data}');
  }
  return Container();
})

Stream<MyData> getMyData() async* {
 yield cachedFile;
 final response = await CacheManager().getSingleFile(url, headers: headers);
 if (response != null && await response.exists()) {
   final res = await response.readAsString();
   final finalList = MyData.fromJson(json.decode(res));
   yield finalList;
 }
throw Exception();
}