Flutter中使用withConverter时如何获取Firestore文档的documentId?
获取Firestore文档ID的两种场景实现
一、添加新文档后获取documentId
使用add()方法创建文档时,该方法会返回一个DocumentReference对象,通过它的id属性就能直接拿到自动生成的文档ID。修改添加逻辑如下:
// 添加文档并获取ID final docRef = await moviesRef.add( Movie( title: 'Star Wars: A New Hope (Episode IV)', genre: 'Sci-fi' ), ); // 提取生成的documentId String documentId = docRef.id;
如果需要把文档ID绑定到Movie对象中,可以扩展类结构,新增documentId字段,在创建文档后手动赋值:
class Movie { Movie({required this.title, required this.genre, this.documentId}); Movie.fromJson(Map<String, Object?> json) : this( title: json['title']! as String, genre: json['genre']! as String, documentId: json['documentId'] as String?, ); final String title; final String genre; final String? documentId; Map<String, Object?> toJson() { return { 'title': title, 'genre': genre, if (documentId != null) 'documentId': documentId!, }; } } // 添加文档后给Movie对象赋值ID final movie = Movie(title: 'Star Wars...', genre: 'Sci-fi'); final docRef = await moviesRef.add(movie.toJson()); Movie savedMovie = Movie( title: movie.title, genre: movie.genre, documentId: docRef.id, );
二、查询文档时获取documentId
查询返回的每个结果是QueryDocumentSnapshot对象,它的id属性对应文档ID,同时可通过data()方法读取文档内容并转成Movie对象:
1. 单个文档查询
final docSnapshot = await moviesRef.doc('目标文档ID').get(); if (docSnapshot.exists) { String documentId = docSnapshot.id; Movie movie = Movie.fromJson(docSnapshot.data() as Map<String, Object?>); }
2. 批量文档查询
final querySnapshot = await moviesRef.get(); for (var doc in querySnapshot.docs) { String documentId = doc.id; Movie movie = Movie.fromJson(doc.data() as Map<String, Object?>); }
如果想直接从快照生成带ID的Movie对象,可以封装一个转换方法:
Movie movieFromSnapshot(QueryDocumentSnapshot snapshot) { return Movie( title: snapshot['title']! as String, genre: snapshot['genre']! as String, documentId: snapshot.id, ); } // 批量转换示例 final querySnapshot = await moviesRef.get(); List<Movie> movies = querySnapshot.docs.map(movieFromSnapshot).toList();
内容的提问来源于stack exchange,提问作者PortalGamesMais
相关产品推荐
相关产品推荐

