Flutter使用cloud_firestore解析DocumentSnapshot时[]运算符报错怎么解决
错误原因
- 你使用的
cloud_firestore: ^3.1.0属于空安全升级后的2.0+版本,该版本对DocumentSnapshot的API做了破坏性调整:原来直接读取的snapshot.data属性改为了需要调用的data()方法,返回类型为Map<String, dynamic>?,所以直接对方法类型使用[]取值就会触发你遇到的报错。 - 你的代码还存在两处隐藏问题:1. 没有声明
BRAND、SALE、CATEGORY常量;2. 没有定义_brand、_category、_sale三个私有成员变量,后续运行也会报错。
修复方案
直接替换你的ProductModel类代码为以下内容即可:
import 'package:cloud_firestore/cloud_firestore.dart'; class ProductModel { static const ID = "id"; static const NAME = "name"; static const PICTURE = "picture"; static const PRICE = "price"; static const DESCRIPTION = "description"; // 补全缺失的常量 static const BRAND = "brand"; static const CATEGORY = "category"; static const SALE = "sale"; // 补全缺失的私有成员变量,可根据实际字段类型调整 String _id; String _name; String _picture; String _description; String _brand; String _category; bool _sale; String get id => _id; String get name => _name; String get picture => _picture; String get brand => _brand; String get category => _category; String get description => _description; bool get sale => _sale; ProductModel.fromSnapshot(DocumentSnapshot snapshot) { // 先调用data()方法获取数据Map,做类型转换 Map<String, dynamic> data = snapshot.data() as Map<String, dynamic>; _id = data[ID]; _brand = data[BRAND]; _sale = data[SALE]; _description = data[DESCRIPTION] ?? " "; // 剩余字段按业务需求补全取值即可 _name = data[NAME] ?? ""; _picture = data[PICTURE] ?? ""; _category = data[CATEGORY] ?? ""; } }
如果你的部分字段可能存在空值,也可以把对应的变量类型改成可空类型(比如String? _name)避免空安全报错。
内容的提问来源于stack exchange,提问作者Dastan Kurdish
相关产品推荐
相关产品推荐

