Аргумент «Установить<Будущее<Ссылка на документ<Карта>>>>> Функция(строка)» не может быть присвоен типу параметра » Функция void(строка, динамическая)»

# #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',
      }
    ];
 

Сейчас я все еще пытаюсь добавить ВСЕ документы из одной коллекции в другую сразу.