Flutter中UsersNotifier的toMap方法变量未定义问题求助
问题原因及解决办法
你遇到的问题核心是在UsersNotifier的toMap方法里,直接写cellPhone、address1这些变量,但这些变量根本不是UsersNotifier类的成员——它们是Users类的属性,而UsersNotifier管理的用户数据存在state变量里(这个state是Notifier提供的,类型是Users),所以必须通过state.属性名来访问。
另外你的代码里还有几处拼写/对应错误,一起修正:
zipcode→ 应该是zipCode(和Users类里的属性名一致)agency对应的value写了company→ Users类里没有这个属性,应该是companyNamestate这个key对应的value直接写state会和Notifier的state变量冲突,要明确写成state.state(或者把Users类里的state属性改个更清晰的名字,避免混淆)
修正后的toMap方法代码
Map<String, dynamic> toMap() { return { 'cellPhone': state.cellPhone, 'address1': state.address1, 'address2': state.address2, 'agency': state.companyName, 'agencyId': state.companyId, 'agentId': state.userId, 'city': state.city, 'fName': state.fName, 'lName': state.lName, 'officePhone': state.officePhone, 'state': state.state, 'zipCode': state.zipCode, 'mls': state.mls, 'mlsId': state.mlsId, 'email': state.email }; }
额外建议
为了避免以后再出现这类命名混淆,建议把Users类里的state属性改个名字,比如userState,这样代码可读性会更高。修改示例如下:
1. 修改Users类的属性与构造方法
class Users { String? userId; String? fName; String? lName; String? address1; String? address2; String? city; String? userState; // 把原来的state改为userState String? zipCode; // 其他属性不变... Users( {this.userId, this.fName, this.lName, this.address1, this.address2, this.city, this.userState, // 对应修改 this.zipCode, // 其他参数不变...}); Users copyWith({ String? userId, String? fName, String? lName, String? address1, String? address2, String? city, String? userState, // 对应修改 String? zipCode, // 其他参数不变...}) { 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, userState: userState ?? this.userState, // 对应修改 zipCode: zipCode ?? this.zipCode, // 其他赋值不变...); } }
2. 修改UsersNotifier里的相关方法
class UsersNotifier extends Notifier<Users> { @override Users build() { return Users( userId: '', fName: '', lName: '', address1: '', address2: '', city: '', userState: '', // 对应修改 zipCode: '', // 其他属性不变...); } // 修改updateState方法 void updateState(String newState) { state = state.copyWith(userState: newState); } // 修改toMap里的对应行 Map<String, dynamic> toMap() { return { // 其他键值对不变... 'state': state.userState, // 对应修改 // 其他键值对不变... }; } }
内容的提问来源于stack exchange,提问作者LostTexan
相关产品推荐
相关产品推荐

