flutter:Get_Stroage源码02

619 阅读2分钟

「这是我参与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届的一个小学生,希望大家多多指教