「这是我参加11月更文应战的第28天,活动概况检查:2021最终一次更文应战」

背景

咱们介绍了一款轻量级的数据持久化的三方Get_Stroage的运用办法,昨日看了读写存的源码完成,今天咱们再来看看其他的源码完成

listen

先来看看listen是怎么完成的,将回调办法传给list_notifier,然后调用getX中的监听value改变并调用callback办法

VoidCallback listen(VoidCallback value) {
  return _concrete.subject.addListener(value);
}

listenKey

跟上面的原理差不多,只不过在回调办法中筛选了key,将对应key的value回传

VoidCallback listenKey(String key, ValueSetter callback) {
  final VoidCallback listen = () {
    if (changes.keys.first == key) {
      callback(changes[key]);
    }
  };
  _keyListeners[callback] = listen;
  return _concrete.subject.addListener(listen);
}

ReadWriteValue

首要的办法基本都介绍完了, 再看下链式办法是怎么现实的

0.val('count');

在获取变量的时分会创立一个ReadWriteValue目标,然后其实咱们操作的是ReadWriteValue目标

final count = 0.val('count');
class ReadWriteValue<T> {
  final String key;
  final T defaultValue;
  final StorageFactory? getBox;
  // final EncodeObject encoder;
  ReadWriteValue(
    this.key,
    this.defaultValue, [
    this.getBox,
    //  this.encoder,
  ]);
  GetStorage _getRealBox() => getBox?.call() ?? GetStorage();
  T get val => _getRealBox().read(key) ?? defaultValue;
  set val(T newVal) => _getRealBox().write(key, newVal);
}

可以看到在ReadWriteValue中有个get和set办法,在运用的时分咱们首要就是运用的这两个办法

写入

当需求更改值的时分,直接更改val就可以了

count.val = 1;

完成的话跟咱们直接调用write办法是相同的,虽然会先判别有没有getbox,一般咱们是不会传入getBox的,所以直接调用了GetStorage(),再调用write

GetStorage _getRealBox() => getBox?.call() ?? GetStorage();
set val(T newVal) => _getRealBox().write(key, newVal);

读取

读取的时分直接count.val,完成跟上面write防反相同,直接调用read办法,并返回

T get val => _getRealBox().read(key) ?? defaultValue;

结语

其实Get_Stroage首要核心是dart:htmllocalStorage,假如有时间的话,后面会再写一篇localStorage的文章

期望大家把一些好的三方分享出来,打在谈论区,共同学习,共同进步

作为Flutter届的一个小学生,期望大家多多指教