Flutter Firestore добавить карту внутри массива

#flutter #google-cloud-firestore

# #трепетание #google-облако-firestore

Вопрос:

в моем приложении flutter я хочу добавить новые массивы firestore со стилем карты, подобным этому :

введите описание изображения здесь

но я не мог. Я использую эту функцию для добавления массива, но она так не работает. этот код добавляет массив подобным образом, например:

введите описание изображения здесь

Как я могу изменить этот код для добавления массива, подобного изображению один?

 void addData2() {
final FirebaseAuth auth = FirebaseAuth.instance;
final User user = auth.currentUser;
final uid = user.uid;

var map = new Map<String, dynamic>();
map['doOne'] = do1TextEditingController.text ;
map['doTwo'] = do2TextEditingController.text ;


FirebaseFirestore.instance.
collection('users').
doc(uid).
set({

  "arrayData": FieldValue.arrayUnion([
    map['doOne'],
    map['doTwo']

  ])

},SetOptions(merge: true)

).catchError((e) {
  print(e);
});

setState(() {
  isLoadingThree = false;
});

 }
 

Ответ №1:

Если вы хотите создать новое поле, представляющее собой массив, просто передайте массив.

 FirebaseFirestore.instance.
collection('users').
doc(uid).
set({
  "arrayData": [ map ]
},SetOptions(merge: true)
 

Это создаст arry с одним элементом. Просто добавьте больше элементов карты в массив в квадратных скобках, если вам нужно больше.

FieldValue.arrayUnion() используется только тогда, когда вам нужно добавить дополнительные элементы в существующее поле массива.

Комментарии:

1. «arrayData»: значение поля. arrayUnion([карта ]) Я изменил коды следующим образом, это именно то, что мне нужно: D

2. Когда я пытаюсь добавить новый элемент в этот список, он просто стирает список и помещает только тот элемент, который был нажат последним, как мне это решить?

Ответ №2:

В вашем случае вам необходимо передать объект arrayUnion методу, чтобы иметь возможность создавать карты в firebase. В настоящее время вы передаете только значения, поэтому он создает массив значений. Рабочий пример был бы таким:

 // my code
var yourObject = new Map<String, dynamic>();

yourObject["one"] = 1;
yourObject["two"] = 2;
yourObject["three"] = false;
yourObject["four"] = "text";
yourObject["five"] = [
  1,2,3,4
];
yourObject["six"] = [
  {
    "nestedOne": 1,
    "nestedTwo": false,
  },
  {
    "nestedThree": 2,
    "nestedFour": true,
  },
];

var encodedObject = json.encode(yourObject);

print(encodedObject);

// your code
FirebaseFirestore.instance.
collection('users').
doc(uid).
set({

  "arrayData": FieldValue.arrayUnion([
    encodedObject 
  ])

},SetOptions(merge: true)

).catchError((e) {
  print(e);
});
 

Однако лучше создать Class для вашей модели документа firebase и создать методы toMap() и именованный конструктор ClassName.fromMap(Map<String, dynamic> json) , чтобы иметь возможность преобразовывать облачные данные Firestore в ваши объекты и преобразовывать эти объекты в модели Firestore.

Комментарии:

1. Вы имеете в виду, что вы не знаете, что такое json, или вы не знаете, какие поля вы получите?