在调用异步函数后,在dispose()之后调用了setState()导致错误。

9 浏览
0 Comments

在调用异步函数后,在dispose()之后调用了setState()导致错误。

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

选择按钮调用selectFile()函数。

// 选择要上传的文件

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)退出页面。

// 上传文件并获取下载链接

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()时出现错误

_petImage = url;

});

}

}

该函数确实将图片上传到FireStore,并生成一个链接(通过使用log(url)进行测试),但当它达到setState时,它失败了。

我不知道为什么这不会更新_petImage变量的状态,该变量存储在build(context)之外,与其他变量(如pickedFile和texto)一起。在其他函数中,setState的工作正常,但在这个函数中却不起作用。

我在这里可能做错了什么?

0
0 Comments

在Flutter开发中,有时候会遇到一个错误,即在调用异步函数后调用setState()时出现"setState() called after dispose()"的错误。

这个错误的出现原因是因为在调用异步函数后,组件已经被销毁(disposed),但是在异步函数中仍然调用了setState()方法来更新状态。由于组件已经被销毁,所以无法再次调用setState()方法,从而导致了错误的发生。

为了解决这个问题,我们可以在异步函数中先判断组件是否已经被销毁,然后再调用setState()方法来更新状态。例如,可以使用mounted属性来判断组件是否已经被销毁,如果mounted为true,则表示组件仍然存在,可以安全地调用setState()方法。

下面是一个示例代码,演示了如何在异步函数中使用mounted属性来判断组件是否已经被销毁,并在安全的情况下调用setState()方法:

_() async {

if (mounted) {

setState(() {});

}

}

在这个示例中,异步函数_()中首先判断了mounted属性,如果为true,则调用setState()方法来更新状态。通过这样的判断,可以避免在组件已经被销毁后调用setState()方法而导致错误的发生。

总结起来,解决"setState() called after dispose()"错误的方法就是在异步函数中先判断组件是否已经被销毁,然后再调用setState()方法。通过这样的判断,可以避免错误的发生,保证代码的正确执行。

0