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

Flutter中List.contains检测自定义Model失效问题求助

问题解决:List.contains()无法检测自定义对象存在的问题

问题原因

Dart中List.contains()方法默认通过==运算符判断对象是否相等,而自定义类(比如你的FavouriteModel)如果没有重写==和hashCode,默认比较的是对象的内存引用,而非对象的内容。也就是说,即使两个FavouriteModel实例的字段完全一致,只要它们不是同一个对象,contains()就会返回false,导致你每次都进入else分支。

另外需要注意:你的_favCourses列表必须和_courseController中的收藏数据保持同步,如果addToFavourite/removeFromFavourite方法更新了controller内的数据,但未同步更新_favCourses,那contains()的判断基础本身就是错误的。

解决方案

1. 给FavouriteModel重写==和hashCode

根据FavouriteModel的核心标识字段(比如课程ID)来重写这两个方法,让相等性判断基于内容而非引用。

示例代码:

class FavouriteModel {
  final String courseId; // 假设核心唯一标识是courseId
  final String courseName;

  FavouriteModel({required this.courseId, required this.courseName});

  // 重写==运算符,基于核心字段判断相等
  @override
  bool operator ==(Object other) {
    if (identical(this, other)) return true;
    return other is FavouriteModel && other.courseId == courseId;
  }

  // 重写hashCode,必须与==的判断逻辑保持一致
  @override
  int get hashCode => courseId.hashCode;
}

2. 确保_favCourses与controller数据同步

不要单独维护_favCourses,建议直接从_courseController获取最新的收藏列表,避免数据不一致:

修改你的方法:

void initAddToFav(FavouriteModel model, BuildContext context) {
    // 从controller获取当前最新的收藏列表
    final currentFavs = _courseController.getFavouriteList(); // 假设controller提供这个方法
    if (currentFavs.contains(model)) {
      _courseController.removeFromFavourite(model);
      AlertHelper.showSanckBar(
          context, 'Remove from favourites !', AnimatedSnackBarType.error);
    } else {
      _courseController.addToFavourite(model);
      AlertHelper.showSanckBar(
          context, 'Added to favourites !', AnimatedSnackBarType.success);
    }
    notifyListeners();
}

如果必须单独维护_favCourses,则在调用controller的增删方法后,同步更新这个列表:

// 添加收藏后同步列表
_courseController.addToFavourite(model);
_favCourses.add(model);

// 删除收藏后同步列表
_courseController.removeFromFavourite(model);
_favCourses.remove(model);

内容的提问来源于stack exchange,提问作者Kasun maduranga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 01:32:00