如何在 FutureBuilder() 中正确“刷新”小部件

Posted

技术标签:

【中文标题】如何在 FutureBuilder() 中正确“刷新”小部件【英文标题】:How to properly "refresh" Widgets inside FutureBuilder() 【发布时间】:2020-08-27 03:06:43 【问题描述】:

我在 FutureBuilder() 中有一个 Listview.builder(),它显示从 API 获取的数据。我可以成功检索数据。但是当我调用refreshData() 函数时,以前的数据会附加到列表中。如何正确“刷新”FutureBuilder() 中的小部件?

注意:我这里只使用get 请求,所以数据不可能在后端重复。所以问题实际上在于显示数据。

这是我的代码:

class _MyHomePageState extends State<MyHomePage> 
  List<Giver> _givers = [];
  Future giversList;

  getData() async 
    _givers.addAll(await NetworkHelper().fetchGivers());
    return _givers;
  

  refreshData() 
    giversList = getData();
  

  @override
  void initState() 
    super.initState();
    giversList = getData();
  

  @override
   Widget build(BuildContext context) 
     return Scaffold(
       body: SafeArea(
       child: Column(
         children: <Widget>[
            RaisedButton(
              onPressed: ()
                setState(() 
                refreshData();
              );
            ,
          child: Text('Refresh'),
        ),
        FutureBuilder(
          future: giversList,
          builder: (context, snapShot)
            switch(snapShot.connectionState) 
              case ConnectionState.none:
                return Center(child: Text('none'));

              case ConnectionState.active:

              case ConnectionState.waiting:
                return Center(child: CircularProgressIndicator());

              //this is where the listview is created
              case ConnectionState.done:
                return ListView.builder(
                  shrinkWrap: true,
                  itemCount: _givers.length,
                  itemBuilder: (context, index) 
                    return ListTile(
                      title: Text(snapShot.data[index].name),
                      subtitle: Text(snapShot.data[index].address),
                    );
                  );

                  default:
                   return Center(child: Text('Default!'));
                 
               ,
             )
           ],
         ),
       ),
     );
   

【问题讨论】:

顺便说一句,我忘了附上应用程序如何运行的屏幕截图。这是链接:imgur.com/m7Rx3v0 @pskink,您可以将其发布为答案而不是评论吗?解决了这个问题。谢谢! :) 【参考方案1】:

正如上面评论中提到的@pskink,我只是用_givers = await NetworkHelper().fetchGivers();替换了_givers.addAll(await NetworkHelper().fetchGivers());

感谢您的帮助!

【讨论】:

以上是关于如何在 FutureBuilder() 中正确“刷新”小部件的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动中获取设备ID

如何将快照数据从 futurebuilder 传递到同一页面中的另一个 futurebuilder?

如何在 FutureBuilder 中解析从本地主机接收的 JSON 对象

如何在 FutureBuilder Flutter 中停止循环 SetState

在这种情况下,如何在 Flutter 中正确实现 FutureBuilder?

我如何在 FutureBuilder Widget 的构建器函数中等待 - Flutter