美文网首页
flutter foundation的ValueNotifier

flutter foundation的ValueNotifier

作者: 一叠纸船 | 来源:发表于2020-08-27 15:47 被阅读0次

    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个类:

    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

          本文链接:https://www.haomeiwen.com/subject/szkcsktx.html