Equatable和BloC我在做什么错?

问题描述

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

我创建了一个名为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 已更新状态”之前发出“ BattleState 更新状态”?

请参见Cubit中的该方法示例,以从API中获取最新信息作为启发:

def EucAlgo(a,b):
    if a == 0:
        return b
    return EucAlgo(b % a,a)

def ExEucAlgo(a,b):
  if a==0:
    return b,1
  gcd,s1,t1 = ExEucAlgo(b%a,a)
  
  # You dont use / use // to make integer division
  s = t1 - (b//a) * s1
  t = s1
  return gcd,s,t

def ExEucAlgo_modInverse(a,b):
    gcd,t = ExEucAlgo(a,b)
    if (gcd == 1):
        # Just return s which is the inverse of public exponent
        return s
    elif (gcd != 1):
        # I think it's better to raise an error but it's up to you
        print("There is no inverse modulo for the input.")

#RSA Key generation
p = 9054583561027584891319616491815785011595937977633787663340258672121877196627062461308487615739189212918799813327175451021729047602129396754172486202100997
q = 10115395220079214686776355235686624745626962891667413288473649946208213820942557513105240135405981494333016032659525466362014175268953946332375459648688023
n = p * q
phi_n = (p-1) * (q-1)

# Just use fixed prime public exponent rather than trying fixed ones
e = 65537
d = ExEucAlgo_modInverse(e,phi_n)
print(f"\nKpr={d}")
print(f"\nKpub=(n={n})\n \ne={e}")

# Try to encrypt and decrypt 36
ciphertext = pow(36,e,n)
print("Encrypted data {}".format(ciphertext))
print("Decrypted data is {}".format(pow(ciphertext,d,n)))