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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:55:26