【问题标题】:What am I doing wrong with Equatable and BloC?我在 Equatable 和 BloC 上做错了什么?
【发布时间】:2021-02-17 20:32:19
【问题描述】:

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

【问题讨论】:

  • 你能展示一下 InBattle 类吗?我需要检查这个类
  • 你找到解决办法了吗,我也有同样的问题

标签: flutter dart state bloc equatable


【解决方案1】:

对不起,如果我的回答错过了您的问题,但显然 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'));
    }
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    相关资源
    最近更新 更多