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

Flutter使用Hive+GetX存储数据时遇typeId:32适配器注册错误

解决Hive报错“unknown typeId: 32”及重启应用白屏问题

核心问题分析

你遇到的错误根源在于两个关键问题:

  1. 适配器注册时机错误:Hive要求自定义类型的适配器必须在打开对应盒子之前完成注册,否则无法解析存储的自定义对象。
  2. 控制器过早访问Hive资源:TransactionController直接在成员变量和构造函数中读取Hive盒子,此时Hive可能还未完成初始化,导致读取失败。

具体修复步骤

1. 调整main函数中适配器注册与盒子打开的顺序

将适配器注册移到打开盒子之前,确保Hive在读取数据前能识别自定义类型:

void main() async
{
  WidgetsFlutterBinding.ensureInitialized();
  Directory dir=await getApplicationDocumentsDirectory();
  await Hive.initFlutter(dir.path);

  // 先注册适配器,再打开对应盒子
  Hive.registerAdapter<TransactionModel>(TransactionModelAdapter());
  await Hive.openBox<TransactionModel>('a');
  
  runApp(MyApp());
}

2. 修正TransactionController的初始化逻辑

改用GetX的onInit方法完成Hive盒子的初始化和数据加载,确保Hive资源已准备就绪:

class TransactionController extends GetxController
{
  List<TransactionModel> _transactions=[];
  late Box<TransactionModel> transactionbox; // 延迟初始化盒子

  List<TransactionModel> get transactions{
    return _transactions;
  }

  @override
  void onInit() {
    super.onInit();
    transactionbox = Hive.box('a');
    _loadTransactions();
  }

  // 单独封装数据加载逻辑
  void _loadTransactions() {
    _transactions.clear();
    for(int x=0;x<transactionbox.values.length;x++)
    {
      var trns=transactionbox.getAt(x);
      if(trns!=null)
        _transactions.add(trns);
    }
  }

  int get countlength{
    return _transactions.length;
  }

  void addTransaction(TransactionModel transaction)
  {
    _transactions.add(transaction);
    transactionbox.add(transaction);
    update();
  }
}

3. 清除旧的Hive缓存(必做)

首次运行时可能已经写入了无法解析的数据到盒子中,重启后会持续触发错误。建议:

  • 直接卸载应用重新安装,清除旧的Hive存储文件;
  • 或在开发环境中临时添加清除逻辑(仅测试阶段使用):
// 在main函数初始化Hive后添加
await Hive.deleteBoxFromDisk('a');

验证修复

完成以上修改后,重新运行并重启应用,即可正常读取Hive中的数据,不再出现白屏和typeId错误。

内容的提问来源于stack exchange,提问作者Irfan Ganatra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:45:30