【问题标题】:Flutter display firebase storage image from pathFlutter从路径显示firebase存储图像
【发布时间】:2020-09-25 14:13:57
【问题描述】:

我一直在阅读一些与此相关的问题,但我找不到任何与我正在尝试做的事情真正相关的东西,而我想要做的事情非常简单。

我有来自 Firebase 存储的图像文件的路径,比如:

SharedPreferences prefs = await SharedPreferences.getInstance();
String fileName = prefs.getString('currentProfileImage');

StorageReference storageReference = FirebaseStorage.instance
  .ref()
  .child(widget.currentUserUID.toString() + '/profile/' + fileName);

所以图片文件路径会是这样的:

b8sJ7cEHCFdjh46wZNp5xThbvVzz2/profile/image_picker209656937087714.jpg

我只想显示这张图片。就这样。如何将知道此文件的确切路径转换为 ​​Image 类型的对象?

【问题讨论】:

  • 这是 Firebase 存储内部的路径。如果这就是我所需要的,我不知道如何从中获取 URL。我曾尝试将 .getDownloadURL() 与此引用一起使用,当我将其转换为字符串时,它所说的只是“'Future' 的实例”
  • 检查我的答案

标签: firebase flutter dart google-cloud-firestore firebase-storage


【解决方案1】:

您需要先使用 putFile() 将图像保存到 Firebase 存储:

StorageTaskSnapshot snapshot = await storage
   .ref()
   .child(widget.currentUserUID.toString() + '/profile/' + fileName)
   .putFile(file)
   .onComplete;

然后在 Firebase Storage 中获取图片的url 并将其保存到 Firestore,例如:

  final String downloadUrl =
      await snapshot.ref.getDownloadURL();
  await Firestore.instance
      .collection("images")
      .add({"url": downloadUrl, "name": imageName});

然后要显示图像,您可以执行以下操作:

body: Container(
  padding: EdgeInsets.all(10.0),
  child: FutureBuilder(
    future: getImages(),
    builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) {
      if (snapshot.connectionState == ConnectionState.done) {
        return ListView.builder(
            shrinkWrap: true,
            itemCount: snapshot.data.documents.length,
            itemBuilder: (BuildContext context, int index) {
              return ListTile(
                contentPadding: EdgeInsets.all(8.0),
                title:
                    Text(snapshot.data.documents[index].data["name"]),
                leading: Image.network(
                    snapshot.data.documents[index].data["url"],
                    fit: BoxFit.fill),
              );
            });
      } else if (snapshot.connectionState == ConnectionState.none) {
        return Text("No data");
      }
      return CircularProgressIndicator();
    },
  ),
),

/// code here

  Future<QuerySnapshot> getImages() {
    return fb.collection("images").getDocuments();
  }

getImages() 将检索集合中的数据,然后Image.network 将获取图像的 url 并在应用程序中显示图像。

【讨论】:

  • 嗨,彼得。在这种情况下,您对 URL 的所有讨论都使解决方案变得简单。当我最初上传文件时,我使用 storageReference.getDownloadURL().then((fileURL) { prefs.setString('currentProfileImageURL', fileURL); } 所以我只使用从一开始的 URL 而不是数据库中的位置。所以虽然这并不能真正回答这个问题,但可能是因为没有答案,我做错了。现在使用 URL 对我有用,所以希望当我开始拥有要维护和管理的整个图像列表时这仍然有效在应用程序中。
  • 这里的主要问题是,我可以使用数据库中的这些 URL 链接来删除这些图像吗?这就是巨大的未知数发挥作用的地方,也是我最初选择使用直接数据库路径的原因。但也许我可以使用 URL 来做我需要做的所有事情。
  • 查看这篇文章petercoding.com/firebase/2020/05/06/…(最后有一段关于删除)
猜你喜欢
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-20
  • 2017-12-01
  • 2020-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多