产生新状态而不更新UI

时间:2020-03-06 14:05:11

标签: flutter bloc

我产生了相同的状态,但是在我的bloc中具有不同的对象,但是没有再次调用BlocBuilder。 我该怎么办? 我的mapEventToState是

if (event is EditUserProfileImageChanged) {
    UserProfile newUserProfile = state.userProfile;
    newUserProfile.avatar = event.imgSrc;
    yield EditUserProfileTotalState(userProfile: newUserProfile);
}

3 个答案:

答案 0 :(得分:1)

当我们在私有mapEventToState处理程序中产生一个状态时,我们总是在产生一个新状态,而不是对该状态进行突变。这是因为每次我们屈服时,块都会将状态与nextState进行比较,并且仅在两个状态不相等时才会触发状态更改(转换)。如果仅突变并产生相同的state实例,则state == nextState的评估结果为true,并且不会发生状态更改。

如果要更改状态的值,请为模型类创建一个copyWith函数。

class UserProfile extends Equatable {
  final String name;
  final Image avatar;

  const UserProfile({this.name, this.avatar});

  UserProfile copyWith({String name, Image avatar,}) {
    return UserProfile(
      name: name ?? this.name,
      avatar: avatar?? this.avatar,
    );
  }

  @override
  List<Object> get props => [name, avatar];
}
if (event is EditUserProfileImageChanged) {
    var newState = state.userProfile.copyWith(avatar: event.imgSrc);
    yield EditUserProfileTotalState(userProfile: newState);
}

答案 1 :(得分:0)

删除Equatable可解决问题。

答案 2 :(得分:0)

即使属性值未更改,每次删除equatbale都会重新生成。而是每次都创建一个新的状态实例。