Flutter支持Preferences(Shared Preferences and NSUserDefaults) 、文件、和Sqlite3。若想使用这个功能需要引入官方仓库的相应插件,下面详细介绍这三种存储方式的使用方法。
Preferences
https://pub.dev/packages/shared_preferences
Flutter官方推荐我们用shared_preferences进行数据存储,它类似于React Native中的AsyncStorage。
什么是shared_preferences?
shared_preferences是Flutter社区开发的一个本地数据存取插件,它有以下特性:
- 简单的,异步的,持久化的key-value存储系统;
- 在Android上它是基于SharedPreferences的;
- 在iOS上它是基于NSUserDefaults的;
如何使用shared_preferences?
安装依赖
dependencies:
shared_preferences: ^0.5.12+4
导入
import 'package:shared_preferences/shared_preferences.dart';
基本使用
_onClick() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
// 设置缓存
prefs.setString(book, '飘');
Map m1 = {
'name': 'jack',
'age': 18,
};
prefs.setString(mapJson, json.encode(m1));
// 获取缓存
print(prefs.get(book)); //飘
print(prefs.getString(book)); //飘
print(json.decode(prefs.get(mapJson))); //{name: jack, age: 18}
//移除指定key的缓存
prefs.remove(book);
//清除所有缓存
prefs.clear();
}
封装1
/lib/utils/storage.dart
import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';
/// 存储封装
/// 该封装 key 只允许为 String 类型,如果需要其他类型,需直接使用 SharedPreferences 相关方法。
/// value 只允许为 String 类型。其他类型需要先转为String,再进行存储;如需直接存储其他类型数据,请直接使用 SharedPreferences 相关方法。
class ZqStorage {
SharedPreferences prefs;
// 单例模式
static var _instance = ZqStorage._internal();
static getInstance() => _instance._createPrefs();
ZqStorage._internal() {}
// 创建 SharedPreferences 实例
_createPrefs() async {
if (prefs == null) {
prefs = await SharedPreferences.getInstance();
}
return this;
}
// 设置
set(String key, value) {
// 不管value为 什么类型,全部转为 String 类型
prefs.setString(key, json.encode(value));
}
// 获取
get(String key, [bool decode = false]) {
var value = prefs.get(key);
if (value != null) {
if (decode) return json.decode(value);
return value;
}
return null;
}
// 是否包含
has(String key) => prefs.containsKey(key);
// 清除指定
remove(String key) {
prefs.remove(key);
}
// 清除所有
clear() {
prefs.clear();
}
}
import 'package:app1/utils/storage.dart';
_onClick() async {
var s1 = await ZqStorage.getInstance();
s1.set('username', {'name': 'jack', 'age': 18});
print( s1.get('username') ); //String {"name": "jack", "age": "18"}
print( s1.get('username', true) ); //Map {name: jack, age: 18}
s1.set('isLogin', 'true');
print( s1.get('isLogin') ); //String "true"
print( s1.get('isLogin', true) ); //bool true
s1.set('unread_notice', 1);
print( s1.get('unread_notice') ); //String "1"
print( s1.get('unread_notice2', true) ); //int 1
s1.set('list', [1, 2, 3]);
print( s1.get('list') ); //String "[1, 2, 3]"
print( s1.get('list', true) ); //List [1, 2, 3]
}
文件存储
导入插件
- 打开项目的pubspec.yaml配置,在dependencies节点下新增配置:
path_provider: ^0.4.0
- 点击开发工具提示的packages get按钮或者在命令行输入flutter packages get来同步第三方插件
在Dart文件中引入插件
import 'package:path_provider/path_provider.dart';
使用示例
获取文件路径方法:
获取应用缓存目录: getTemporaryDirectory
- 类似iOS的NSTemporaryDirectory和Android的getCacheDir
- 获取应用文件目录: getApplicationDocumentsDirectory
- 类似iOS的NSDocumentDirectory和Android上的AppData目录
- 应用程序被删除时,系统会清除目录
- 存储卡: getExternalStorageDirectory
- 仅支持Android平台
// 找到正确的本地路径
Future<String> get _localPath async {
final directory = await getApplicationDocumentsDirectory();
return directory.path;
}
// 创建对文件位置的引用
Future<File> get _localFile async {
final path = await _localPath;
return new File('$path/counter.txt');
}
// 将数据写入文件
Future<File> writeCounter(int counter) async {
final file = await _localFile;
// Write the file
return file.writeAsString('$counter');
}
// 从文件中读取数据
Future<int> readCounter() async {
try {
final file = await _localFile;
// Read the file
String contents = await file.readAsString();
return int.parse(contents);
} catch (e) {
// If we encounter an error, return 0
return 0;
}
}
Sqfite
SQLite plugin for Flutter. Get the default databases location. On Android, it is typically data/data/
导入插件
- 打开项目的pubspec.yaml配置,在dependencies节点下新增配置:
sqflite: ^1.0.0
- 点击开发工具提示的packages get按钮或者在命令行输入flutter packages get来同步第三方插件
- 在Dart文件中引入插件
import 'package:sqflite/sqflite.dart';
使用示例
// 获取数据库文件的存储路径
var databasesPath = await getDatabasesPath();
String path = join(databasesPath, 'demo.db');
// 创建数据库表
db = await openDatabase(path, version: 1,
onCreate: (Database db, int version) async {
await db.execute('''
CREATE TABLE $tableBook (
$columnId INTEGER PRIMARY KEY,
$columnName TEXT,
$columnAuthor TEXT,
$columnPrice REAL,
$columnPublishingHouse TEXT)
''');
});
// 插入数据
Future<int> rawInsert(String sql, [List<dynamic> arguments]);
Future<int> insert(String table, Map<String, dynamic> values,
{String nullColumnHack, ConflictAlgorithm conflictAlgorithm});
// 查询数据
Future<List<Map<String, dynamic>>> rawQuery(String sql,
[List<dynamic> arguments]);
Future<List<Map<String, dynamic>>> query(String table,
{bool distinct,
List<String> columns,
String where,
List<dynamic> whereArgs,
String groupBy,
String having,
String orderBy,
int limit,
int offset});
// 更新数据
Future<int> rawUpdate(String sql, [List<dynamic> arguments]);
Future<int> update(String table, Map<String, dynamic> values,
{String where,
List<dynamic> whereArgs,
ConflictAlgorithm conflictAlgorithm});
// 删除
Future<int> rawDelete(String sql, [List<dynamic> arguments]);
Future<int> delete(String table, {String where, List<dynamic> whereArgs});
// 关闭数据库
Future close() async => db.close();