#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, или вы не знаете, какие поля вы получите?