0

我正在使用 aFutureBuilder从数据库调用中构建未来的项目列表。出于某种原因,当我两次调用运行时,这是有问题的setState()FutureBuilder我制作了我的代码的简化版本来说明这个问题:

void initState() {
  super.initState();
  futureIng = db.getIngredients();
}

Widget build(BuildContext context) {
  return Column(
    children: [
      getButton(),
      getDeleteButton(),
      FutureBuilder<List<IngredientSql>>(
        future: futureIng,
        builder: (BuildContext context, AsyncSnapshot<List<IngredientSql>> snapshot) {
          if (snapshot.hasData && snapshot.data != null) {
            if (snapshot.data.isEmpty) {
              return Text("Nothing yet", style: TextStyle(color: Colors.white));
            }
            return Text(getList(snapshot.data));
          } else {
            return CircularProgressIndicator();
          }
        },
      ),
    ],
  );
}
}

void insertIngredient() {
Future<bool> success = db.insertIngredient("banana2"));
success.then((success) {
  if (success) {
    setState(() {
      futureIng = db.getIngredients();
    });
});


}

void deleteIngredient() {
var future = db.deleteIngredient("banana2");
future.then((value) {
  futureIng = db.getIngredients();
  futureIng.then((value) {
    setState(() {
      print("asd");
    });
  });
});


}

getButton()来电insertIngredient()和按getDeleteButton()来电deleteIngredient()

所以首先我插入“banana2”成分,然后按删除将其删除。正如您在deleteIngredient()函数中看到的那样,该项目被删除,然后我更新未来并调用setState()以重建输出文本。但是,FutureBuilder现在被调用了 2 次,一次没有发生任何事情(banana2 仍然输出),然后立即再次被删除。

这里发生了什么?

4

2 回答 2

0

我仍然不是 100% 确定它为什么运行两次,但是第一次“不正确”运行,connectionstate 正在等待,第二次“正确”运行是“完成”。所以我用一个简单的 if 语句解决了我的问题。

于 2020-09-10T19:59:14.040 回答
0

我认为它是这样的:futurebuilder 第一次被重建为一个值已更改的小部件,因此 setState() 方法使其重建。第二次是因为 FutureBuilder 自己重建,因为你从 AsyncSnapshot futureIng 中获得了价值,这是你所期望的“正常”重建。

因此,您不希望拥有的构建是由于 futureIng 的实例被更改并且 Widget FutureBuilder 像普通小部件那样重建而导致的。

于 2020-09-10T11:27:03.370 回答