在调用API将其更新为BE后,如何使用Provider
更新状态?我将参数从一个屏幕传递到另一个屏幕,然后在编辑文本后,我触发对BE的API调用,并获得响应的返回值,我希望使用Provider用该响应更新状态。这怎么可能?这是代码:
在这里,我调用API并传递我在文本字段中编辑的参数:
onPressed: () async {
final updatedUser = await await APICall.updateUser(
userID,
updateName,
updateEmail,
);
Provider.of<UserStore>(context, listen: false)
.updateUser(updatedUser);
Navigator.pop(context);
},
这是API调用,我在这里返回更新用户的响应:
Future<User> updateUser(String userID, String name, String email) async {
final response =
await APICalls.apiRequest(Method.PATCH, '/users', this._jsonWebToken,
body: jsonEncode({
"id": userID,
"name": name,
"email": email,
}));
Map<String, dynamic> jsonDecodedResponse = jsonDecode(response.body);
return User(
id: jsonDecodedResponse['data']['id'],
name: jsonDecodedResponse['data']['name'],
email: jsonDecodedResponse['data']['email'],
);
}
现在我想把我从API调用得到的响应传递给提供者状态:
deleteUser(User list) {
_userList.remove(list);
notifyListeners();
}
addUser(User list) {
_userList.add(list);
notifyListeners();
}
updateUser(User ){//I'm not sure how do define the updateUser method...
notifyListeners();
}
更新在BE端有效,在FE端仅当我刷新小部件时有效,而不是在返回响应后立即有效,这是我希望它的工作方式。
class UserStore extends ChangeNotifier {
List<User> clientList = [];
void deleteUser(User list) {
clientList.remove(list);
notifyListeners();
}
void addClient(User list) {
clientList.add(list);
notifyListeners();
}
void updateUser(User user){
clientList[clientList.indexWhere((element) => element.id == user.id)] = user;
notifyListeners();
}
}
你现在要做的就是在你的小部件上收听这个提供者。当用户将被更新时,这些更改将应用于侦听clientList的任何小部件。
注意,我已经将clientList
变量更改为public,因此它可以被外部的任何小部件监听。