在flutter中使用Converter时,如何获取firestore文档的documentId



我正在阅读firestore flutter sdk文档。它展示了如何使用可序列化类自动将文档转换为对象,示例如下:

class Movie {
Movie({required this.title, required this.genre});
Movie.fromJson(Map<String, Object?> json)
: this(
title: json['title']! as String,
genre: json['genre']! as String,
);
final String title;
final String genre;
Map<String, Object?> toJson() {
return {
'title': title,
'genre': genre,
};
}
}

然后使用添加功能创建一个新文档:

await moviesRef.add(
Movie(
title: 'Star Wars: A New Hope (Episode IV)',
genre: 'Sci-fi'
),
);

添加新文档后或查询时如何获取documentId?

我以前尝试过实现这样的行为,在Firebase Firestore中,要么调用moviesRef.add(),然后Firebase将添加一个具有完全自动生成的uid的新文档,要么如果您有一个特定的uid,那么您可以只使用moviesRef.doc(hereTheId).set()

然而,moviesRef.add()返回一个DocumentReference,您可以从中获得它。例如:

使用then:

collection('students').add(/*...*/)

则((val)=>print(val.documentID)});

使用wait/async:

final newDocument = await moviesRef.add(/*...*/);
print(newDocument.documentID);

您也可以在发送请求之前获得一个完全自动生成的uid,然后像这样调用moviesRef.doc(hereTheId).set()

final String id  = moviesRef.doc().id;
moviesRef.doc(id).set(/*...*/)`

希望这能有所帮助。

我认为我们还需要操作Ref,以便能够像您上面提到的那样使用add方法,该方法将获得Future<DocumentReference> add(Movie data) Returns a DocumentReference with an auto-generated ID, after populating it with provided data.

如下所示:

final moviesRef = FirebaseFirestore.instance.collection('movies').withConverter<Movie>(
fromFirestore: (snapshot, _) => Movie.fromJson(snapshot.data()!),
toFirestore: (movie, _) => movie.toJson(),
);

在添加它的同时,你需要添加文档id,你可以这样实现:

final moviesRef =
FirebaseFirestore.instance.collection('movies').withConverter<Movie>(
fromFirestore: (snapshot, _) => Movie.fromJson(snapshot.data()!),
toFirestore: (movie, _) => movie.toJson(),
);
// Add a movie
DocumentReference docreference = await moviesRef.add(
Movie(title: 'Star Wars: A New Hope (Episode IV)', genre: 'Sci-fi'),
);
String id = docreference.id;
debugPrint('documentId: $id'); // will give you the added Document documentId.

最新更新