首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我用Equatable和BloC做错了什么?

我用Equatable和BloC做错了什么?
EN

Stack Overflow用户
提问于 2020-11-05 14:12:50
回答 1查看 423关注 0票数 1

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

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

代码语言:javascript
复制
  final BattleModel battleModel;

  const InBattle(
      {this.battleModel});

  @override
  List<Object> get props =>
      [battleModel];
}

BattleModel是您所期望的,它包含一些状态细节和一些更新它们的函数,它还实现了equatable

代码语言:javascript
复制
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条件发生?

EN

回答 1

Stack Overflow用户

发布于 2020-11-23 03:20:13

如果我的回答遗漏了你的问题,很抱歉,但是很明显,如果状态的内容发生了变化,Equatable包应该会检测到状态的变化。但作为一种快速的、临时的解决方案--也许可以实现一个“转换”状态--例如。"BattleStateUpdatingState“,并在新值写入"BattleStateUpdatedState"?之前发出它。

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

代码语言:javascript
复制
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'));
    }
  }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64692065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档