我有DatabaseService类,在其中维护和更新数据。我正在使用 map 动态更新Firebase中某些集合的文档数据,但是我无法成功更新所有我正在使用简单的forEach从Map提取数据并将其存储在Firebase中的数据
import 'package:home_crisp/models/user.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
class DatabaseService {
// collection reference is just reference for certain collection
final CollectionReference chefCollection =
Firestore.instance.collection('chef');
final String uid;
DatabaseService({this.uid});
Future updateChefData(Map<String, dynamic> dataMap) async {
// await chefCollection.document(uid).setData({
// 'chefName': chefName,
// 'chefPhNo': chefPhNo,
// 'chefDateOfBirth': chefDateOfBirth,
// });
dataMap.forEach(
(key, value) async {
await chefCollection.document(uid).setData({
key: value, // Key represent the field key and value is actual value of firebase document i.e. chefName: "Peter"
});
},
);
}
在“chefRegistration”类中,我将值封装在Map中并将其发送到dataServices中的updateChefData函数
class chefRegistration extends StatefulWidget {
@override
_chefRegistrationState createState() => _chefRegistrationState();
}
class _chefRegistrationState extends State<chefRegistration> {
@override
Widget build(BuildContext context) {
final user = Provider.of<User>(context);
// ~
// ~
// Some Code
// ~
// ~
FlatButton(
onPressed: () async {
Map<String, dynamic> dataMap = {
'chefName': this.chefName,
'chefPhNo': this.phoneNo,
'chefDateOfBirth': this.dateOfBirth,
};
await DatabaseService(uid: user.uid).updateChefData(dataMap);
}
}
以下是我希望其工作方式的屏幕截图
但问题在于它仅更新了dateOfBirth的文档的最后一个字段
最佳答案
您将要使用updateData()而不是setData()。或者,您可以将merge: true
作为第二个参数传递给setData()。
关于firebase - 如何使用flutter中的Map在Firestore中动态添加特定集合的文档的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61580359/