我正在尝试将数据从FirestoreQueryDocumentSnapshot
类型映射到Object
自定义的,Class
但没有成功
这是我的课
class Food {
String name;
int price;
String image;
Food({this.name, this.price, this.image, });
}
下面的示例我在本地制作了数据并进行了正常工作
List<Food> foodType1Local = [
Food(
name: 'Food 1',
price: 10,
image: 'assets/food1.png',
),
Food(
name: 'Food 2',
price: 20,
image: 'assets/food2.png',
),
Food(
name: 'Food 3',
price: 30,
image: 'assets/food3.png',
),
];
List<Food> foodType2Local...
List<Food> foodType3Local...
下面的示例我在Cloud Firestore中制作了数据并获取它是一个问题
下面的示例我正在从Cloud Firestore获取数据,但出现错误 type 'QueryDocumentSnapshot' is not a subtype of type 'Food'
List foodType1Cloud = <Food>[];
List foodType2Cloud = <Food>[];
List foodType3Cloud = <Food>[];
getFoodType1Cloud() async {
QuerySnapshot snapshot = await FirebaseFirestore.instance.collection("foodType1").get();
foodType1Cloud.addAll(snapshot.docs);
foodType1Cloud.map((foodType1Data) {
Food(
name: foodType1Data['name'], //cant do --> name: foodType1Data[index]['name'],
price: foodType1Data['price'], //cant do --> price: foodType1Data[index]['price'],
image: foodType1Data['image'], //cant do --> image: foodType1Data[index]['image'],
);
}).toList();
}
getFoodType2Cloud()...
getFoodType3Cloud()...
如果我尝试从本地数据中获取代码,则这是代码的主体,它可以正常工作,但是当我从云存储中获取信息时却无法正常工作
//tabs of length "3"
body: TabBarView(
children: [
Container(
margin: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
child: Column(
children: <Widget>[
buildFoodList(foodType1Local),
],
),
),
Container(
margin: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
child: Column(
children: <Widget>[
buildFoodList(foodType1Loca2),
],
),
),
Container...
],
),
这再次是代码的主体,但是如果我尝试从Cloud Firestore提取,则会显示错误type 'QueryDocumentSnapshot' is not a subtype of type 'Food'
body: TabBarView(
children: [
Container(
margin: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
child: Column(
children: <Widget>[
buildFoodList(foodType1Cloud),
],
),
),
Container(
margin: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
child: Column(
children: <Widget>[
buildFoodList(foodType2Cloud),
],
),
),
Container...
],
),
我认为buildFoodList
代码也是必要的,所以我以防万一
Widget buildFoodList(List foods) {
return Expanded(
child: GridView.builder(
itemCount: foods.length,
physics: BouncingScrollPhysics(),
gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: 0.8,
mainAxisSpacing: 20,
crossAxisSpacing: 20,
),
itemBuilder: (context, index) {
return FoodCard(foods[index]);
},
),
);
}
在snapshot.docs
返回的所有文档的安阵QuerySnapshot
,显然它不是一个类型的Food
。
现在,您必须遍历文档数组,并使用data
提供该快照所有数据的成员。使用该数据,您可以将其转换为所需的任何类型的实例。
所以,代替这个
foodType1Cloud.addAll(snapshot.docs);
将文档内容转换为您的自定义对象,并将其添加到列表中
snapshot.docs.forEach(doc => {
Map<String, dynamic> obj = doc.data;
// convert this Map to your custom object and add it to your list
});
在扑朔迷离中,您可以使用json_serializable进行此转换!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句