в моем приложении флаттера я хочу добавить новые массивы 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;
});
}
В вашем случае вам нужно передать объект методу 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)
, чтобы иметь возможность преобразовывать данные Cloud Firestore в ваши объекты и преобразовывать эти объекты в модели Firestore.
Если вы хотите создать новое поле, представляющее собой массив, просто передайте массив.
FirebaseFirestore.instance.
collection('users').
doc(uid).
set({
"arrayData": [ map ]
},SetOptions(merge: true)
Это создаст массив с одним элементом. Просто добавьте больше элементов карты в массив в квадратных скобках, если вам нужно больше.
FieldValue.arrayUnion()
используется только тогда, когда вам нужно добавить больше элементов в существующее поле массива.
"arrayData": FieldValue.arrayUnion([ map ]) Я изменил коды вот так, это именно то, что мне нужно :D
Когда я пытаюсь добавить новый элемент в этот список, он просто стирает список и помещает только элемент, который был добавлен последним, как мне решить эту проблему?
Вы имеете в виду, что не знаете, что такое json, или не знаете, какие поля вы получите?