Состояние эквивалентного блока Flutter Bloc не обновляется с помощью свойства Map of Strings

Состояние моего блока не обновляется, и я обнаружил, что проблема может заключаться в свойстве Map<String, Map<String, String>, которое не сравнивается должным образом. Пожалуйста, поправьте меня, если я ошибаюсь, но состояние обновляется при изменении других свойств, а не при обновлении свойства imageUrls.

Это мои объекты состояния

abstract class PropertiesState extends Equatable {
  const PropertiesState();
}

class PropertiesLoaded extends PropertiesState {
  final int count;
  final List<Property> properties;
  final Map<String, Map<String, String>> imageUrls;

  const PropertiesLoaded({
    this.count,
    this.properties,
    this.imageUrls,
  });

  @override
  List<Object> get props => [count, properties, imageUrls];
}

Поле imageUrls может содержать любые строковые пары ключ / значение. Я не смог найти никакой информации о том, как мне это сделать.

Спасибо за помощь!


person Dustin Silk    schedule 14.07.2020    source источник
comment
Я думаю, что это должно работать хорошо, однако измените Map ‹String, Map‹ String, String ›› на динамическое, просто в качестве теста, скажите мне результат   -  person farouk osama    schedule 14.07.2020
comment
Вы правы, это действительно работает. Карты легко сравнивать. Оказывается, я менял свойство imageUrl вместо того, чтобы создавать новую карту для каждого события. Я понимаю, почему свойства в классах должны быть неизменными, чтобы equatable теперь тоже работал   -  person Dustin Silk    schedule 14.07.2020


Ответы (1)


Поскольку Equatable пытается сравнить ссылку на ваш объект List или Map, потому что они не являются примитивными типами, такими как int. Вы можете попробовать глубоко скопировать объект Map (используя Map.from ()) и заменить старый, а также использовать хэш-код для сравнения.

person Liu Junhan    schedule 08.01.2021