flutter foundation的ValueNotifier

foundation模块下面有一个文件,文件名是change_notifier.dart,这个文件最核心的就是实现围绕ValueNotifier实现的。

ValueNotifier的用法如下:

    final ValueNotifier notifier = ValueNotifier(2.0);

    final List log = [];
    final VoidCallback listener = () { log.add(notifier.value); };

    notifier.addListener(listener);
    notifier.value = 3.0;

    expect(log, equals([ 3.0 ]));
    log.clear();

    notifier.value = 3.0;
    expect(log, isEmpty);

这个测试例子很清晰的展示了ValueNotifier的最主要的用法。

其他的还有一些方法调用:

  • 利用Listenable.merge来批量管理ValueNotifier
  • 利用hasListeners查看是否被监听

下面解析一下源码的结构,总共有5个类:

  1. Listenable作为一个抽象类,只是定义了三个方法,addListener,removeListener和Listenable.merge()工厂方法。
  2. ValueListenable作为一个抽象接口继承了Listenable,这个接口(interface)的目的就是暴露value的值
  3. ChangeNotifier定义了一个私有的属性_listeners并且实现了hasListeners、addListener、removeListener方法。_listeners类型是ObserverList用来放listen触发后的回调的。notifyListeners是只在测试的时候可见的并且受保护(protected)的方法。这个类的目的很简单就是维护_listeners这个ObserverList类型的值和触发_listeners内的回调。
  4. _MergingListenable这个私有的类,就是维护一个List集合,利用addListener和removeListener方法对集合内的监听对象批量增加监听回调和移除监听回调的。
  5. ValueNotifier这个就是最上层的封装了,实现了ValueListenable接口的暴露value的值的方法。另外在设置和原来不同的值的时候触发notifyListeners方法。

这五个类环环紧扣,各有分工。结合最上面的用法示例,应该很好理解了。

这是flutter框架源码分析的其中一篇,因能力有限,有诸多不足之处,还请斧正。

你可能感兴趣的:(flutter foundation的ValueNotifier)