You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Flutter在Firestore中存储关联多条项目的文件夹列表

文件夹列表
带URL的文件列表

实现方案

1. Firestore 数据结构设计

推荐使用「父集合 + 子集合」的层级结构,完全匹配文件夹到视频的从属关系,查询和扩展都更灵活:

  • 顶层创建名为 folders 的集合,每个文档对应一个文件夹,必填字段如下,可按需扩展其他字段:
    • folderName: 字符串,存储文件夹名称
    • createTime: 时间戳,记录文件夹创建时间
    • coverUrl(可选): 字符串,存储文件夹封面图地址
  • 每个folders集合下的文档,单独挂载名为 videos 的子集合,子集合内每个文档对应一个视频文件,必填字段如下:
    • videoName: 字符串,存储视频文件名
    • videoUrl: 字符串,存储从mega平台获取的视频播放地址
    • duration(可选): 数字,存储视频时长
    • uploadTime: 时间戳,记录视频添加时间

如果单个文件夹下的视频数量不超过100条,也可以把所有视频数据存在文件夹文档的videoList数组字段里,但数据量大的时候查询和分页性能不如子集合方案,更推荐用子集合的方式。

2. Flutter 端操作代码示例

新增文件夹

Future<void> addFolder(String folderName) async {
  await FirebaseFirestore.instance.collection('folders').add({
    'folderName': folderName,
    'createTime': FieldValue.serverTimestamp(),
  });
}

给指定文件夹新增视频

Future<void> addVideoToFolder(String folderId, String videoName, String videoUrl) async {
  await FirebaseFirestore.instance
      .collection('folders')
      .doc(folderId)
      .collection('videos')
      .add({
    'videoName': videoName,
    'videoUrl': videoUrl,
    'uploadTime': FieldValue.serverTimestamp(),
  });
}

查询所有文件夹列表

Stream<QuerySnapshot> getFolderList() {
  return FirebaseFirestore.instance
      .collection('folders')
      .orderBy('createTime', descending: true)
      .snapshots();
}

查询指定文件夹下的所有视频

Stream<QuerySnapshot> getVideoList(String folderId) {
  return FirebaseFirestore.instance
      .collection('folders')
      .doc(folderId)
      .collection('videos')
      .orderBy('uploadTime', descending: true)
      .snapshots();
}

3. 视频播放对接

从Firestore查询拿到videoUrl字段之后,直接传给pub.dev上的视频播放器包(如video_player、chewie等)就可以直接加载播放,不需要额外转换处理。

另外记得提前配置Firestore安全规则,避免未授权的用户篡改你的数据。


内容的提问来源于stack exchange,提问作者Luqman Tuke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 04:00:00