Flutter应用关闭后如何保存数据?TODO列表持久化咨询
嗨,我当初做第一个Todo应用的时候也踩过一模一样的坑!你的待办列表现在只存在应用的内存里,一旦关闭应用,内存里的数据就会被清空,所以重启后就啥都没了。下面给你梳理几种数据持久化的方案,从快速上手的简易版到适合复杂场景的最佳实践都有:
简易解决方案(快速救急,适合小数据量)
如果你的Todo只是简单的文本内容,没有太多复杂属性,shared_preferences绝对是最快的选择——它是Flutter官方推荐的轻量存储方案,专门用来存键值对类型的小数据。
步骤如下:
- 先添加依赖到
pubspec.yaml,或者直接在终端运行:
flutter pub add shared_preferences
- 封装一个简单的存储工具类,方便重复调用:
import 'package:shared_preferences/shared_preferences.dart'; class TodoStorage { // 定义存储的键名 static const String _todoKey = 'saved_todos'; // 保存待办列表 static Future<void> saveTodos(List<String> todos) async { final prefs = await SharedPreferences.getInstance(); await prefs.setStringList(_todoKey, todos); } // 加载待办列表 static Future<List<String>> loadTodos() async { final prefs = await SharedPreferences.getInstance(); // 如果没有数据就返回空列表 return prefs.getStringList(_todoKey) ?? []; } }
- 在你的业务逻辑里调用:
- 添加Todo后,立刻调用
await TodoStorage.saveTodos(yourTodoList); - 应用启动时,调用
final initialTodos = await TodoStorage.loadTodos();来初始化你的列表
- 添加Todo后,立刻调用
最佳实践方案(适合复杂场景)
如果你的Todo需要包含更多属性(比如完成状态、创建时间、分类),或者之后可能需要做查询、排序等操作,那轻量的NoSQL数据库会更合适,比如Hive或者Isar——它们都是专为Flutter优化的,性能好,使用也不复杂。
这里以Hive为例:
- 添加依赖:
flutter pub add hive hive_flutter
- 初始化Hive(在main函数里):
import 'package:hive_flutter/hive_flutter.dart'; import 'your_todo_model_path.dart'; void main() async { // 初始化Hive await Hive.initFlutter(); // 注册Todo模型的适配器(需要先创建模型) Hive.registerAdapter(TodoAdapter()); // 打开存储Todo的盒子 await Hive.openBox<Todo>('todos_box'); runApp(const YourApp()); }
- 创建Todo模型并生成适配器:
import 'package:hive/hive.dart'; // 这个part语句会自动生成适配器代码 part 'todo.g.dart'; @HiveType(typeId: 0) class Todo extends HiveObject { @HiveField(0) String title; @HiveField(1) bool isCompleted; @HiveField(2) DateTime createTime; Todo({ required this.title, this.isCompleted = false, required this.createTime, }); }
然后在终端跑命令生成适配器:
flutter packages pub run build_runner build
- 操作数据库:
// 获取存储盒子 final todoBox = Hive.box<Todo>('todos_box'); // 添加新Todo await todoBox.add(Todo( title: '买牛奶', createTime: DateTime.now(), )); // 加载所有Todo final List<Todo> todos = todoBox.values.toList(); // 更新某个Todo final targetTodo = todos.first; targetTodo.isCompleted = true; await targetTodo.save(); // 删除Todo await todoBox.delete(targetTodo.key);
这种方式不仅能存复杂对象,还支持增删改查,扩展性很强,适合后续功能迭代。
如果你的应用涉及更复杂的关系型数据,也可以考虑用SQLite(结合moor/isar_sqlite这类ORM库),但对于Todo应用来说,Hive/Isar已经足够轻便好用了。
内容的提问来源于stack exchange,提问作者Ostap Filipenko
相关产品推荐
相关产品推荐

