You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter应用关闭后如何保存数据?TODO列表持久化咨询

嗨,我当初做第一个Todo应用的时候也踩过一模一样的坑!你的待办列表现在只存在应用的内存里,一旦关闭应用,内存里的数据就会被清空,所以重启后就啥都没了。下面给你梳理几种数据持久化的方案,从快速上手的简易版到适合复杂场景的最佳实践都有:

简易解决方案(快速救急,适合小数据量)

如果你的Todo只是简单的文本内容,没有太多复杂属性,shared_preferences绝对是最快的选择——它是Flutter官方推荐的轻量存储方案,专门用来存键值对类型的小数据。

步骤如下:

  1. 先添加依赖到pubspec.yaml,或者直接在终端运行:
flutter pub add shared_preferences
  1. 封装一个简单的存储工具类,方便重复调用:
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) ?? [];
  }
}
  1. 在你的业务逻辑里调用:
    • 添加Todo后,立刻调用await TodoStorage.saveTodos(yourTodoList);
    • 应用启动时,调用final initialTodos = await TodoStorage.loadTodos();来初始化你的列表
最佳实践方案(适合复杂场景)

如果你的Todo需要包含更多属性(比如完成状态、创建时间、分类),或者之后可能需要做查询、排序等操作,那轻量的NoSQL数据库会更合适,比如Hive或者Isar——它们都是专为Flutter优化的,性能好,使用也不复杂。

这里以Hive为例:

  1. 添加依赖:
flutter pub add hive hive_flutter
  1. 初始化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());
}
  1. 创建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
  1. 操作数据库:
// 获取存储盒子
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:22:29