новое состояние не обновляет пользовательский интерфейс - PullRequest
0 голосов
/ 06 марта 2020

Я возвращаю то же состояние, но с другим объектом в моем блоке c, но BlocBuilder больше не вызывается. Как я могу сделать этот сценарий? Моя картаEventToState -

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

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Удаление Equatable решит проблему.

0 голосов
/ 06 марта 2020

Когда мы выдаем состояние в частных обработчиках mapEventToState, мы всегда получаем новое состояние, а не изменяем его. Это потому, что каждый раз, когда мы возвращаемся, blo c будет сравнивать состояние с nextState и будет запускать изменение состояния (переход), только если два состояния не равны. Если мы просто изменим и выдадим один и тот же экземпляр состояния, то состояние == 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);
}
...