# #firebase #flutter #dart #google-cloud-firestore
Вопрос:
Я пытался добавить несколько документов Firestore из одной коллекции в другую в своем приложении flutter, и до сих пор это самое близкое, что я смог сделать.
Я попытался вручную создать карту, считывающую данные Firestore, а затем сохранить ее обратно в Firestore в другой коллекции forEach()
, но это не удалось.
Я использовал ту же функцию, что и ниже, forEach()
с жестко закодированным массивом:
var myArray69 = [
{
'name': 'a',
'brand': 'bruh'
},
{
'name': 'b'
}
];
myArray69.forEach((doc) => {
FirebaseFirestore.instance.collection('myOtherCollection69').add(doc)});
и он добавляет каждый массив в качестве документа в Firestore просто отлично, поэтому я пытался воспроизвести его, используя данные из другой коллекции, но безуспешно.
Вот мой код:
Widget _foodList(){
return Expanded(
child: StreamBuilder(
stream: FirebaseFirestore.instance
.collection('foodShelf')
.snapshots(),
builder: buildFoodList,
),
);
}
Widget buildFoodList(BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasData) {
return ListView.builder(
itemCount: snapshot.data.docs.length,
itemBuilder: (BuildContext context, int index) {
DocumentSnapshot food = snapshot.data.docs[index];
var foodName = food.get('foodName');
var someMap = {
"a": foodName,
"b": '2',
};
return GestureDetector(
key: Key(food.id),
onTap: () {
someMap.forEach((doc) => { // <----- First error is here
FirebaseFirestore.instance.collection('myOtherCollection69').add(doc)});
print(someMap);
},
child: ListTile(
title: Text(foodName),
),
);
}
);
}
Если я прокомментирую этот раздел:
someMap.forEach((doc) => {
FirebaseFirestore.instance.collection('myOtherCollection69').add(doc)});
Оставьте только print(someMap);
то, и я нажму на один из результатов на экране, я получу карту в консоли:
I/flutter ( 6922): {a: Pure 100% florida orange juice, b: 2}
Но я не могу добавить его в Firestore с помощью этого кода, я получаю следующие ошибки:
- Первая ошибка:
The argument type 'Set<Future<DocumentReference<Map<String, dynamic>>>> Function(String)' can't be assigned to the parameter type 'void Function(String, dynamic)'.dart(argument_type_not_assignable)
- Вторая ошибка:
The argument type 'String' can't be assigned to the parameter type 'Map<String, dynamic>'.dart(argument_type_not_assignable)
Любая помощь будет очень признательна!
Ответ №1:
Проблема в том , что у вас myArray69
есть a List
из a Map<String, String>
,
там forEach
цикл даст результат в a Map
, который принимается add(doc)
методом.
В Map
списке Map
есть пункт, подобный этому:
myArray69.forEach(void Function(Map<String, String>) function)
.
Но
ваша someMap
переменная Map
сама по себе является a.
Поэтому, если бы вы использовали forEach
ее, она дала бы вам 2 значения.
Один как a key
, а другой как a value
, назначенный ключу.
forEach
Операция дала бы:
someMap.forEach((key, value) => print([key, value]));
Поэтому, чтобы ответить на ваш вопрос, вы должны напрямую добавить Map
его, а не зацикливать. Пример:
onTap: () {
FirebaseFirestore.instance.collection('myOtherCollection69').add(someMap);
print(someMap);;
},
Ответ №2:
Удивительно, но после многочасовой борьбы с этим я публикую вопрос и сразу же соображаю, как решить свою проблему.
Внес это изменение в мою пользовательскую карту, и это заставило ее работать (добавить документ в firestore):
(-) var someMap = {
"a": foodName,
"b": '2',
};
( ) List<Map<String, String>> someMap = [
{
"a": foodName,
"b": '2',
}
];
Сейчас я все еще пытаюсь добавить ВСЕ документы из одной коллекции в другую сразу.