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

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
}

针对两个错误的具体修复说明:

  1. 构造函数参数过多的错误
    新版Equatable的构造函数已经不再接收props参数了,所以你原来给父类传super(props)的写法就会报错。直接把父类的构造改成无参的const FruitEvent();即可。

  2. 缺少Equatable.props实现的错误
    Equatable的核心是通过props列表来判断对象是否相等,所以每个事件子类都必须重写props getter方法:

  • 如果事件类没有任何成员变量(比如LoadFruits、AddRandomFruit),返回空列表[]就行
  • 如果事件类有成员变量(比如UpdateWithRandomFruit里的updatedFruit),就把这些变量放进props列表里,这样Equatable就能通过这些变量判断两个事件实例是否相同

额外提醒:如果你的Fruit类还没继承Equatable,记得也让它继承,不然判断事件相等的时候,两个内容一样的Fruit对象会被当成不同的实例,影响BLoC的逻辑判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 21:12:34