Я внедряю приложение чата, где пользователи могут делиться изображениями. Каждое изображение является виджетом с состоянием, и каждое из них должно быть также загружено в хранилище Firebase.
Моя проблема в том, что этот поток отлично работает в начале приложения, но когда вы загружаете другое изображение вместо одного файла, теперь загружаются 2 файла (1 новый файл и файл из предыдущего сообщения).
Я почти уверен, что это как-то связано с ключами, поэтому я также предоставляю экземпляр 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);
});
}
},
)
и вот код в моем файле чипа сообщений (включая только самое необходимое)
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;
});
});
}
Вот демонстрационный GIF-файл этой проблемы:
GIF-изображение демо
Любые предложения / решения будут оценены.
Спасибо