Flutter开发:Hive本地存储重启后数据丢失问题求助
Flutter Hive 重启后数据丢失问题解决方案
核心问题及修复步骤
1. Box名称大小写不匹配
Hive的Box名称区分大小写,你的代码中存在两处不一致:
- main函数中打开的是
'myBox' - HomePage中引用的是
'mybox'
这会导致实际操作两个独立的Box,数据存入小写的mybox,重启后却从大写的myBox读取,自然找不到数据。
修复:
统一Box名称,两处都改为'myBox':
- main中保持:
await Hive.openBox('myBox'); - HomePage中修改为:
final _myBox = Hive.box('myBox');
2. 自定义Topic类未注册Hive适配器
Hive无法直接存储自定义对象,必须为Topic类创建并注册TypeAdapter,否则存入的数据是无法反序列化的无效格式,重启后无法恢复。
修复步骤:
第一步:添加依赖
在pubspec.yaml的dev_dependencies中添加:
dev_dependencies: hive_generator: ^2.0.0 build_runner: ^2.4.0
执行flutter pub get安装依赖。
第二步:修改Topic类添加注解
给类和字段加上Hive注解:
import 'package:hive/hive.dart'; @HiveType(typeId: 0) // typeId需为唯一整数,从0开始 class Topic { @HiveField(0) String topicName; @HiveField(1) List todo; Topic(this.topicName) : todo = [["Add your first To-Do", false]]; // 原有方法保持不变 void addTodo(List todoList) { todo.add(todoList); } void removeTodo(int index) { todo.removeAt(index); } String getName() { return topicName; } List getTodo() { return todo; } }
第三步:生成适配器
在终端执行命令生成适配器文件:
flutter packages pub run build_runner build
执行完成后会自动生成topic.g.dart文件。
第四步:注册适配器到Hive
修改main函数,初始化后注册适配器:
void main() async { await Hive.initFlutter(); // 注册Topic适配器 Hive.registerAdapter(TopicAdapter()); var box = await Hive.openBox('myBox'); runApp(const MyApp()); }
3. 数据更新时机错误
当前createNewTopic方法中,弹出对话框后立刻调用updateTopic(),但此时用户还未点击保存,topic列表未更新,导致存入旧数据。需将updateTopic()移到saveNewTopic方法内。
修复:
修改两个方法的逻辑:
// 保存新主题 void saveNewTopic() { setState(() { topic.add(Topic(_controller.text)); _controller.clear(); }); updateTopic(); // 确保数据更新后再存入Hive Navigator.of(context).pop(); } // 创建新主题 void createNewTopic() { showDialog( context: context, builder: (context) { return DialogBox( text: "Add a new topic", controller: _controller, onSave: saveNewTopic, onCancel: () => Navigator.of(context).pop(), ); }); // 移除此处的updateTopic()调用 }
验证修复
完成修改后重新运行应用:
- 添加新主题,关闭应用
- 重启应用,检查主题是否保留
- 测试删除功能,确认重启后删除操作也能持久化
内容的提问来源于stack exchange,提问作者Luca Micarelli
相关产品推荐
相关产品推荐

