Flutter使用Hive+GetX存储数据时遇typeId:32适配器注册错误
解决Hive报错“unknown typeId: 32”及重启应用白屏问题
核心问题分析
你遇到的错误根源在于两个关键问题:
- 适配器注册时机错误:Hive要求自定义类型的适配器必须在打开对应盒子之前完成注册,否则无法解析存储的自定义对象。
- 控制器过早访问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
相关产品推荐
相关产品推荐

