我已经为flutter应用程序实现了一系列模块,并且其中的一部分工作了。这个应用程序非常简单,它可以跟踪两个玩家之间的战斗状态,并在玩家按下按钮时更新游戏状态。还有其他状态,但这是不起作用的部分,我不知道为什么。
我创建了一个名为BattleState的cubit,它扩展了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,直到退出或win条件发生?
发布于 2020-11-23 03:20:13
如果我的回答遗漏了你的问题,很抱歉,但是很明显,如果状态的内容发生了变化,Equatable包应该会检测到状态的变化。但作为一种快速的、临时的解决方案--也许可以实现一个“转换”状态--例如。"BattleStateUpdatingState“,并在新值写入"BattleStateUpdatedState"?之前发出它。
请参阅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'));
}
}https://stackoverflow.com/questions/64692065
复制相似问题