Flutter构造器报错:Marker类未定义id等属性的setter方法
问题原因及解决方案
你遇到的报错是因为final修饰的成员变量只能在构造函数的初始化列表中赋值,不能在构造函数的函数体里执行赋值操作。
Dart里final变量一旦初始化就不可修改,而且不会生成setter方法。你原来的代码在构造函数体里给id、name等final变量赋值,相当于尝试调用它们不存在的setter,自然会提示"The setter 'id' isn't defined"。
修正后的代码
方式一:使用初始化列表赋值
class Marker { final int id; final String name; final double lat; final double lng; // 通过初始化列表为final变量赋值 Marker.fromJSON(Map<String, dynamic> json) : id = int.tryParse(json['id'].toString()) ?? 0, name = json['name']?.toString() ?? '', lat = double.tryParse(json['lat'].toString()) ?? 0.0, lng = double.tryParse(json['lng'].toString()) ?? 0.0; }
关键说明
- 初始化列表紧跟在构造函数参数后,用冒号
:开头,每个变量的赋值表达式用逗号分隔 - 因为
int.tryParse/double.tryParse可能返回null,而你的final变量是非可空类型(没有加?),所以用??提供默认值,避免空安全报错。如果业务允许变量为null,可以把成员变量改成可空类型,比如final int? id;
更简洁的写法(可选)
如果JSON字段名和类成员名完全一致,也可以用这种紧凑形式:
class Marker { final int id; final String name; final double lat; final double lng; Marker({required this.id, required this.name, required this.lat, required this.lng}); factory Marker.fromJSON(Map<String, dynamic> json) { return Marker( id: int.tryParse(json['id'].toString()) ?? 0, name: json['name']?.toString() ?? '', lat: double.tryParse(json['lat'].toString()) ?? 0.0, lng: double.tryParse(json['lng'].toString()) ?? 0.0, ); } }
内容的提问来源于stack exchange,提问作者StripyTiger
相关产品推荐
相关产品推荐

