Sembast结合BLoC开发遇事件类报错,求解决方法
修复BLoC事件类的Equatable报错问题
你遇到的这俩问题都是因为Equatable版本更新导致的——教程用的是旧版API,而你现在用的是新版(2.0+),写法已经不一样了,直接给你修复后的完整代码,再讲清楚怎么改的:
import 'package:equatable/equatable.dart'; import 'package:meta.dart'; import 'package:dbug/data/fruit.dart'; @immutable abstract class FruitEvent extends Equatable { const FruitEvent(); // 新版Equatable不需要给父类传props参数 @override List<Object?> get props => []; // 抽象类先定义默认的props实现 } class LoadFruits extends FruitEvent { const LoadFruits(); @override List<Object?> get props => []; // 这个事件没有参数,返回空列表就行 } class AddRandomFruit extends FruitEvent { const AddRandomFruit(); @override List<Object?> get props => []; // 无参数,返回空列表 } class UpdateWithRandomFruit extends FruitEvent { final Fruit updatedFruit; const UpdateWithRandomFruit(this.updatedFruit); @override List<Object?> get props => [updatedFruit]; // 把事件的成员变量放进props列表 } class DeleteFruit extends FruitEvent { final Fruit fruit; const DeleteFruit(this.fruit); @override List<Object?> get props => [fruit]; // 同理,把成员变量加入props }
针对两个错误的具体修复说明:
构造函数参数过多的错误
新版Equatable的构造函数已经不再接收props参数了,所以你原来给父类传super(props)的写法就会报错。直接把父类的构造改成无参的const FruitEvent();即可。缺少Equatable.props实现的错误
Equatable的核心是通过props列表来判断对象是否相等,所以每个事件子类都必须重写propsgetter方法:
- 如果事件类没有任何成员变量(比如
LoadFruits、AddRandomFruit),返回空列表[]就行 - 如果事件类有成员变量(比如
UpdateWithRandomFruit里的updatedFruit),就把这些变量放进props列表里,这样Equatable就能通过这些变量判断两个事件实例是否相同
额外提醒:如果你的Fruit类还没继承Equatable,记得也让它继承,不然判断事件相等的时候,两个内容一样的Fruit对象会被当成不同的实例,影响BLoC的逻辑判断。
内容的提问来源于stack exchange,提问作者SgtPepega
相关产品推荐
相关产品推荐

