Refre sh UI без перезагрузки данных в FutureBuilder возможно? - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть приложение, которое использует случайные данные из API-интерфейса, и у меня есть кнопка с плавающей запятой, чтобы добавить текущие данные в избранное. Когда я щелкаю по кнопке «Избранное», значок должен меняться в соответствии со значением bool (он назван записанным ( ) в моем примере), но я могу сделать это только с помощью setState (чтобы перестроить страницу), но на этот раз данные всей страницы меняются, потому что мой ответ API случайный с тем же URL-адресом, я имею в виду каждый раз, когда я добавляю или удаляю текущие данные при перезагрузке страницы с другими случайными данными, мне нужно обойти эту перезагрузку данных (часть getData () в моем примере) и просто обновить sh значок моей любимой кнопки, есть ли способ сделать это, я попытался использовать другой FutureBuilder для плавания Кнопка и setState только для записи (), но все тот же результат?

Мое дерево конструирования выглядит так:

 @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 Ответ

1 голос
/ 11 апреля 2020

Вы не должны создавать Future в FutureBuilder, но в методе 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

...