【问题标题】:flutter firestore, add new object in array颤动firestore,在数组中添加新对象
【发布时间】:2019-05-08 23:04:58
【问题描述】:

我有一个对象数组,我想在用户在数组中输入新数据时添加新对象?

Firestore.instance.collection(city).document('Attractions').updateData(
                        "data", FieldValue.arrayUnion(obj)
                      );

这显示错误,我怎样才能用颤振实现这个?

【问题讨论】:

  • 使用更新的代码和新的错误编辑您的问题

标签: firebase flutter google-cloud-firestore


【解决方案1】:

正确的格式是:

Firestore.instance.collection(city).document('Attractions').updateData({"data": FieldValue.arrayUnion(obj)});

updateDataMap<String,dynamic> 为数据。

在您的代码中,您将 , 作为键值之间的分隔符,而不是 :

【讨论】:

  • 感谢您的帮助,我试过了,但现在我收到错误:
  • 错误状态:参数类型'Map'不能分配给参数类型'List'
  • 您需要添加更多代码供我调试。另外,新错误也可能是其他代码区域。
  • FieldValue.arrayUnion 接受一个列表。使用它,它应该可以解决您的错误 - Firestore.instance.collection(city).document('Attractions').updateData({"data": FieldValue.arrayUnion([obj])});
【解决方案2】:

@anmol.majhail 是对的,但要解决@Sami Ullah 的问题,您必须先制作一个列表并将对象添加到列表中,如下所示:

var list = [objectBeingAdded];
Firestore.instance.collection('city').document('Attractions').updateData({"data": FieldValue.arrayUnion(list)});

【讨论】:

  • 在 Firestore 中更新数据时,您在哪里使用“列表”对象?
  • 他的意思是在 FieldValue.arrayUnion(obj) 中使用它而不是 'obj'。更简单的方法就是做 FieldValue.arrayUnion([obj]).
  • @AlexHartford 我知道,我只是认为如果我用两个陈述而不是一个陈述会更容易理解和注意
  • 你仍然需要用你当前的答案更正 obj -> list。
  • 用 [] 包装 obj 为我做了。谢谢。
【解决方案3】:

这是我构建的一个工作函数,它将新地图添加到我的 Firestore 服务类中的一个数组中。我正在使用 Json Serializable 来注释我所有的模型类。 userTemplateSections 是我的 userTemplate firestore 文档中的一个数据字段。我将 userTemplate 作为“addUserTemplateSection”函数的构造函数,以确保我正在编辑正确的文档。

我还添加了从 Firestore 文档数组中删除地图的功能。

'''

Future<void> addUserTemplateSection(
      {UserTemplate userTemplate, String title, String summary}) async {
    try {
      final UserTemplateSection userTemplateSection =
          UserTemplateSection(title: title, summary: summary);
      await _firestore
          .document(FirestorePath.userTemplate(uid, userTemplate.id))
          .updateData(
        {
          'userTemplateSections':
              FieldValue.arrayUnion([userTemplateSection.toJson()])
        },
      );
    } catch (e) {
      print(e);
    }
  }

'''

'''

Future<void> deleteUserTemplateSection({
    UserTemplate userTemplate,
    UserTemplateSection userTemplateSection,
  }) async {
    try {
      await _firestore
          .document(FirestorePath.userTemplate(uid, userTemplate.id))
          .updateData(
        {
          'userTemplateSections':
              FieldValue.arrayRemove([userTemplateSection.toJson()])
        },
      );
    } catch (e) {
      print(e);
    }
  }

'''

【讨论】:

    【解决方案4】:

    空安全码:

    说这是你要添加的数据

    Map<String, dynamic> someData = {
      'foo': 1,
      'bar': true,
    };
    
    • 添加具有唯一自动生成 ID 的数据:

      var collection = FirebaseFirestore.instance.collection('collection');
      collection 
          .add(someData) 
          .then((_) => print('Added'))
          .catchError((error) => print('Add failed: $error'));
      
    • 使用您自己的 ID 添加数据:

      var collection = FirebaseFirestore.instance.collection('collection');
      collection 
          .doc('document_id') // <-- Document ID
          .set(someData) 
          .then((_) => print('Added'))
          .catchError((error) => print('Add failed: $error'));
      
    • 将对象添加到数组中:

      var collection = FirebaseFirestore.instance.collection('collection');
      collection 
          .doc('document_id') // <-- Document ID
          .set({'data': FieldValue.arrayUnion(list)}) // <-- Add data
          .then((_) => print('Added'))
          .catchError((error) => print('Add failed: $error'));
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-25
      • 2020-06-07
      • 1970-01-01
      • 2021-03-18
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多