将Firestore数据转为ItemModel并加入列表后,打印仅显示模型实例问题
问题描述
我从Firestore获取数据并转换为ItemModel实例,再将这些实例添加到同类型列表中。检查时发现:单独打印快照中的字段(如title)能显示有效文本,但打印整个列表时,输出的都是ItemModel类的实例标识,而非预期的具体数据内容。
相关代码
从Firestore获取数据的代码
List<ItemModel> allProducts = []; Future<List<ItemModel>> getAllProducts() async { final QuerySnapshot snapshot = await FirebaseFirestore.instance.collection('Products').get(); List<ItemModel> _allProducts = []; for (var doc in snapshot.docs) { print(doc['title']); _allProducts.add(ItemModel( description: doc['description'], id: doc['id'], imagepath: doc['imagepath'], price: doc['price'], title: doc['title'], amount: doc['amount'])); } return _allProducts; } Future newList() async { print(allProducts); allProducts = await getAllProducts(); print(allProducts); } @override void initState() { newList(); super.initState(); }
ItemModel类代码
class ItemModel with ChangeNotifier { final String title; final int price; bool isCarted; final String id; // 产品名称 int amount; // 上传者设置的数量 String description; // 产品描述 String imagepath; // 产品图片路径 bool isfavourited; // 是否已收藏 ItemModel({ required this.id, this.isCarted = false, required this.price, required this.title, this.amount = 1, required this.description, required this.imagepath, this.isfavourited = false, }); factory ItemModel.fromMap(Map map) { return ItemModel( id: map['id'], isCarted: map['isCarted'], isfavourited: map['isfavourited'], amount: map['amount'], price: map['price'], title: map['title'], description: map['description'], imagepath: map['imagepath'], ); } factory ItemModel.fromFirestore( DocumentSnapshot<Map<String, dynamic>> snapshot) { final data = snapshot.data(); return ItemModel( id: data!['id'], isCarted: data['isCarted'] as bool, isfavourited: data['isFavourited'] as bool, amount: data['amount'] as int, price: data['price'] as int, title: data['title'], description: data['description'], imagepath: data['imagepath'], ); } }
解决方案
这种情况是因为Dart中直接打印对象时,默认输出类的实例标识(如Instance of 'ItemModel'),而非对象的具体属性内容。要让打印列表时能看到清晰的数据,需在ItemModel类中重写toString()方法:
@override String toString() { return 'ItemModel{title: $title, price: $price, id: $id, amount: $amount, description: $description, imagepath: $imagepath, isCarted: $isCarted, isfavourited: $isfavourited}'; }
重写后,再次打印allProducts列表,就能看到每个ItemModel实例的具体属性值,方便调试和验证数据转换是否正确。
另外,建议在getAllProducts方法中使用已定义的fromFirestore工厂构造函数,让代码更简洁统一:
Future<List<ItemModel>> getAllProducts() async { final QuerySnapshot snapshot = await FirebaseFirestore.instance.collection('Products').get(); return snapshot.docs.map((doc) => ItemModel.fromFirestore(doc)).toList(); }
内容的提问来源于stack exchange,提问作者Olabanjo Olakunori
相关产品推荐
相关产品推荐

