如何让Dart类中price_range自动生成产品价格列表并解决初始化错误
问题分析与解决方案
错误原因
出现LateInitializationError的核心原因有三点:
- 构造函数中
product_model.map(...)返回的是Iterable<double>,并非List<double>,直接赋值给List<double>类型的_price_range会导致类型不匹配,变量未正确初始化。 StoreModel.fromJson中,当json['products']为空时,_product_model这个late变量未被初始化。StoreModel.fromJson中_price_range被错误初始化为空数组,未按照需求从产品列表生成价格范围。- 代码存在多处拼写/语法错误(比如构造函数参数用分号、类名拼写不一致、JSON字段访问错误)。
修正后的代码
Mall类修正
class Mall { late List<MallModel> _mall; List<MallModel> get mall => _mall; Mall({required List<MallModel> malls}) { _mall = malls; } Mall.fromJson(Map<String, dynamic> json) { if (json['mall'] != null) { _mall = <MallModel>[]; json['mall'].forEach((v) { _mall.add(MallModel.fromJson(v)); }); } else { // 处理空数据,避免late变量未初始化 _mall = []; } } }
StoreModel类修正
class StoreModel { int? store_id; late List<ProductModel> _product_model; List<ProductModel> get product_model => _product_model; late List<double> _price_range; List<double> get price_range => _price_range; StoreModel({required this.store_id, required List<ProductModel> product_model}) { _product_model = product_model; // 将Iterable转换为List,完成价格列表生成 _price_range = product_model.map((element) => double.parse(element.price)).toList(); } StoreModel.fromJson(Map<String, dynamic> json) { store_id = json['store_id']; // 无论products是否存在,都初始化_product_model if (json['products'] != null) { _product_model = <ProductModel>[]; json['products'].forEach((v) { _product_model.add(ProductModel.fromJson(v)); }); } else { _product_model = []; } // 从产品列表自动生成价格范围 _price_range = _product_model.map((element) => double.parse(element.price)).toList(); } }
进阶优化(避免late变量)
如果想彻底规避late变量的潜在风险,可以改用初始化列表直接赋值:
class StoreModel { int? store_id; final List<ProductModel> _product_model; List<ProductModel> get product_model => _product_model; final List<double> _price_range; List<double> get price_range => _price_range; StoreModel({required this.store_id, required List<ProductModel> product_model}) : _product_model = product_model, _price_range = product_model.map((e) => double.parse(e.price)).toList(); StoreModel.fromJson(Map<String, dynamic> json) : store_id = json['store_id'], _product_model = (json['products'] as List?)?.map((v) => ProductModel.fromJson(v)).toList() ?? [], _price_range = ((json['products'] as List?)?.map((v) => ProductModel.fromJson(v)).toList() ?? []).map((e) => double.parse(e.price)).toList(); }
关键修正点
- 给
map()结果添加.toList(),完成从Iterable到List的类型转换。 - 在
fromJson中处理空产品列表的情况,确保late变量始终被初始化。 - 统一
price_range的生成逻辑,无论是构造函数还是JSON解析,都从产品列表自动生成。 - 修复代码中的语法错误(比如构造函数参数分隔符、类名拼写、JSON字段访问)。
内容的提问来源于stack exchange,提问作者lambduh
相关产品推荐
相关产品推荐

