【发布时间】:2019-09-14 07:31:16
【问题描述】:
我的应用中有一个设置页面,用户可以对其进行编辑以更新详细信息。数据屏幕由两个两个文本字段和一个配置文件头像组成。该应用程序将谷歌(和电子邮件和密码)作为身份验证提供者。因此,当用户第一次注册时,我有一种方法可以将数据呈现给用户。
void readLocal() async {
controllerName = new TextEditingController(text: AuthProvider.of(context).userData.name);
print(controllerName);
controllerEmail = new TextEditingController(text: AuthProvider.of(context).userData.email);
avatarUrl= AuthProvider.of(context).userData.avatarUrl;
// controllerPhoneNumber= new TextEditingController(text: AuthProvider.of(context).userData.phoneNumber);
// Force refresh input
setState(() {});
}
数据按预期呈现。该方法在
中调用 @override
void didChangeDependencies() {
readLocal();
}
确保 initState 已完成。我有一个更新按钮,它的行为不像我想要的那样。当我编辑两个字段时:两个字段都更新并且正确的写入都发送到 Firestore。但是,如果我更新一个TextField,然后按更新,我会丢失另一个TextField 中的数据(将一个空字符串写入Firestore),反之亦然。如果我在不编辑任何一个字段的情况下按下更新,Firestore 中的两个字段都会以空字符串结束。这是我的更新功能
void handleUpdateData() {
focusName.unfocus();
focusEmail.unfocus();
setState(() {
isLoading = true;
});
AuthProvider.of(context).userData.docRef.updateData({'name': name, 'email': email,'avatarUrl':avatarUrl}).then((data) async{
print('@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@');
setState(() {
isLoading = false;
});
Fluttertoast.showToast(msg: "Update success");
}).catchError((err) {
setState(() {
isLoading = false;
});
Fluttertoast.showToast(msg: err.toString());
});
}
这是gist 飞镖文件。我假设通过不编辑字段然后按下更新按钮,更新函数需要一个空字符串来更新并将其写入 Firestore。如何防止这种情况发生?
【问题讨论】:
标签: flutter google-cloud-firestore