调用async函数后发生dispose()错误后调用了setState()



我有这个按钮,可以将用户选择的图片上传到Firestore,并将图片url存储到一个变量中,用于更新用户信息。

SELECTION BUTTON调用selectFile((。

// SELECTING FILE FOR UPLOAD
Future selectFile() async {
final result = await FilePicker.platform
.pickFiles(allowMultiple: false, type: FileType.image, withData: true);
if (result == null) return;
setState(() {
pickedFile = result.files.first;
texto = Text(pickedFile!.name);
});
}

这成功地更改了pickedFiles和Texto变量的状态。

然后我在代码的后面有另一个按钮,它调用uploadFile((,然后用navigator.pop(context(.退出页面

// UPLOADING FILE AND RETRIEVING DOWNLOAD LINK
Future uploadFile() async {
var fileBytes = pickedFile?.bytes;
var fileName = pickedFile?.name;
var ref = FirebaseStorage.instance.ref().child('UserImages/$fileName');
if (fileBytes == null) {
return '';
}
TaskSnapshot uploadedFile = await ref.putData(fileBytes);
url = await ref.getDownloadURL();
log(url);
if (uploadedFile.state == TaskState.success) {
setState(() {    <<<<<<<<--------- setState() called after dispose() ERROR HERE 
_petImage = url;
});
}
}

该函数确实会将图片上传到FireStore,甚至会生成一个链接(通过使用日志(url(进行测试(,但当它达到设置状态时,它会失败。我不知道为什么不更新_petImage变量的状态,该变量与pickedFile和texto等其他变量一起存储在主构建(上下文(之外。setState在其他函数中运行良好,但在该函数中不起作用。我在这里可能做错了什么?

在async上检查状态是否为mounted,然后执行setState是安全的。

_() async {
if (mounted) {
setState(() {});
}
}

最新更新