Dart中Product类出现非空字段及返回值错误,求解决方案
Dart代码错误修复方案
错误原因分析
- 字段未初始化错误:Dart非空安全规则要求,所有非空实例字段必须在构造函数执行体运行前完成初始化。原代码中
fromObject构造函数在函数体内给字段赋值,此时字段仍处于未初始化状态,违反规则。 - toMap方法返回值异常:
toMap声明返回Future<Map<String, dynamic>>,但函数体未返回任何值,默认返回null,不符合非空类型要求;同时该方法内无异步操作,async属于冗余写法。
具体修复步骤
1. 修正toMap方法
移除不必要的async关键字(无异步逻辑时),添加return语句返回构建好的Map:
Map<String, dynamic> toMap() { return { "id": id, "name": name, "description": description, "unitPrice": unitPrice, }; }
若后续需添加异步逻辑,保留async并确保返回值:
Future<Map<String, dynamic>> toMap() async { // 可添加异步操作,比如读取文件、网络请求等 var map = <String, dynamic>{}; map["id"] = id; map["name"] = name; map["description"] = description; map["unitPrice"] = unitPrice; return map; }
2. 修正fromObject构造函数
将其改为工厂构造函数,通过返回实例的方式避免字段未初始化问题,同时添加空检查提升代码健壮性:
factory Product.fromObject(dynamic o) { final id = int.tryParse(o["id"]); final unitPrice = double.tryParse(o["unitPrice"]); // 检查必要参数是否为空,避免空值崩溃 if (id == null || o["name"] == null || o["description"] == null || unitPrice == null) { throw ArgumentError("传入的对象数据不符合Product实例要求"); } return Product(id, o["name"], o["description"], unitPrice); }
也可使用初始化列表直接赋值(需确保参数非空):
Product.fromObject(dynamic o) : id = int.tryParse(o["id"])!, name = o["name"], description = o["description"], unitPrice = double.tryParse(o["unitPrice"])!;
3. 优化冗余构造函数
原代码中Product和Product.withId构造函数参数完全一致,属于重复定义,建议删除其中一个,保留默认构造函数即可。
修复后完整代码
class Product { int id; String name; String description; double unitPrice; Product(this.id, this.name, this.description, this.unitPrice); factory Product.fromObject(dynamic o) { final id = int.tryParse(o["id"]); final unitPrice = double.tryParse(o["unitPrice"]); if (id == null || o["name"] == null || o["description"] == null || unitPrice == null) { throw ArgumentError("传入的对象数据不符合Product实例要求"); } return Product(id, o["name"], o["description"], unitPrice); } Map<String, dynamic> toMap() { return { "id": id, "name": name, "description": description, "unitPrice": unitPrice, }; } }
内容的提问来源于stack exchange,提问作者Mustafa Yaray
相关产品推荐
相关产品推荐

