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
相关产品推荐
相关产品推荐

