Firebase 颤振:限制多次调用构建方法
我正在实现一个聊天应用程序,用户可以在其中共享图像。每个图像都是一个有状态的小部件,每个图像都应该上传到Firebase存储 我的问题是,这个流程在应用程序开始时运行良好,但当你们上传另一个图像时,而不是一个文件,现在上传了两个文件(一个新文件和上一条消息中的文件) 我很确定这与键有关,所以我也提供了UniqueKey的一个实例,但问题仍然存在 让我解释一下我的实现,然后提供代码: 我有2个文件;一个是聊天屏幕,另一个是单个消息芯片。 聊天屏幕保留消息芯片列表,并相应地进行渲染 消息芯片是有状态的,因为我希望用户在上传到服务器时看到一个进度。从设备中提取文件后,消息芯片的实例将被推送到聊天屏幕中的阵列中 聊天屏幕中“附加pic”按钮的我的代码:Firebase 颤振:限制多次调用构建方法,firebase,dart,flutter,firebase-storage,Firebase,Dart,Flutter,Firebase Storage,我正在实现一个聊天应用程序,用户可以在其中共享图像。每个图像都是一个有状态的小部件,每个图像都应该上传到Firebase存储 我的问题是,这个流程在应用程序开始时运行良好,但当你们上传另一个图像时,而不是一个文件,现在上传了两个文件(一个新文件和上一条消息中的文件) 我很确定这与键有关,所以我也提供了UniqueKey的一个实例,但问题仍然存在 让我解释一下我的实现,然后提供代码: 我有2个文件;一个是聊天屏幕,另一个是单个消息芯片。 聊天屏幕保留消息芯片列表,并相应地进行渲染 消息芯片是有状态
IconButton(
icon: Icon(Icons.attach_file),
onPressed: () async {
final File _file = await ImagePicker.pickImage(
source: ImageSource.gallery);
if (_file != null) {
//appending to the messages list
final sss = new MediaMessage(
key: UniqueKey(),
file: _file,
isImage: true,
threadId: widget._threadId,
);
setState(() {
_messages.add(sss);
});
}
},
)
这是我的信息芯片文件中的代码(仅包括基本信息)
以下是本期的演示GIF:
如有任何建议/解决方案,将不胜感激。
谢谢空文件值图像上传任务后可能会工作 像
将其置于uploadTask之后Null图像上载任务之后的文件值可能有效 像
上传任务后放置谢谢回复。我尝试了你的解决方案,但它破坏了应用程序,因为我在我的邮件中使用该文件作为缩略图。上传后,你可以从数据库中获取该文件,而不是像那样访问它。谢谢你的回复。我尝试了你的解决方案,但它破坏了应用程序,因为我在我的邮件中使用该文件作为缩略图。上传后,你可以从数据库中获取该文件,而不是像那样访问它。
void initState() {
super.initState();
//creating a file name eg: img_456985.jpg
final rand = Math.Random().nextInt(10000);
final fileExt = widget.file.path
.substring(widget.file.path.lastIndexOf('.'), widget.file.path.length);
_fileName = 'image_$rand$fileExt';
final StorageReference storeRef = FirebaseStorage.instance
.ref()
.child('threads')
.child(widget.threadId)
.child(_fileName);
final uploadTask = storeRef.putFile(widget.file);
uploadTask.events.listen((event) {
setState(() {
_uploadPercentage = event.snapshot.bytesTransferred.toDouble() /
event.snapshot.totalByteCount.toDouble();
});
print(_uploadPercentage);
});
uploadTask.onComplete.then((snapshot) {
setState(() {
_uploadStatus = UploadProgressStatus.complete;
});
});
}
widget.file=null