在setState方法中设置新的未来值之后;在数据更新之前,未来仍然有数据



我基本上是在尝试从api中重新获取数据,并使用RefreshIndicator将其显示在屏幕上。在小部件的onRefresh方法中,我将FutureBuilder小部件的future设置为一个新值。然而,在FutureBuilder中的api AsyncSnapShot返回数据之前,数据再也不会为null。当存在对新数据的提取请求时,它仍然显示旧数据。我想让它显示一个LoadingProgressIndicator来显示,而不是旧数据。就像代码第一次做的那样。这是我的代码

return Scaffold(
appBar: AppBar(
title: Text("GDC Saudia"),
),
backgroundColor: Colors.grey[300],
body: RefreshIndicator(
onRefresh: () {
return Future.delayed(Duration(seconds: 0), () {
setState(() {
_quotesFuture = _getData(Endpoint.all);
});
});
},
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
SizedBox(),
AnimatedBuilder(child: GestureDetector(),),
SizedBox(),
FutureBuilder(
future: _quotesFuture,
builder: (context, snapshot) {
if (snapshot.hasError) {
return Center(
child: Text(
"Some error occured",
style: TextStyle(color: Colors.red, fontSize: 32),
),
);
} else if (!snapshot.hasData) {
return Expanded(
child: Center(child: CircularProgressIndicator()));
}
return Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: ListView.builder(
itemBuilder: (_, index) => AnimatedTranslationWidget(
duration: 1 + (index * 0.10),
child: QuoteCard(
quote: snapshot.data[index],
),
),
itemCount: snapshot.data.length,
),
),
);
}),
],
),
),
);

这是initState方法

Future<List<Quote>> _quotesFuture;
@override
void initState() {
_quotesFuture = _getData(Endpoint.all);
super.initState();
}
Future<List<Quote>> _getData(Endpoint point) async =>
await ApiService(API()).getEndpointsData(point);

我只是想在OnRefresh Pull上刷新屏幕内容。谢谢你的帮助。

futures的一个缺点是您不能再次执行futures。

这就是引入流的地方。我建议您在dart中使用流来实现它。

看看这个伟大的Youtube视频

最新更新