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

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()调用
}

验证修复

完成修改后重新运行应用:

  1. 添加新主题,关闭应用
  2. 重启应用,检查主题是否保留
  3. 测试删除功能,确认重启后删除操作也能持久化

内容的提问来源于stack exchange,提问作者Luca Micarelli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:27:47