【问题标题】:When removing items from futurebuilder it doesn't update从 futurebuilder 中删除项目时,它不会更新
【发布时间】:2020-01-02 23:04:37
【问题描述】:

我有一个调用连接到 DynamoDB 的 API 的 futurebuilder。当我从 dynamoDB 中删除一个项目时,它不会更新我的列表,除非我离开屏幕然后返回,从而允许 FutureBuilder 自身重建。

我尝试使用 ListView 和一个在初始化状态下调用 API 的变量并在本地修改该变量,同时仍然在同一个视图上,但这有其自身的复杂性。

在使用 FutureBuilder 的地方灵活。

Flexible(
              flex: 31,
              child: FutureBuilder<UserList>(
                future: getUsers(URL+GroupID),
                builder: (context, snapshot) {
                  if (snapshot.hasData) {
                    print("HAS DATA");
                    if (snapshot.data.users == null) {
                      return Column(
                        children: <Widget>[
                          Padding(
                            child: Text(
                              "You have no users",
                              style: TextStyle(
                                color: Colors.white,
                                fontSize: 30,
                              ),
                              textAlign: TextAlign.center,
                            ),
                            padding: EdgeInsets.fromLTRB(10, 50, 10, 10),
                          ),
                          Icon(FontAwesomeIcons.solidSadTear, size: 80, color: Colors.white,),
                        ],
                      );
                    } else {
                      return ListView.builder(
                        itemCount: snapshot.data.users.length,
                        itemBuilder: (BuildContext context, int i) {
                          return Slidable(
                            actionPane: SlidableDrawerActionPane(),
                            actionExtentRatio: 0.25,
                            child: new UserView(snapshot.data.users[i], GroupID),
                            actions: <Widget>[
                              IconSlideAction(
                                caption: 'Delete',
                                color: Colors.redAccent,
                                icon: Icons.delete_forever,
                                onTap: () => {
                                  removeUser(snapshot.data.users[i])
                                },
                              ),
                            ],
                          );
                        },
                        padding: EdgeInsets.only(),
                      );
                    }
                  } else if (snapshot.hasError) {
                    showAlert(context, "Failure to get Item",
                        "Please check DynamoDB");
                    return Center(child: Text("App Failure\nPlease restart the app"));
                  } else {
                    return Center(child: CircularProgressIndicator());
                  }
                },
              ),
            ),

removeUser 方法:获取当前列表,删除指定用户,然后更新 Dynamo。

removeUser(UserObject user) async{
    UserList userList = await getUsers(URL+GroupID);
    var i = 0;
    for(var temp in userList.users){
      if(temp.UID == user.UID){
        userList.users.removeAt(i);
        String update = await updateAdminUsers(URL+"updateUser/"+GroupID, userList);
        setState(() {});
      }
      i++;
    }
  }

我希望它最终做的是更新视图,而无需导航并返回。通过使用 SetState(){} 它更新列表的长度,但列表本身永远不会更新。示例:如果列表中有 bill 和 bob,并且我从列表中删除了 bill,则 bob 将被删除,因为他是列表中的最后一个元素,并且 bob 保留。但是,当您离开并返回时,尽管那里有正确的列表。 Dynamo 没有问题,但 FutureBuilder 不会更新。

【问题讨论】:

    标签: listview flutter state future


    【解决方案1】:

    FutureBuilder 不打算以这种方式工作。它只会等到Future 被解决并且只重建一次。如果您想要与您描述的类似行为,您可以查看StreamStreamBuilder

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      相关资源
      最近更新 更多