【问题标题】:After setting a new future value in setState method; Before the data renews that future still has data在 setState 方法中设置新的未来值后;未来仍有数据的数据更新前
【发布时间】:2020-07-08 04:19:28
【问题描述】:

我基本上是在尝试从 api 重新获取数据并使用 RefreshIndicator 将其显示在屏幕上。在小部件的 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,
                      ),
                    ),
                  );
                }),
          ],
        ),
      ),
    );

这里是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 上刷新屏幕内容。感谢您的帮助。

【问题讨论】:

    标签: flutter dart future


    【解决方案1】:

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

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

    看看at this great Youtube video

    【讨论】:

    • 我确实制作了 Stream>> 但效果相同。
    • 未来的数据确实发生了变化,这意味着新的未来确实被重建了。但是未来的构建器快照总是有价值的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    相关资源
    最近更新 更多