Flutter中获取Firebase新创建Cloud Firestore文档的Document ID并回传至调用函数的实现方案
Flutter中获取Firebase新创建Cloud Firestore文档的Document ID并回传至调用函数的实现方案
嗨,我来帮你解决这个问题!要获取Firestore新创建文档的ID并回传给上层调用函数,其实只要利用Firestore add方法的返回值,再调整一下你的函数返回逻辑就行,具体步骤如下:
1. 修改saveNewClient函数,让它返回新文档的ID
Firestore的add方法本身会返回一个DocumentReference对象,这个对象里的id属性就是新创建文档的唯一ID。我们需要把这个ID作为函数的返回值,所以修改函数的返回类型和内部逻辑:
// 用async/await写法更易读 Future<String> saveNewClient(client) async { // 调用add创建文档,拿到文档引用 final docReference = await _db.collection('client').add(client); // 返回文档ID return docReference.id; }
2. 调整saveClient函数,传递文档ID给上层
原来的saveClient是异步函数但没有返回值,现在我们让它await saveNewClient的结果,再把ID返回出去:
Future<String> saveClient(client, [clientId]) async { // 区分创建新文档和更新已有文档的场景 if (clientId == null) { // 调用saveNewClient获取新ID并返回 return await firestoreService.saveNewClient(client); } else { // 如果是更新已有文档,执行更新逻辑后返回原ID await _db.collection('client').doc(clientId).set(client); return clientId; } }
3. 在上层调用函数中获取文档ID
因为现在saveClient返回的是Future<String>,所以你需要在异步函数里用await来获取结果:
// 假设上层调用的逻辑在一个async函数中 void handleSaveClient() async { final clientNotifier = ref.read(clientNotifierProvider.notifier); final client = ref.read(clientNotifierProvider); // 等待saveClient完成,拿到新文档ID final newDocumentId = await clientNotifier.saveClient(client); // 拿到ID后就可以做你需要的操作了,比如更新状态、存储到变量等 print('新创建的文档ID:$newDocumentId'); }
关键要点说明
- 一定要确保所有涉及异步操作的函数都正确返回
Future类型,这样才能通过await或者.then()获取异步结果 - Firestore的
add、set、update等操作都是异步的,必须处理好异步逻辑,不然会出现拿不到值的情况
备注:内容来源于stack exchange,提问作者LostTexan
相关产品推荐
相关产品推荐

