Flutter迁移Riverpod 2.0 Notifier Provider时字段访问错误求助
修复Riverpod 2.0 Notifier中fromFirestore构造器的错误
问题根源
你把fromFirestore方法错误定义在了UsersNotifier类里,但该方法本质是用来创建Users实例的构造逻辑,且UsersNotifier本身并没有cellPhone、address1这些字段——这些字段都属于Users类,所以初始化列表会提示字段不存在的错误。同时你调用代码里用的是Users.fromFirestore,说明这个方法应该属于Users类。
解决方案
1. 将fromFirestore改为Users类的工厂构造函数
把构造逻辑移到Users类内部,用工厂构造函数实现从Firestore数据创建Users实例:
class Users { String? userId; String? fName; String? lName; String? address1; String? address2; String? city; String? state; String? zipCode; String? cellPhone; String? officePhone; String? email; String? companyId; String? companyName; String? mlsId; String? mls; Users({ this.userId, this.fName, this.lName, this.address1, this.address2, this.city, this.state, this.zipCode, this.cellPhone, this.officePhone, this.email, this.companyId, this.companyName, this.mlsId, this.mls, }); // 新增工厂构造函数,实现从Firestore数据生成Users实例 factory Users.fromFirestore(Map<String, dynamic> firestore) { return Users( userId: firestore['userId'], fName: firestore['fName'], lName: firestore['lName'], address1: firestore['address1'], address2: firestore['address2'], city: firestore['city'], state: firestore['state'], zipCode: firestore['zipCode'], cellPhone: firestore['cellPhone'], officePhone: firestore['officePhone'], email: firestore['email'], companyId: firestore['companyId'], companyName: firestore['company'], // 匹配原代码中的company字段映射到Users的companyName mlsId: firestore['mlsId'], mls: firestore['mls'], ); } Users copyWith({ String? userId, String? fName, String? lName, String? address1, String? address2, String? city, String? state, String? zipCode, String? cellPhone, String? officePhone, String? email, String? companyId, String? companyName, String? mlsId, String? mls, }) { return Users( userId: userId ?? this.userId, fName: fName ?? this.fName, lName: lName ?? this.lName, address1: address1 ?? this.address1, address2: address2 ?? this.address2, city: city ?? this.city, state: state ?? this.state, zipCode: zipCode ?? this.zipCode, cellPhone: cellPhone ?? this.cellPhone, officePhone: officePhone ?? this.officePhone, email: email ?? this.email, companyId: companyId ?? this.companyId, companyName: companyName ?? this.companyName, mlsId: mlsId ?? this.mlsId, mls: mls ?? this.mls, ); } }
2. 删除UsersNotifier中的错误方法
移除UsersNotifier里的fromFirestore方法,因为该方法不属于状态管理类的职责:
class UsersNotifier extends Notifier<Users> { final firestoreService = FirestoreService(); final companyRef = FirebaseFirestore.instance.collection('Company'); final userDB = FirebaseFirestore.instance.collection('users'); @override Users build() { return Users( // 返回初始状态 userId: '', fName: '', lName: '', address1: '', address2: '', city: '', state: '', zipCode: '', cellPhone: '', officePhone: '', email: '', companyId: '', companyName: '', mlsId: '', mls: '', ); } // 移除原来的fromFirestore方法 }
额外修正点
- 原代码中
zipcode拼写错误,改为zipCode匹配Users类的字段名 - 原代码中的
company字段对应Users类的companyName,在工厂构造中做了正确映射
内容的提问来源于stack exchange,提问作者LostTexan
相关产品推荐
相关产品推荐

