我已经为一个颤振应用程序实现了一系列 BLoC,其中一部分可以工作。该应用程序非常简单,它跟踪两名玩家之间的战斗状态,并在玩家按下按钮时更新游戏状态。还有其他状态,但这是不起作用的位,我不知道为什么。
我创建了一个名为 BattleState 的腕尺,它扩展了 Equatable。有一个名为 InBattle 的状态,它有一个 BattleModel 作为对象,其中包含游戏中两个玩家的当前状态。当在 UI 上按下按钮时,battleModel 会更新,然后会发出带有新值的新 InBattle 状态。
final BattleModel battleModel;
const InBattle(
{this.battleModel});
@override
List<Object> get props =>
[battleModel];
}
BattleModel 是你所期望的,它包含一些状态细节和一些更新它们的函数,它也实现了 equatable
class BattleModel extends Equatable {
BattleModel(){
this.p1Name = '';
this.p2Name = '';
...
@override
List<Object> get props => [p1Name, p2Name, p1InitialPower, p2InitialPower, p1CurrentPower, p2CurrentPower];
}
问题是它不起作用。我按下按钮更改状态,但 UI 没有更新。我通过调试器进行了跟踪,问题是当它检查状态以查看它是否应该更新时,它认为状态是相同的,即使功率值已经改变。执行热重载也会导致显示正确更新,所以我知道状态值正在正确更新。
如果我从 InBattle 状态中删除 equatable ,那么一切都会完全按照预期更新,但我的理解是您希望在状态上使用 Equatable ,因为您不想在状态相同时触发构建。在这个应用程序中它并不重要。状态是有限的,状态变化的方式也足够有限,如果我放弃 Equatable,应用程序确实可以工作,但我的理解是这不是实现它的正确方法。
我是否使用了 Equatable 错误,如果是这样怎么办?或者问题是我不应该只拥有一个 InBattle 状态,我真的应该发出反映变化的状态,而不是一遍又一遍地发出 InBattle 直到退出或获胜条件发生?