问题
ValueNotifier
仅当值更改时通知其侦听器。但是,如果该值为List
像这样:
final myListNotifier = ValueNotifier<List<String>>([]);
像这样更改单个项目:
myListNotifier.value.add('Hello');
不会通知侦听器,因为列表本身没有更改。仅列表中的一项发生了变化。对于 Dart 来说,列表是对列表对象的引用。每次更改列表内容时,该引用都不会更改。
有几种解决方案。
创建新列表
如果您使用更新的内容创建新列表,则更改value
通知程序中将导致它通知其侦听器。下面演示了这一点:
final newList = myListNotifier.value.toList();
newList.add('Hello');
myListNotifier.value = newList;
这很有效,而且对于大多数情况来说可能没问题。毕竟,在大多数应用程序中,您不会处理非常长的列表,因此制作副本并不是什么大问题。
然而,还有另一种选择。
自己通知听众
Since ValueNotifier
延伸ChangeNotifier
你可以打电话notifyListeners
你自己。然而,这种方法有一个protected
注释,这意味着您只能从子类中调用它。
以下是创建自定义子类的示例:
class MyStateManager {
final myListNotifier = ListNotifier();
void send(String text) {
myListNotifier.add(text);
}
}
class ListNotifier extends ValueNotifier<List<String>> {
ListNotifier() : super([]);
void add(String listItem) {
value.add(listItem);
notifyListeners(); // here
}
}
In your add
方法中,您更新列表的内容(无需创建新列表),然后手动通知侦听器,就像在ChangeNotifier
.