可以在不重新加载FutureBuilder中的数据的情况下刷新ui?

时间:2020-04-11 12:26:20

标签: flutter future setstate

我有一个应用程序,该应用程序使用来自api后端的随机数据进行标识,并且有一个浮动操作按钮可将当前数据添加到收藏夹,当我单击“收藏夹”按钮时,图标需要根据bool值进行更改(其名称为“ recorded( )(在我的示例中),但是我只能使用setState(来重建页面)来做,但是这次整个页面的数据都在变化,因为我的api答案是随机的,并且具有相同的url,这意味着我每次添加或删除当前数据时都会重新加载页面对于另一个随机数据,我需要绕过此数据重载(在我的示例中为getData()部分),而只是刷新我最喜欢的按钮的图标,有没有办法做到这一点,我试图对floataction按钮和setState使用另一个FutureBuilder仅用于recorded(),但结果仍相同?

我的构造树是这样的:

 @override
  Widget build(BuildContext context) {
    return Material(
      child: FutureBuilder<Payload>(
          future: getData(_name),
          builder: (context, snapshot) {
          Future<bool> recorded()async {
              var checkFavs = await favoriteDao.findRecordById(snapshot.data.id);
              return checkFavs == null ? Future<bool>.value(true) : Future<bool>.value(false);
            }
           if (snapshot.connectionState != ConnectionState.done && firstRun == true)
              return Center(child: Image.asset("images/dice.gif"));
            if (snapshot.connectionState == ConnectionState.done)
              if (snapshot.hasError)
              {
                return Scaffold(...) // error page
              }
              return Scaffold(..
              ....
              ....
              floatingActionButton:  FutureBuilder(
                            future: recorded(),
                            builder: (context, AsyncSnapshot snapshots){
                              return FloatingActionButton(
                               onPressed: () async{
                                  firstRun = false;
                                  var myrecord = Myrecord(//data details for record//)
                                  var checkFavs = await favoriteDao.findRecordById(snapshot.data.id);
                                  if (checkFavs == null) {await favoriteDao.insertRecord(myrecord);}
                                  else {await favoriteDao.deleteById(snapshot.data.id);}
                                  setState(() {
                                      recorded(); 
                                    });
                                  },
                                  child: snapshots.hasData && snapshots.data ? Icon (Icon ( Icons.favorite_border,) : Icon (Icons.favorite,)
                              };
                             )
                            )
                           ...

1 个答案:

答案 0 :(得分:1)

您不应在FutureBuilder中创建Future,而应在initState方法中创建

@override
void initState() {
  _getData = getData(_name)
  super.initState()
}

@override
Widget build() {
  return FutureBuilder<Payload>(
    future: _getData,
    builder: (context, snapshot) {
      // your code
    }
  );
}

由于build()将在setState之后被调用,因此您应该将Future的创建与build方法分开