
Flutter 四大存储核心对比 SP / 文件 / Hive / SQLite-Drift对比与使用一、四种存储方案总览对比存储方案底层实现存储数据类型性能支持对象加密适用场景SharedPreferences安卓 SP /iOS NSUserDefaults基础类型String/int/bool/List一般❌ 需要 Json 序列化❌登录状态、token、开关、简单配置本地文件存储系统文件 IO任意文本、二进制、图片中等✅ 手动 json 解析❌ 需自行加密日志、缓存图片、导出文本Hive纯 Dart 自研 NoSQL基础类型 自定义实体类极高✅ 原生支持对象✅ AES 加密用户信息、购物车、接口缓存项目主流Drift(SQLite)原生 SQLite结构化数据表、关联数据高✅ 表模型映射✅ 支持数据库加密海量离线数据、多表关联、复杂分页查询二、SharedPreferences2.1 引入依赖dependencies:flutter:sdk:fluttershared_preferences:^2.2.32.2 支持存储数据类型仅支持String / int / double / bool / ListString不支持自定义对象、Map、数组对象需手动转 JSON 字符串存储2.3 基础 CRUD 使用importpackage:shared_preferences/shared_preferences;// 写入数据FuturevoidsetSP()async{finalspawaitSharedPreferences.getInstance();awaitsp.setString(token,abc123xyz);awaitsp.setInt(userId,10086);awaitsp.setBool(isLogin,true);awaitsp.setDouble(score,98.5);awaitsp.setStringList(tags,[前端,Flutter]);}// 读取数据FuturevoidgetSP()async{finalspawaitSharedPreferences.getInstance();Stringtokensp.getString(token)??;int uidsp.getInt(userId)??0;bool loginsp.getBool(isLogin)??false;ListStringtagssp.getStringList(tags)??[];}// 删除单个keyawaitsp.remove(token);// 清空全部存储awaitsp.clear();2.4 封装全局工具类sp_util.dartimportdart:convert;importpackage:shared_preferences/shared_preferences;classSPUtil{staticFutureSharedPreferencesgetInstance()async{returnawaitSharedPreferences.getInstance();}// 存基础类型staticFuturevoidset(Stringkey,dynamicvalue)async{finalspawaitgetInstance();if(valueisString){awaitsp.setString(key,value);}elseif(valueisint){awaitsp.setInt(key,value);}elseif(valueisdouble){awaitsp.setDouble(key,value);}elseif(valueisbool){awaitsp.setBool(key,value);}elseif(valueisListString){awaitsp.setStringList(key,value);}else{// 对象转json存储awaitsp.setString(key,jsonEncode(value));}}// 读取字符串/对象staticFutureT?getT(Stringkey)async{finalspawaitgetInstance();dynamicvalsp.get(key);if(TStringval!null){try{returnjsonDecode(val)asT;}catch(_){returnvalasT;}}returnval;}// 删除keystaticFuturevoidremove(Stringkey)async{finalspawaitgetInstance();awaitsp.remove(key);}// 清空所有staticFuturevoidclearAll()async{finalspawaitgetInstance();awaitsp.clear();}}使用示例// 存储登录状态awaitSPUtil.set(isLogin,true);// 读取bool loginawaitSPUtil.get(isLogin)??false;// 存储对象MapawaitSPUtil.set(user,{id:1,name:小明});MapuserawaitSPUtil.get(user);2.5 缺点总结仅支持基础类型对象必须 JSON 序列化大量数据读写性能差跨平台底层实现不一致部分机型存在延迟无加密、无索引不适合缓存列表数据。三、本地文件存储dart:io path_provider3.1. 依赖dependencies:flutter:sdk:flutterpath_provider:^2.1.2path:^1.8.33.2. 常用文件目录临时目录getTemporaryDirectory() 缓存文件系统可自动清理持久目录getApplicationDocumentsDirectory() 永久存储卸载才删除缓存目录getApplicationCacheDirectory()3.3. 读写文本 / JSON 文件importdart:io;importdart:convert;importpackage/path_provider/path_provider.dart;importpackage/path/path.dart;// 获取文件路径FutureStringgetFilePath()async{DirectorydirawaitgetApplicationDocumentsDirectory();returnjoin(dir.path,user_info.json);}// 写入json文件FuturevoidwriteFile()async{StringpathawaitgetFilePath();FilefileFile(path);Mapdata{id:1,name:李四};awaitfile.writeAsString(jsonEncode(data));}// 读取文件FutureMap?readFile()async{StringpathawaitgetFilePath();FilefileFile(path);if(!awaitfile.exists())returnnull;Stringcontentawaitfile.readAsString();returnjsonDecode(content);}// 删除文件FuturevoiddeleteFile()async{StringpathawaitgetFilePath();FilefileFile(path);if(awaitfile.exists())awaitfile.delete();}3.4. 二进制文件图片 / 文件缓存// 写入字节awaitfile.writeAsBytes([0xff,0xff]);// 读取字节Listintbytesawaitfile.readAsBytes();3.5. 优缺点✅ 优点自由控制文件适合图片、日志、导出文档❌ 缺点无键值索引查询麻烦需要手动解析 JSON无内置加密大批量数据效率极低四、Hive 高性能 NoSQL4.1. 完整依赖dependencies:flutter:sdk:flutterhive:^2.2.3hive_flutter:^1.1.0dev_dependencies:hive_generator:^1.1.5build_runner:^2.4.64.2. 全局初始化 main.dartimportpackage:flutter/material.dart;importpackage:hive_flutter/hive_flutter.dart;voidmain()async{WidgetsFlutterBinding.ensureInitialized();awaitHive.initFlutter();// 有自定义模型需要在这里注册适配器// Hive.register(UserAdapter());runApp(constMyApp());}4.3. 基础键值 CRUD无需模型// 打开盒子数据表finalboxawaitHive.openBox(user_box);// 写入awaitbox.put(token,token_123);awaitbox.putAll({id:1,name:王五});// 读取Stringtokenbox.get(token,defaultValue:);// 修改awaitbox.put(token,new_token);// 删除单个keyawaitbox.delete(token);// 清空整张表awaitbox.clear();4.4. 存储自定义实体类存储4.4.1. 创建模型 user_model.dartimportpackage:hive/hive.dart;partuser.g.dart;HiveType(typeId:0)classUserextendsHiveObject{HiveField(0)int id;HiveField(1)Stringname;HiveField(2)bool vip;User({requiredthis.id,requiredthis.name,requiredthis.vip});}4.4.2. 生成适配器命令flutter pub run build_runner build4.4.3. main 中注册模型// main中注册awaitHive.initFlutter();Hive.registerAdapter(UserAdapter());4.4.4 对象 CRUD 操作// 初始化注册适配器// Hive.registerAdapter(UserAdapter());varboxawaitHive.openBoxUser(user_table);// 新增awaitbox.add(User(id:1,name:张三,vip:false));// 根据key存储awaitbox.put(1,User(id:1,name:张三,vip:true));// 查询全部ListUserlistbox.values.toList();// 单个查询User?ubox.get(1);// 修改HiveObject自带saveu?.name新名字;awaitu?.save();// 删除awaitbox.delete(1);4.5. 加密存储密码 / 敏感数据ListintkeyHive.generateSecureKey();varsecureBoxawaitHive.openBox(secure,encryptionCipher:HiveAesCipher(key));awaitsecureBox.put(pwd,123456);4.6 全局工具类 hive_util.dartimportpackage:hive/hive;importpackage:hive_flutter/hive_flutter;classHiveUtil{// 打开盒子统一封装staticFutureBoxopenBox(StringboxName)async{returnawaitHive.openBox(boxName);}// 写入键值staticFuturevoidput(StringboxName,Stringkey,dynamicvalue)async{varboxawaitopenBox(boxName);awaitbox.put(key,value);}// 读取staticdynamicget(StringboxName,Stringkey,{dynamicdefaultValue})async{varboxawaitopenBox(boxName);returnbox.get(key,defaultValue:defaultValue);}// 删除keystaticFuturevoidremove(StringboxName,Stringkey)async{varboxawaitopenBox(boxName);awaitbox.delete(key);}// 清空盒子staticFuturevoidclear(StringboxName)async{varboxawaitopenBox(boxName);awaitbox.clear();}// 关闭所有hivestaticFuturevoidcloseAll()async{awaitHive.close();}}使用示例// 存储登录状态awaitHiveUtil.put(user_box,isLogin,true);bool loginawaitHiveUtil.get(user_box,isLogin,defaultValue:false);4.6. 优缺点纯 Dart 实现无原生交互双端表现一致支持直接存储对象无需 JSON 手动序列化读写速度远超 SP适合列表缓存内置 AES 加密可存储敏感信息支持懒加载占用内存低支持增删改查、条件过滤、排序。❌ 缺点不支持复杂联表查询海量结构化数据不如 SQLite五、Drift SQLite 关系型数据库5.1. 依赖dependencies:flutter:sdk:flutterdrift:^2.19.0sqlite3_flutter_libs:^0.5.0dev_dependencies:drift_dev:^2.19.0build_runner:^2.4.05.2. 核心特点底层 SQLite支持标准 SQL、事务、分页、联表、索引自动生成 Dart 模型类型安全支持数据库加密、版本迁移适合百万级离线结构化数据聊天、本地订单5.3. 简易表定义示例importpackage:drift/drift;partdb.g.dart;classUserTableextendsTable{IntColumngetidinteger().autoIncrement()();TextColumngetnametext()();BoolColumngetvipboolean().withDefault(constConstant(false))();}DriftDatabase(tables:[UserTable])classAppDbextends_$AppDb{AppDb():super(openConnection());overrideintgetschemaVersion1;}5.4. 基础增删改查finaldbAppDb();// 插入awaitdb.into(userTable).insert(UserTableCompanion(name:constValue(张三)));// 查询所有ListUserTableDatalistawaitdb.select(userTable).get();// 条件查询varsingleawait(select(userTable)..where((t)t.id.equals(1))).getSingleOrNull();// 更新awaitupdate(userTable).replace(UserTableData(id:1,name:李四,vip:false));// 删除awaitdelete(userTable).deleteWhere((t)t.id.equals(1));5.5. 优缺点✅ 优点标准 SQL、支持复杂联表、分页、事务、海量数据稳定❌ 缺点学习成本高需要维护表结构与版本迁移简单配置场景过度设计总结所有存储操作均为异步必须 await密码等敏感数据禁止明文优先 Hive 加密不要在 build 同步读写存储阻塞 UI超大二进制不要存在数据库存本地文件只存路径。