【问题标题】:Flutter and Firebase: Return all images from Firebase StorageFlutter 和 Firebase:从 Firebase 存储返回所有图像
【发布时间】:2020-10-24 21:45:23
【问题描述】:

我在网上看到了一些关于能够做到这一点的人写的文章,但他们只告诉你如何使用一个特定的、受控的图像列表来做到这一点,他们也事先知道所有的文件名。

这里还发布了这个“答案”:Flutter - Get all images from firebase storage 它实际上并没有解决这个问题,因为它建议了推荐插件的 .listAll() 方法,但没有像 .listAll() 这样的方法使用建议的插件。

我需要能够知道 Firebase 存储中有多少图像,或者它们可能被称为什么,只是为了返回存储在那里的所有内容。

更新:

因此,由于 Firebase 存在很多限制,以至于它根本不适合作为数据库,看来我们可能不得不将图像保存在 Firebase 存储中,并将这些图像的参考列表保存在 Firebase 实时数据库文档中。

但是,我一直坚持执行此操作,因为我什至不确定首先如何最好地执行此操作。我正在尝试做的是将所有存储图像 URL 存储在一个数组中(如果这不是最好的方法,请告诉我!):

Firebase Structure
  collection     ->    document    ->    fields
   userData         profileImages         URLs (array)

我的第一个问题是我不知道如何将新数据附加到现有数组中,似乎每次添加新项目时都会覆盖它,因此我在数据库中的数组中只有一个字符串:

Firestore.instance.collection('userData').document('profileImages').updateData({
      'URLs': _uploadedFileURL,
    });

然后在此之后,我也不确定以后需要时如何实际检索完整的数据数组:

Container(
  child: StreamBuilder(
    stream: Firestore.instance.collection('userData').document('profileImages').snapshots(),
    builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
      if (!snapshot.hasData) {
        return LoadingAnimationBasic();
      }
      if (snapshot.data.data == null) {
        return LoadingAnimationBasic();
      } else {
        return ListView(
          shrinkWrap: true,
          children: _buildProfileGallery(snapshot),
        );
      }
    },
  ),
),

然后是函数:

_buildProfileGallery(AsyncSnapshot<DocumentSnapshot> snapshot) {
    int test = snapshot.data["URLs"].length;
    print('URLs in List: ' + test.toString());
    return snapshot.data.data.map(???);
}

我不知道该放什么作为这张地图的参数,因为提示文本太疯狂了:

MapEntry(K2, V2> f(String key, V value)

我什至无法猜测这意味着什么。

我在正确的轨道上吗?我在正确的星球上吗?

【问题讨论】:

    标签: firebase flutter firebase-storage


    【解决方案1】:

    去年,Firebase 的 Android、iOS 和 JavaScript 客户端 SDK 添加了列出文件的功能,但尚未加入 FlutterFire 绑定。

    您链接的问题的answer 指的是 FlutterFire 开源项目中添加此功能的pull request。因此,虽然有人编写了代码以允许在 Flutter 中列出文件,但到目前为止,该代码尚未添加到版本中。因此,现在使用该代码的唯一方法是为 firebase_storage 构建您自己的 FlutterFire 库版本。

    如果无法在 Firebase Storage API 中列出文件,您将不得不恢复到添加此功能之前每个人所做的事情:将文件列表保存在辅助位置,例如 Firebase 实时数据库或Cloud Firestore。

    【讨论】:

    • “将文件列表保存在辅助位置,例如 Firebase 实时数据库或 Cloud Firestore。”谢谢你,弗兰克。这是我昨晚在脑海中想出的解决方案,所以让你在这里确切地提到这个策略是一个很好的认可。如果我能做到这一点,我可能会在此处包含执行此操作的实际代码,以帮助其他人,因为我相信许多其他人都在等待 Flutter 团队真正开始修复他们的东西。
    • 当然,弗兰克,一旦我得到这个工作就会更新。这可能还不是正确的解决方案设计:P 希望能在一天左右的时间内完成并运行。
    • 我现在正在处理这个问题,弗兰克,我不确定最好的方法。在 Firebase 数据库中,我制作了一个名为“ProfileImages”的文档,其中包含一个名为“URLs”的字段,它是一个数组。第一个问题:当我向这个数组添加数据时,它只会覆盖前一个条目。但主要是,我无法弄清楚如何实际检索这些信息。我正在尝试: AsyncSnapshot 来获取数据,但我坚持的路线是:return snapshot.data.data.map(....) 我不确定它想从我这里得到什么。提示文字为:MapEntry(K2, V2> f(String key, V value)...... ?
    • 好吧,弗兰克,你似乎已经离开了,但我会在问题中用这种方法更新问题,希望如果你不在身边,其他人可能会提供帮助。这样做的问题是,当我在 Cloud Firestore 中保留参考列表以及存储中图像的 URL 时,我以后无法根据 URL 定位这些文件。所以我不能删除特定的图像,例如。添加到原始问题的代码。
    猜你喜欢
    • 2020-02-12
    • 2021-01-10
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2020-10-29
    • 2021-04-05
    • 2020-10-30
    相关资源
    最近更新 更多