Flutter: ограничить вызов метода сборки много раз - PullRequest
1 голос
/ 21 мая 2019

Я внедряю приложение чата, где пользователи могут делиться изображениями. Каждое изображение является виджетом с состоянием, и каждое из них должно быть также загружено в хранилище 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-изображение демо

Любые предложения / решения будут оценены. Спасибо

1 Ответ

0 голосов
/ 21 мая 2019

Нулевое значение файла после задачи загрузки изображения может работать.

как

widget.file=null

поместите его после uploadTask

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...