【问题标题】:i can't use RefreshIndicator with FutureBuilder?我不能将 RefreshIndicator 与 FutureBuilder 一起使用?
【发布时间】:2020-08-18 19:42:31
【问题描述】:

我正在尝试将 RefreshIndicatorFutureBuilder 一起使用,但是当我拉动刷新时它似乎不起作用,从数据库中删除一行后数据没有改变

RefreshIndicator(
          onRefresh: () async {
            return await carProvider.getCar();
          },
          child: FutureBuilder<List<Car>>(
            future: carProvider.getCar(),
            // initialData: carProvider.carList,
            builder:
                (BuildContext context, AsyncSnapshot<List<Car>> snapshot) {
              print(snapshot.connectionState);
              if (snapshot.connectionState == ConnectionState.waiting)
                return CircularProgressIndicator();
              else if (snapshot.connectionState == ConnectionState.done &&
                  snapshot.data.length > 0)
                return ListView.builder(
                  itemCount: snapshot.data.length,
                  shrinkWrap: true,
                  itemBuilder: (context, index) => Row(
                    children: [
                      Text(snapshot.data[index].name),
                      RaisedButton(
                        child: Text('Remove'),
                        onPressed: () {
                          carProvider.removeCar(snapshot.data[index]);
                          carProvider.getCar();
                        },
                      )
                    ],
                  ),
                );
              else
                return Center(
                  child: Text('Something is wrong'),
                );
            },
          ),
        ),

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    FutureBuilder 没有“绑定”到方法。这意味着再次调用 carProvider.getCar() 无论如何都不会影响 FutureBuilder。

    它所做的只是再次调用该函数。

    onRefresh: () async {
                return await carProvider.getCar();
              },
    
    

    更简单的方法是调用 setState 来重建 FutureBuilder。

    onRefresh: () async {
                setState((){});
       },
    
    

    【讨论】:

    • 谢谢,但是我用的是provider,所以不能用setState()
    • 仅仅因为你使用了provider,并不意味着使用setstate是错误的。在很多情况下,您仍然必须使用 initstate 和 dispose 方法。 Provider 非常适合管理全局状态。也就是说,许多不同屏幕和小部件的状态。如果您使用提供程序来管理单个页面的状态,那听起来就像是不必要的样板。在这种情况下,使用简单的有状态小部件就可以完成这项工作。
    【解决方案2】:

    你可以这样做:

    Future refresh() async{
    return await carProvider.getCar();
    }
    

    然后:

    RefreshIndicator(onRefresh: refresh, child: FutureBuilder(future: refresh, ....))
    

    【讨论】:

    • 这会更新来自futureBuilder 的snapshot.data 的内容吗?我在 RefreshIndicator "onRefresh" 上更新刷新未来的内容时遇到问题。
    • 是的。确实如此。每次调用该 future 时,它​​完成后都会更新快照的内容。
    猜你喜欢
    • 2021-10-06
    • 2019-01-31
    • 1970-01-01
    • 2021-04-17
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多