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

Dart中Equatable类props属性的作用及相关技术疑问

关于Equatable中props的疑问解答

你提供的Task类代码

import 'package:equatable/equatable.dart';

class Task extends Equatable {
  final String title;
  bool? isDone;
  bool? isDeleted;

  Task({
    required this.title,
    this.isDone,
    this.isDeleted,
  }) {
    isDone = isDone ?? false;
    isDeleted = isDeleted ?? false;
  }

  Task copyWith({
    String? title,
    bool? isDone,
    bool? isDeleted,
  }) {
    return Task(
      title: title ?? this.title,
      isDone: isDone ?? this.isDone,
      isDeleted: isDeleted ?? this.isDeleted,
    );
  }

  Map<String, dynamic> toMap() {
    final result = <String, dynamic>{};

    result.addAll({'title': title});
    if (isDone != null) {
      result.addAll({'isDone': isDone});
    }
    if (isDeleted != null) {
      result.addAll({'isDeleted': isDeleted});
    }

    return result;
  }

  factory Task.fromMap(Map<String, dynamic> map) {
    return Task(
      title: map['title'] ?? '',
      isDone: map['isDone'],
      isDeleted: map['isDeleted'],
    );
  }

  @override
  List<Object?> get props => [
        title,
        isDeleted,
        isDone,
      ];
}

你有疑问的代码片段

@override
List<Object?> get props => [
      id,
      title,
      isDeleted,
      isDone,
    ];

一、这段props代码的作用

  • 定义对象相等的判断标准:Equatable的核心就是帮你自动实现==运算符和hashCode方法,而props列表就是告诉Equatable:当判断两个Task对象是否相等时,要检查列表里的所有属性值是否完全一致。
  • 比较的是同类型实例:不需要额外写其他类,比较的是两个Task对象本身。比如你用copyWith生成了一个新Task实例,或者从数据库读取了两个Task对象,想确认它们是不是同一个任务,Equatable就会通过props里的属性做对比。
  • 实际场景示例:如果task1 = Task(title: "买菜"),task2 = Task(title: "买菜"),因为它们的title、isDone、isDeleted都相同,所以task1 == task2会返回true;如果把task2的title改成"做饭",那==就会返回false。
  • 注意点:你疑问代码里的id在你的Task类中并没有定义,实际使用时要么去掉这个id,要么在Task类里添加对应的id属性,否则会编译报错。

二、为什么使用Object?类型

  • 兼容所有属性类型:你的Task类里有String(title)、bool?(isDone、isDeleted)这些不同类型的属性,而Dart里除了null之外的所有类型都继承自Object,用Object?可以把任意类型的属性(包括可空类型)都放进这个列表里。
  • 符合Equatable的要求:Equatable的props要求返回List<Object?>类型,这样它才能统一处理不同类型的属性,完成相等性判断和哈希值计算。
  • 支持可空属性:后缀的?是为了允许列表中出现null值,比如当你的属性是可空类型,或者某个属性可能为null时,Object?能正常容纳这些情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:50:28