【Flutter工具】多是Flutter上最簡單的本地數據保存方案

簡介

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例子

我推薦你這樣建立你的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設計的工做範圍。

倉庫與Pub地址

若是有問題,能夠在github上issue或者pr。

PUB地址(能夠贊一下)
Github倉庫

相關文章
相關標籤/搜索