local_cache_sync
是一個很是簡單易用的Flutter
本地儲存庫,適用於在本地儲存一列輕量數據(例如用戶保存在本地的一系列藍牙設備的配置,或者緩存一系列用戶信息)git
local_cache_sync
的全部方法,包括保存與讀取,都是同步的,而不是異步的。github
同步存取意味着你不須要使用await
就能夠獲取和保存數據。在flutter
中,這能夠顯著減小StatefulWidget
的數量,大量減小代碼的複雜度。json
使用local_cache_sync
保存與讀取參數都是同步的,這意味着賦值便是保存,並且在StatelessWidget
中,能夠當即使用數據,而不是異步請求數據再刷新。c#
下面這個Switch
組件的值會被緩存到本地,即便從新啓動App也會保留:緩存
Switch( value: LocalCacheSync.userDefault.getWithKey<bool>('switch-A'), onChanged: (v) { setState(() { LocalCacheSync.userDefault.setWithKey<bool>('switch-A', v); }); }, ),
添加你的pubspec.yamlless
path_provider: ^1.4.5 local_cache_sync: ^1.1.0
初始化設置路徑異步
getTemporaryDirectory().then((uri) { LocalCacheSync.instance.setCachePath(uri.path); });
使用local_cache_sync
實現保存用戶自定義設置很是簡單,只須要賦值與取值,無需異步等待,便可保存參數到本地。
讀取參數也是同步的,這意味着你能夠在StatelessWidget
中當即使用數據。ide
保存數據函數
LocalCacheSync.userDefault.setWithKey<bool>('isDarkMode',true); LocalCacheSync.userDefault.setWithKey<String>('token','aabbccdd'); LocalCacheSync.userDefault.setWithKey<Map>('x-config',{'id':1243});
讀取數據ui
var res = LocalCacheSync.userDefault.getWithKey<bool>('isDarkMode'); var res = LocalCacheSync.userDefault.getWithKey<String>('token'); var res = LocalCacheSync.userDefault.getWithKey<Map>('x-config');
保存數據
LocalCacheSync.userDefault['isDarkMode'] = true; LocalCacheSync.userDefault['token'] = 'aabbccdd'; LocalCacheSync.userDefault['x-config'] = {'id':1243};
讀取數據
bool res = LocalCacheSync.userDefault['isDarkMode']; String res = LocalCacheSync.userDefault['token']; Map res = LocalCacheSync.userDefault['x-config'];
若是你須要管理一系列值,請使用LocalCacheLoader
,只須要一個channel
標誌,你就能夠管理一系列值。
LocalCacheLoader
在內部實現了懶加載的效果:只有取value
屬性時數據才真正被加載。
在應用中,加入你有1-100號設備顯示在Listview.builder中,只有100號設備即將進入屏幕中時,100號設備的緩存參數纔會被真正加載。也就是說LocalCacheLoader不會致使長列表卡頓。
我推薦你這樣建立你的model:
class Device { final String uuid; final String name; final int type; Device({ this.uuid, this.name, this.type, }); Device.formJson(Map<String, dynamic> map) : this( uuid: map['uuid'], name: map['name'], type: map['type'], ); static LocalCacheLoader get _loader => LocalCacheLoader('device'); static List<Device> all() { return _loader.all .map<Device>( (cache) => Device.fromJson(cache), ) .toList(); } LocalCacheObject save() { return Device._loader.saveById(uuid, jsonMap); } Map<String, dynamic> get jsonMap => { 'uuid': uuid, 'name': name, 'type': type, }; }
你也能夠另外封裝loader來讀寫其餘信息,對於輕量級的儲存,以上是很是簡單易用的。
不要在io密集型場景使用local_cache_sync,例如即時儲存每秒10次的掃描結果。
雖然flutter中阻塞主線程不會致使UI卡頓,可是你仍不該當在io密集型場景使用,這超出了local_cache_sync設計的工做範圍。
若是有問題,能夠在github上issue或者pr。