Ну, а в сообщении об ошибке говорится, что snapshot.value - это не список, а карта, поэтому строка List map = snapshot.value; всегда будет неудачной.Поскольку вы читаете дерево узлов компаний из вашей базы данных, будет возвращена карта карт, что-то вроде Map<String, Map<dynamic,dynamic>>
со всеми данными из соответствующего узла.Я предоставлю вам функцию, которая будет анализировать ваши данные Json в объекте Company, и я оставлю некоторые комментарии в исходном коде, чтобы попытаться объяснить вам процесс.Это просто.
List<Company> _parseData(DataSnapshot dataSnapshot) {
List<Company> companyList =new List();
// here you replace List map = snapshot.value with...
Map<String, dynamic> mapOfMaps = Map.from( dataSnapshot.value );
//actually dynamic here is another Map, String are the keys like -LXuQmyuF7E... or LXuSkMdJX...
//of your picture example and dynamic other Map
//in next lines we will interate in all values of your map
//remeber that the values are maps too, values has one map for each company.
//The values are Map<String, dynamic>
//in this case String are keys like category, company_name, country, etc...
//and dynamics data like string, int, float, etc
//parsing and adding each Company object to list
mapOfMaps.values.forEach( (value) {
companyList.add(
//here you'll not use fromSnapshot to parse data,
//i thing you got why we're not using fromSnapshot
Company.fromJson( Map.from(value) )
);
});
return companyList;
}
Обратите внимание, что вы будете использовать Company.fromSnapshot (снимок), когда читаете конкретную компанию из вашей базы данных, что-то вроде ...
// just to illustrate
var snapshot = await FirebaseDatabase.instance
.reference()
.child("Companies")
.child(companyId).once();
Company.fromSnapshot( snapshot );
, потому что в этом случаеsnapshot.value представляет собой одну карту.Что ж, другое дело, взгляните на ваш метод initState в вашем виджете statefull, я не знаю, является ли хороший подход вызовом setState внутри метода initState даже после выполнения в будущем.Это всего лишь совет.