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 trues1.set('unread_notice', 1);print( s1.get('unread_notice') ); //String "1"print( s1.get('unread_notice2', true) ); //int 1s1.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 filereturn file.writeAsString('$counter');}// 从文件中读取数据Future<int> readCounter() async {try {final file = await _localFile;// Read the fileString contents = await file.readAsString();return int.parse(contents);} catch (e) {// If we encounter an error, return 0return 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();
