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

Flutter 在setState方法中设置新的未来值后;在数据更新之前,未来仍然有数据,flutter,dart,future,Flutter,Dart,Future,我基本上是尝试从api中重新获取数据,并使用刷新指示器在屏幕上显示数据。在小部件的onRefresh方法中,我将我的FutureBuilder小部件的future设置为一个新值。但是,在FutureBuilder中的api AsyncSnapShot返回数据之前,数据再也不会为空。当有新数据的提取请求时,它仍然显示旧数据。我希望它做的是显示一个LoadingProgressIndicator来显示,而不是显示旧数据。就像第一次的代码一样。这是我的密码 return Scaffold(

我基本上是尝试从api中重新获取数据,并使用刷新指示器在屏幕上显示数据。在小部件的onRefresh方法中,我将我的FutureBuilder小部件的future设置为一个新值。但是,在FutureBuilder中的api AsyncSnapShot返回数据之前,数据再也不会为空。当有新数据的提取请求时,它仍然显示旧数据。我希望它做的是显示一个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,
                      ),
                    ),
                  );
                }),
          ],
        ),
      ),
    );
返回脚手架(
appBar:appBar(
标题:文本(“GDC沙特”),
),
背景颜色:颜色。灰色[300],
正文:刷新指示器(
onRefresh:(){
返回未来。延迟(持续时间(秒:0),(){
设置状态(){
_quotesFuture=_getData(Endpoint.all);
});
});
},
子:列(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
SizedBox(),
AnimatedBuilder(子项:GestureDetector(),),
SizedBox(),
未来建设者(
未来:"未来,,
生成器:(上下文,快照){
if(snapshot.hasError){
返回中心(
子:文本(
“发生了一些错误”,
样式:TextStyle(颜色:Colors.red,字体大小:32),
),
);
}如果(!snapshot.hasData){
扩大回报(
child:Center(child:CircularProgressIndicator());
}
扩大回报(
孩子:填充(
填充:常量边集。对称(水平:8.0),
子项:ListView.builder(
itemBuilder:(_,index)=>AnimatedTranslationWidget(
持续时间:1+(指数*0.10),
孩子:QuoteCard(
quote:snapshot.data[索引],
),
),
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);
Future”引用Future;
@凌驾
void initState(){
_quotesFuture=_getData(Endpoint.all);
super.initState();
}
Future\u getData(端点)异步=>
等待API服务(API()).getEndpointsData(点);

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

期货的一个缺点是你不能再次执行未来

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


看一看

我确实制作了流,但效果相同。随着未来数据的变化,意味着新的未来重新构建。但未来的构建器快照总是有价值的