flutter:Get_Stroage源码02
背景
我们介绍了一款轻量级的数据持久化的三方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:html
的localStorage
,如果有时间的话,后面会再写一篇localStorage
的文章
希望大家把一些好的三方分享出来,打在评论区,共同学习,共同进步
作为Flutter届的一个小学生,希望大家多多指教
转载自:https://juejin.cn/post/7035965470352080910