Flutter个人收支应用重启后交易记录丢失的本地保存方法咨询
个人收支App轻量本地持久化极简实现方案
适配刚完成第四章demo、觉得课程第六章本地存储方案繁琐的开发场景,零复杂配置,重构量不超过20行代码
- 选型推荐:直接使用
shared_preferences插件,不需要搭建数据库结构、配置原生权限,完全匹配小体量交易记录的存储需求。对比课程第六章通常教授的SQLite类方案(需要设计表结构、编写数据库helper、处理版本迁移),整体操作流程精简60%以上,重构量极低 - 第一步:插件集成
直接在项目pubspec.yaml的依赖块添加一行配置,执行flutter pub get即可完成接入,无需修改任何Android/iOS端的原生配置:shared_preferences: ^2.2.0 - 第二步:最小化改造现有业务逻辑
当前项目本来就是把交易记录存在内存变量里,完全不需要改动原有UI和状态交互逻辑,只需要补充两个存取方法,插在现有流程节点上即可:- 持久化存储触发:每次执行新增交易、删除交易的操作完成后,调用存储方法把当前内存里的交易列表序列化后存入本地
// 写入交易记录到本地 Future<void> _saveUserTransactions(List<dynamic> transactionList) async { final prefs = await SharedPreferences.getInstance(); final jsonString = jsonEncode(transactionList.map((e) => e.toJson()).toList()); await prefs.setString('key_transaction_records', jsonString); }- 应用启动加载:在页面初始化的
initState阶段,读取本地存储的序列化字符串,反序列化后赋值给原来存交易记录的内存变量,直接复用现有UI的渲染逻辑
// 启动时加载历史交易记录 Future<void> _loadUserTransactions() async { final prefs = await SharedPreferences.getInstance(); final savedContent = prefs.getString('key_transaction_records'); if(savedContent == null) return; final decodedList = jsonDecode(savedContent) as List; // 直接更新原有状态变量,和之前内存逻辑完全打通 setState(() { transactionList = decodedList.map((e) => Transaction.fromJson(e)).toList(); }); } - 第三步:补充极小的适配代码
给自定义的Transaction类补充两个三行左右的方法即可:toJson()把类内的标题、金额、交易时间等字段转成可序列化的Map,fromJson()把Map转回类实例,不需要引入复杂的序列化工具库 - 效果验证:完成改造后,重启应用时之前录入的所有交易记录会自动从本地加载,不需要重复录入,针对几十到上百条的交易记录体量,读写速度完全无感知
内容的提问来源于stack exchange,提问作者Nuaiman Ashiq
相关产品推荐
相关产品推荐

