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


实现方案
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
相关产品推荐
相关产品推荐

