Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.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
Flutter Flatter,正在尝试从存储更新图片_Flutter_Asynchronous_Dart_Stream Builder - Fatal编程技术网

Flutter Flatter,正在尝试从存储更新图片

Flutter Flatter,正在尝试从存储更新图片,flutter,asynchronous,dart,stream-builder,Flutter,Asynchronous,Dart,Stream Builder,我正在尝试从firebase存储上传和更新图片。但由于某些原因,这并不能正常工作 这将是一种情况;一个用户从他的相机中拍摄了一张照片,所以这张照片被上传到我的存储器中,这样我就可以得到url照片,这样我就可以像NetworkImage(url)一样使用它来更新照片 这就是目前正在发生的事情: 假设我没有任何照片 我用新图片更新我的个人资料。(这很好用) 现在让我们假设我想更新我的个人资料图片,所以我拍摄了另一张图片,我们称之为A,所以我上传了这张 什么都没发生,画面也没变 但是如果我再

我正在尝试从firebase存储上传和更新图片。但由于某些原因,这并不能正常工作

这将是一种情况;一个用户从他的相机中拍摄了一张照片,所以这张照片被上传到我的存储器中,这样我就可以得到
url
照片,这样我就可以像
NetworkImage(url)
一样使用它来更新照片

这就是目前正在发生的事情:
假设我没有任何照片

  • 我用新图片更新我的个人资料。(这很好用)
现在让我们假设我想更新我的个人资料图片,所以我拍摄了另一张图片,我们称之为
A
,所以我上传了这张

  • 什么都没发生,画面也没变
但是如果我再次尝试使用
B
图片,由于某种原因,图片会用
a
图片更新


这将是我的代码和我如何面对这个特性。 我有下一个方法,当用户点击他的图片时调用。我等待结果(值),所以当我得到结果时,我上传图片。然后,上传图片时,我只需调用setState并将
url
保存到
\u imageUrl
变量中

之后,我将“profilePic”属性从数据库更改为
true

  String _imageUrl = 'assets/profileDefault.jpg';
  bool profilePicture = false;
  io.File profilePic;
  Future getFromCamara() async {
    await ImagePicker().getImage(source: ImageSource.camera).then((value) {
      profilePic = io.File(value.path);
      FirebaseStorage.instance.ref().child('picture').putFile(profilePic);
    }).then((result) {
      var ref = FirebaseStorage.instance.ref().child('picture');
      ref.getDownloadURL().then((loc) => setState(() => _imageUrl = loc));
    });

    try {
      FirebaseFirestore.instance
          .collection('Usuarios')
          .doc(uid)
          .update({'profilePic': true});
    } catch (e) {
      print(e.toString());
    }
现在,使用StreamBuilder,我从数据库中获得
profilePic
的结果,如果为True,我下载URL,如果为True,我只使用资产默认值的pic

body: StreamBuilder(
        stream: FirebaseFirestore.instance.collection('Usuarios').snapshots(),
        builder: (context, AsyncSnapshot<QuerySnapshot> snapshot1) {

              if (!snapshot1.hasData) {
                return Center(
                  child: CircularProgressIndicator(),
                );
              }

              List<DocumentSnapshot> users = snapshot1.data.docs;

              for (DocumentSnapshot user in users) {
                if (user.id == userID) {
                  profilePicture = user['profilePic'];
                }
              }

              if (profilePicture) {
                FirebaseStorage.instance
                    .ref()
                    .child('picture')
                    .getDownloadURL()
                    .then((loc) => _imageUrl = loc);
              } else {
                _imageUrl = 'assets/profileDefault.jpg';
              }
             
              return Stack(
                alignment: Alignment.center,
                children: <Widget>[
                  Positioned(
                    top: 0,
                    child: Container(
                      color: Color.fromRGBO(255, 0, 0, 70),
                      width: MediaQuery.of(context).size.width,
                      height: MediaQuery.of(context).size.height * .55,
                    ),
                  ),
                  Positioned(
                    top: MediaQuery.of(context).size.height * .015,
                    left: 15,
                    right: 15,
                    child: Container(
                      width: MediaQuery.of(context).size.height * .90,
                      height: 300,
                      padding: EdgeInsets.only(bottom: 10),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                        children: <Widget>[
                          Column(
                            mainAxisAlignment: MainAxisAlignment.center,
                            children: <Widget>[
                              GestureDetector(
                                onTap: () => _setPic(context),
                                child: CircleAvatar(
                                  radius: 79,
                                  backgroundColor: Color(0xFFFFFFFFF),
                                  child: CircleAvatar(
                                    radius: 75,
                                    backgroundImage: profilePicture
                                        ? NetworkImage(_imageUrl)
                                        : AssetImage(_imageUrl),
                                  ),
                                ),
                              ),
                            // More code...



在这里,当图像被拾取时,您应该直接设置它,或者您可以在firebase上载成功完成后设置它

但是,您不必在上传后从Firebase URL加载图像,而是可以直接从拾取的文件加载图像,如下所示:

image = Image.memory(await pickedFile.readAsBytes())

这将立即设置图像,并为您保存对Firebase的读取调用。您应该尽可能尽量减少Firebase读取。

对不起,您能给我一个如何基于我的代码实现它的示例吗?我已经用我尝试过的东西更新了,但是我有点迷路了。谢谢你!我没有使用
Image.memory()
方法,而是使用了类型
File
,因此在小部件中我可以使用
FileImage(File)
。谢谢你的提示!
child: CircleAvatar(
          radius: 75,
          backgroundImage: profilePicture
               ? pictureTemp == null
                 ? AssetImage(_imageUrl)
                 : Image.memory(pictureTemp)
               : AssetImage(_imageUrl),
       ),
image = Image.memory(await pickedFile.readAsBytes())