Flutter结合GetX操作Firebase时创建UserModel实例参数报错如何解决
错误原因
- 你定义的
UserModel默认构造函数为3个必填位置参数,参数顺序固定为uid、email、name,你传入Map对象、用大括号包裹参数的写法不符合该构造函数的入参要求,所以触发参数数量不匹配的报错。 - 你尝试传键值对Map的方式,需要
UserModel有支持接收Map参数的对应构造函数才能使用,你当前的代码中没有定义这类构造函数,自然不生效。 - 额外提示:你现有代码中的
UserModel.fromDocumentSnapshot构造函数存在逻辑冗余问题,初始化列表已经对三个属性赋值,后续构造函数体内又用documentSnapshot的取值覆盖,会导致你传入的前三个参数完全无效。
解决方案
方案1:直接按现有构造函数规则传参
按位置参数的顺序直接传入对应值即可,不需要大括号:
UserModel _user = UserModel( _yeniUserUID, // 第一个参数:uid _yeniUser.email, // 第二个参数:email name // 第三个参数:name );
方案2:新增构造函数支持Map/命名参数传参
如果想保留键值对传参的写法,给UserModel新增对应命名构造函数即可:
class UserModel { String uid; String name; String? email; UserModel( this.uid, this.email, this.name, ); // 新增fromMap构造函数,支持从Map创建对象 UserModel.fromMap(Map<String, dynamic> map) : uid = map['uid'], name = map['name'], email = map['email']; // 修正冗余的fromDocumentSnapshot构造函数 UserModel.fromDocumentSnapshot(DocumentSnapshot documentSnapshot) : uid = documentSnapshot.id, name = documentSnapshot["name"], email = documentSnapshot["email"]; }
之后就可以用你之前的写法创建对象:
UserModel _user = UserModel.fromMap({ 'name': name, 'email': _yeniUser.email, 'uid': _yeniUserUID, });
内容的提问来源于stack exchange,提问作者Tolga Yılmaz
相关产品推荐
相关产品推荐

