You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 08:23:16