foundation模块下面有一个文件,文件名是change_notifier.dart,这个文件最核心的就是实现围绕ValueNotifier实现的。
ValueNotifier的用法如下:
final ValueNotifier<double> notifier = ValueNotifier<double>(2.0);
final List<double> log = <double>[];
final VoidCallback listener = () { log.add(notifier.value); };
notifier.addListener(listener);
notifier.value = 3.0;
expect(log, equals(<double>[ 3.0 ]));
log.clear();
notifier.value = 3.0;
expect(log, isEmpty);
这个测试例子很清晰的展示了ValueNotifier的最主要的用法。
其他的还有一些方法调用:
- 利用Listenable.merge来批量管理ValueNotifier
- 利用hasListeners查看是否被监听
下面解析一下源码的结构,总共有5个类:
- Listenable作为一个抽象类,只是定义了三个方法,addListener,removeListener和Listenable.merge()工厂方法。
- ValueListenable作为一个抽象接口继承了Listenable,这个接口(interface)的目的就是暴露value的值
- ChangeNotifier定义了一个私有的属性_listeners并且实现了hasListeners、addListener、removeListener方法。_listeners类型是ObserverList用来放listen触发后的回调的。notifyListeners是只在测试的时候可见的并且受保护(protected)的方法。这个类的目的很简单就是维护_listeners这个ObserverList类型的值和触发_listeners内的回调。
- _MergingListenable这个私有的类,就是维护一个List集合,利用addListener和removeListener方法对集合内的监听对象批量增加监听回调和移除监听回调的。
- ValueNotifier这个就是最上层的封装了,实现了ValueListenable接口的暴露value的值的方法。另外在设置和原来不同的值的时候触发notifyListeners方法。
这五个类环环紧扣,各有分工。结合最上面的用法示例,应该很好理解了。
这是flutter框架源码分析的其中一篇,因能力有限,有诸多不足之处,还请斧正。
网友评论