所以我有一个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
。
关于如何解决该问题的其他想法?
编辑:我现在用Stream
和StreamBuilder
进行了尝试:
流:
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)
}
);
答案 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();
}