Flutter中构造函数名称与类名不匹配错误修复求助
修复Riverpod 2.0 Notifier类中的构造函数名称错误
错误信息
The name of a constructor must match the name of the enclosing class.dart(invalid_constructor_name)
报错代码片段
fromFirestore(Map<String, dynamic> firestore) : cellPhone = firestore['cellPhone'], address1 = firestore['address1'], address2 = firestore['address2'], company = firestore['company'], companyId = firestore['companyId'], userId = firestore['userId'], city = firestore['city'], fName = firestore['fName'], lName = firestore['lName'], officePhone = firestore['officePhone'], state = firestore['state'], zipcode = firestore['zipCode'], mls = firestore['mls'], mlsId = firestore['mlsId'], email = firestore['email'];
完整错误代码
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( // Return the initial state userId: '', fName: '', lName: '', address1: '', address2: '', city: '', state: '', zipCode: '', cellPhone: '', officePhone: '', email: '', companyId: '', companyName: '', mlsId: '', mls: '', ); } fromFirestore(Map<String, dynamic> firestore) : cellPhone = firestore['cellPhone'], address1 = firestore['address1'], address2 = firestore['address2'], company = firestore['company'], companyId = firestore['companyId'], userId = firestore['userId'], city = firestore['city'], fName = firestore['fName'], lName = firestore['lName'], officePhone = firestore['officePhone'], state = firestore['state'], zipcode = firestore['zipCode'], mls = firestore['mls'], mlsId = firestore['mlsId'], email = firestore['email']; } }
问题原因
你把属于Users实体类的构造函数错误写到了UsersNotifier类中。Dart规则要求构造函数名称必须与所在类名一致(命名构造函数需以类名.构造函数名格式定义),fromFirestore作为UsersNotifier的构造函数不符合规则,同时UsersNotifier的职责是管理状态,不应持有用户实体的属性,这些属性属于Users类。
修复方案
1. 调整Users实体类,添加命名构造函数
将fromFirestore移到Users类中,作为命名构造函数用于从Firestore数据生成实例:
class Users { final String userId; final String fName; final String lName; final String address1; final String address2; final String city; final String state; final String zipCode; final String cellPhone; final String officePhone; final String email; final String companyId; final String companyName; final String mlsId; final String mls; final String? company; // 默认构造函数 Users({ required this.userId, required this.fName, required this.lName, required this.address1, required this.address2, required this.city, required this.state, required this.zipCode, required this.cellPhone, required this.officePhone, required this.email, required this.companyId, required this.companyName, required this.mlsId, required this.mls, this.company, }); // 命名构造函数:从Firestore数据创建Users实例 Users.fromFirestore(Map<String, dynamic> firestore) : 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['companyName'] ?? '', mlsId = firestore['mlsId'] ?? '', mls = firestore['mls'] ?? '', company = firestore['company']; }
2. 修正UsersNotifier类
移除错误构造函数,添加方法加载Firestore数据并更新状态:
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: '', ); } // 从Firestore加载用户数据并更新状态 Future<void> loadUser(String userId) async { final userDoc = await userDB.doc(userId).get(); if (userDoc.exists) { final userData = userDoc.data() as Map<String, dynamic>; state = Users.fromFirestore(userData); } } }
额外优化提示
- 添加
?? ''空值处理,避免Firestore字段缺失引发空指针异常 - 统一字段拼写(比如原代码中
zipcode和zipCode的差异,保持与Users类属性一致)
内容的提问来源于stack exchange,提问作者LostTexan
相关产品推荐
相关产品推荐

