Flutter代码报错:List类型不匹配及NoSuchMethodError问题求助
Flutter代码错误分析与修复方案
错误1:items返回类型不匹配(List vs List- )
原因
_catalog是可空类型(CatalogModel?),调用_catalog?.getById(id)会返回Item?,直接转成List会导致类型为List<Item?>,与声明的List<Item>不匹配。CatalogModel中的getById方法未显式声明返回类型,默认返回dynamic,进一步导致map后的元素类型不确定。
修复步骤
- 给
getById方法添加返回类型Item?(找不到对应ID时返回null)。 - 在CartModel的
itemsgetter中,过滤掉null值并明确类型转换,确保最终返回List<Item>。
错误2:NoSuchMethodError(String无'text' getter)
原因
UI代码中错误调用了item.text,但Item类的名称属性是name,接收者"iPhone 12 Pro"是Item的name属性值,说明代码把item.name误写为item.text。
修复步骤
找到UI层中引用item.text的代码,替换为item.name。
修改后的完整代码
CatalogModel与Item类
class CatalogModel { static final catModel = CatalogModel._internal(); CatalogModel._internal(); factory CatalogModel() => catModel; static List<Item> items = []; // 显式声明返回类型为Item? Item? getById(int id) => items.firstWhere((element) => element.id == id, orElse: () => null); Item getByPosition(int pos) => items[pos]; } class Item { final int? id; final String? name; final String? desc; final num? price; final String? color; final String? image; Item({this.id, this.name, this.desc, this.price, this.color, this.image}); factory Item.fromMap(Map<String, dynamic> map) { return Item( id: map["id"], name: map["name"], desc: map["desc"], price: map["price"], color: map["color"], image: map["image"], ); } }
CartModel类
import 'package:flutter_catalog/models/catalog.dart'; class CartModel { static final cartModel = CartModel._internal(); CartModel._internal(); factory CartModel() => cartModel; CatalogModel? _catalog; final List<int> _itemIds = []; CatalogModel? get catalog => _catalog; // 修正setter命名(符合Dart小写开头规范) set catalog(CatalogModel newCatalog) { _catalog = newCatalog; } // 过滤null元素并确保类型为List<Item> List<Item> get items => _itemIds .map((id) => _catalog?.getById(id)) .whereType<Item>() .toList(); // 处理price为null的情况,避免崩溃 num get totalPrice => items.fold(0, (total, current) => total + (current.price ?? 0)); // 增加空判断,避免id为null时出错 void add(Item item) { if (item.id != null) { _itemIds.add(item.id!.toInt()); } } // 增加空判断,避免id为null时出错 void remove(Item item) { if (item.id != null) { _itemIds.remove(item.id); } } }
内容的提问来源于stack exchange,提问作者GOURAV
相关产品推荐
相关产品推荐

