Flutter Назначение QuerySnapshot для карты <dynamic, dynamic>

avatar
Ghufran Ataie
8 августа 2021 в 21:53
240
2
1

Я пытаюсь получить некоторые данные пункта меню, такие как название меню, значок текста слогана и проверить данные из firebase firestore с помощью флаттера, но в службах функции getMenus() базы данных я сталкиваюсь с ошибкой.

У меня есть следующая модель класса

import 'dart:convert';

MenuModel medicalTestModelFromJson(String str) => MenuModel.fromJson(json.decode(str));
String medicalTestModelToJson(MenuModel data) => json.encode(data.toJson());

class MenuModel {
  MenuModel({
    required this.title,
    required this.slogan,
    required this.icon,
    required this.verify,
  });

  String title;
  String slogan;
  String icon;
  bool verify;

  factory MenuModel.fromJson(Map<String, dynamic> json) => MenuModel(
    title: json["title"],
    slogan: json["slogan"],
    icon: json["icon"],
    verify: json["verify"],
  );

  Map<String, dynamic> toJson() => {
    "title": title,
    "slogan": slogan,
    "icon": icon,
    "verify": verify,
  };
}

И ниже приведены службы сбора меню из firebase firestore

class MenuServices{

  static Future<List<MenuModel>> getMenus() async {
    QuerySnapshot menuSnapshot = await FirebaseFirestore.instance.collection('homeItems').where("verify", isEqualTo: true).get();
    List<MenuModel> menus =[];
    Map<dynamic, dynamic> values = menuSnapshot.docs; //(***My Error is Exactly in this line which menuSnapshot.docs is not recognizing***)
    values.forEach((key, values) {
      menus.add(MenuModel.fromJson(values));
    });
    return menus;
  }
}

И ошибка

A value of type 'List<QueryDocumentSnapshot<Map<String, dynamic>>>' can't be assigned to a variable of type 'Map<dynamic, dynamic>
Источник

Ответы (2)

avatar
Huthaifa Muayyad
8 августа 2021 в 22:02
1

Замените на это:

class MenuServices{

  static Future<List<MenuModel>> getMenus() async {
    QuerySnapshot menuSnapshot = await FirebaseFirestore.instance.collection('homeItems').where("verify", isEqualTo: true).get();

    List<MenuModel> menus = menuSnapshot.docs.map(
    (e)=> MenuModel.fromJson(e.data() as Map<String, dynamic>)).toList();
   
    return menus;
  }
}
Ghufran Ataie
9 августа 2021 в 02:32
0

Большое спасибо за ваш ответ, я вношу изменения на основе вашего предложения, но теперь у меня есть еще одна ошибка именно в (e.data ()) и ошибка: Тип аргумента «Объект?» не может быть присвоен типу параметра «Map<String, dynamic>

avatar
Lindomar Farineli
30 сентября 2021 в 17:59
0

Я использовал это, и это сработало:

void getLeituras(QuerySnapshot snapshot){

    List leituras = [];
    Leitura leitura;
    snapshot.docs.forEach((e) {
      leitura = Leitura();
      leitura = Leitura.fromJson(e.data as Map<String, dynamic>);
      leituras.add(leitura);

    });  
}