Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 颤振:限制多次调用构建方法_Firebase_Dart_Flutter_Firebase Storage - Fatal编程技术网

Firebase 颤振:限制多次调用构建方法

Firebase 颤振:限制多次调用构建方法,firebase,dart,flutter,firebase-storage,Firebase,Dart,Flutter,Firebase Storage,我正在实现一个聊天应用程序,用户可以在其中共享图像。每个图像都是一个有状态的小部件,每个图像都应该上传到Firebase存储 我的问题是,这个流程在应用程序开始时运行良好,但当你们上传另一个图像时,而不是一个文件,现在上传了两个文件(一个新文件和上一条消息中的文件) 我很确定这与键有关,所以我也提供了UniqueKey的一个实例,但问题仍然存在 让我解释一下我的实现,然后提供代码: 我有2个文件;一个是聊天屏幕,另一个是单个消息芯片。 聊天屏幕保留消息芯片列表,并相应地进行渲染 消息芯片是有状态

我正在实现一个聊天应用程序,用户可以在其中共享图像。每个图像都是一个有状态的小部件,每个图像都应该上传到Firebase存储

我的问题是,这个流程在应用程序开始时运行良好,但当你们上传另一个图像时,而不是一个文件,现在上传了两个文件(一个新文件和上一条消息中的文件)

我很确定这与键有关,所以我也提供了UniqueKey的一个实例,但问题仍然存在

让我解释一下我的实现,然后提供代码:

我有2个文件;一个是聊天屏幕,另一个是单个消息芯片。 聊天屏幕保留消息芯片列表,并相应地进行渲染

消息芯片是有状态的,因为我希望用户在上传到服务器时看到一个进度。从设备中提取文件后,消息芯片的实例将被推送到聊天屏幕中的阵列中

聊天屏幕中“附加pic”按钮的我的代码:

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