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

Flutter代码报错:List类型不匹配及NoSuchMethodError问题求助

Flutter代码错误分析与修复方案

错误1:items返回类型不匹配(List vs List)

原因

  1. _catalog是可空类型(CatalogModel?),调用_catalog?.getById(id)会返回Item?,直接转成List会导致类型为List<Item?>,与声明的List<Item>不匹配。
  2. CatalogModel中的getById方法未显式声明返回类型,默认返回dynamic,进一步导致map后的元素类型不确定。

修复步骤

  1. 给getById方法添加返回类型Item?(找不到对应ID时返回null)。
  2. 在CartModel的items getter中,过滤掉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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:55:10