问题是您只是将项目添加到状态并重新发出相同的(修改后的)列表。当你调用emit()时,Bloc本质上会检查状态对象的值,看看它是否是一个新对象,如果它与最后一个状态“相同的列表”,它将什么都不做。这很令人困惑,因为即使您向列表中添加了新值,但从某种意义上来说它仍然是同一个对象,只是具有新值。
因此,如果您只是创建一个新列表而不是修改原始列表并发出它,应该有一个简单的修复方法。
例如,这应该可以解决问题:
emit([...state, newValue])
or
final newList = List.from(state)..add(newValue);
emit(newList);
(我在 bloc 文档中找不到对此进行解释的地方,但有许多问题线程讨论了它 - https://github.com/felangel/bloc/issues/2374)
本质上,状态应该是“不可变的”,所以如果你要发出一个新状态,你实际上应该为你要发出的任何东西创建一个新实例。我通常使用状态的方式是为 cubit 正在跟踪的任何状态提供一个带有最终字段的类,以及一个 copyWith 方法,可以轻松地使用任何修改的字段创建一个新实例:
YourCubitState{
final List stateList;
final otherField;
const YourCubitState({
this.stateList = [],
this.otherField,
});
YourCubitState copyWith({
List? stateList,
otherField,
}) =>
YourCubitState(
stateList: stateList ?? this.stateList,
otherField: otherField ?? this.otherField,
);
}
如果状态只是一个列表,也许这是不必要的,但如果您发现自己想要向状态添加属性,那么这是一个很好的模式。