从 futurebuilder 中删除项目时,它不会更新
When removing items from futurebuilder it doesn't update
我有一个调用连接到 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 不会更新。
FutureBuilder
不打算那样工作。它只等到 Future
被解决并且只重建 一次 。如果您想要与您描述的类似的行为,您可以查看 Stream and StreamBuilder
我有一个调用连接到 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 不会更新。
FutureBuilder
不打算那样工作。它只等到 Future
被解决并且只重建 一次 。如果您想要与您描述的类似的行为,您可以查看 Stream and StreamBuilder