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

时间:2020-07-08 04:19:28

标签: flutter dart future

我基本上是想从api重新获取数据,并使用 RefreshIndicator 在屏幕上显示它们。在小部件的 onRefresh 方法中,将 FutureBuilder 小部件的future设置为新值。但是,在FutureBuilder中的api AsyncSnapShot返回数据之前,永远不会再有null数据。当有新数据的提取请求时,它仍然显示OLD DATA。我想要做的是显示一个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上的屏幕内容。谢谢您的帮助。

1 个答案:

答案 0 :(得分:1)

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

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

看看at this great Youtube video