我对Equatable和BloC做错了什么



我已经为flutter应用程序实现了一系列BLoCs,其中一部分可以工作。该应用程序非常简单,它可以跟踪两名玩家之间的战斗状态,并在玩家按下按钮时更新游戏状态。还有其他州,但这一点不起作用,我不明白为什么。

我创建了一个立方体,名为BattleState,它扩展了Equatable。有一个名为InBattle的状态,它以battleModel为对象,显示游戏中两名玩家的当前状态。当按下UI上的按钮时,battleModel将更新,然后使用新值发出新的InBattle状态。

final BattleModel battleModel;
const InBattle(
{this.battleModel});
@override
List<Object> get props =>
[battleModel];
}

BattleModel是关于你所期望的,它包含一些状态细节和一些更新它们的功能,它还实现了等价的

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的状态,直到退出或获胜?

如果我的回答忽略了您的问题,很抱歉,但很明显,如果状态的内容发生变化,Equatable包应该检测状态的变化。但作为一种快速、临时的解决方案——也许可以实现"过渡"状态——例如"过渡";BattleState更新状态";并在新值被写入"0"之前发射它;BattleState已更新状态"?

请参阅Cubit中从API获取新信息的方法示例作为灵感:

Future<void> getUserInfo() async {
emit(UserInfoLoading());
try {
final userInfo = await userInfoRepository.fetchUserInfo();
if (userInfo != null) {
emit(UserInfoLoaded(userInfo));
}
} on Exception {
emit(UserInfoError('Problem loading userinfo'));
}
}

最新更新