1

我已经为一个颤振应用程序实现了一系列 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 直到退出或获胜条件发生?

4

1 回答 1

1

抱歉,如果我的回答错过了您的问题,但显然 Equatable 包应该在状态内容发生变化时检测到状态变化。但作为一种快速、临时的解决方案——也许实现一个“过渡”状态——例如。“BattleState更新状态”并在新值写入“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'));
    }
  }
于 2020-11-22T19:20:13.017 回答