You need to enable JavaScript to run this app. Flutter个人收支应用重启后交易记录丢失的本地保存方法咨询
优惠活动
大模型
产品
解决方案
定价
更多

Flutter个人收支应用重启后交易记录丢失的本地保存方法咨询

个人收支App轻量本地持久化极简实现方案

适配刚完成第四章demo、觉得课程第六章本地存储方案繁琐的开发场景,零复杂配置,重构量不超过20行代码

  • 选型推荐:直接使用shared_preferences插件,不需要搭建数据库结构、配置原生权限,完全匹配小体量交易记录的存储需求。对比课程第六章通常教授的SQLite类方案(需要设计表结构、编写数据库helper、处理版本迁移),整体操作流程精简60%以上,重构量极低
  • 第一步:插件集成
    直接在项目pubspec.yaml的依赖块添加一行配置,执行flutter pub get即可完成接入,无需修改任何Android/iOS端的原生配置:
    shared_preferences: ^2.2.0
  • 第二步:最小化改造现有业务逻辑
    当前项目本来就是把交易记录存在内存变量里,完全不需要改动原有UI和状态交互逻辑,只需要补充两个存取方法,插在现有流程节点上即可:
    1. 持久化存储触发:每次执行新增交易、删除交易的操作完成后,调用存储方法把当前内存里的交易列表序列化后存入本地
    // 写入交易记录到本地
    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);
    }
    
    1. 应用启动加载:在页面初始化的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.08 09:27:02