dart Firestore .set方法每次都会为我的对象产生新的ID-需要解决方案

7d7tgy0s  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(99)

我正在使用Firestore和Dart,遇到了一个与创建文档ID相关的问题。每次我使用.set()方法修改文档时,都会创建一个新文档,因为MyObject的ID字段(id)返回null。
下面是我当前代码的一个简化示例:

class ObjectOverview extends StatefulWidget {
  ...
}

class _State extends State<ObjectOverview> {
  List<MyObject> objects = [];
  ...
  trailing: Row(
    ...
    await widget.firestoreService.setMyObject(objects[index]);
  );
}

class FirestoreService {
  ...
  Future<void> setMyObject(MyObject myObject) async {
    await _firestore.collection('my_objects').doc(myObject.id).set(myObject.toJson());
  }
}

class MyObject {
  String? id;
  String name;
  String userId;
  ...
  MyObject.fromJson(Map<String, dynamic> json):
    id = json['id'],
    ...
}

class AppUser {
  String? id;
  ...
}

我已经集思广益了一些可能的解决方案,但我不确定最好的方法:

  • 通过让Firestore在添加文档之前创建ID来填充id字段,最终的objRef = db.collection(“my_objects”).doc();缺点是我会存储两次ID。
  • 添加文档后,将www.example.com设置MyObject.id为Firestore返回的ID。但是,不能保证为MyObject示例设置了ID。
  • 从MyObject中删除id字段,并创建一个Map<String,MyObject>,将ID存储在MyObject示例中。

鉴于上述解决方案,是否有其他潜在的方法来处理这种情况?哪种解决方案更可取?感谢您的每一个建议!
有没有关于哪种方法更可取的建议?还是有别的解决办法我没考虑过我很感激任何帮助!

j1dl9f46

j1dl9f461#

为了解决这个问题,我建议您首先通过调用CollectionReference对象上的doc()方法来生成文档ID。此方法返回一个DocumentReference类型的对象,因此您可以在类中使用id属性,其中包含:
文档在集合中的给定ID。
一旦生成了文档的ID(这是在客户端执行而不是在服务器上执行的操作),您就可以在myObject对象中设置ID的值并在Firestore中执行写入操作。

相关问题