Flutter使用TabController滑动切换标签时Hive box数据被清空问题
问题诱因分析
- Tab页未保活+错误关闭Hive Box:默认TabBarView不会缓存不可见的标签页,切换到screen_b时screen_a会被销毁,如果你在screen_a的
dispose生命周期中调用了_level.close()关闭了level box,切回screen_a时虽然initState会重新执行Hive.box<Level>('level'),但如果你的Hive是用内存模式初始化(Hive.initMemory())、或是关闭box时未持久化数据,重新打开的box就会是空的。 - 其他标签页误操作清空了Box数据:检查screen_b、screen_c的代码中是否存在调用
_level.clear()、批量删除level数据、或是覆盖写入所有数据的逻辑,切换标签时这些逻辑被触发导致全量数据被清空。 - Hive数据未持久化刷盘:如果前期写入level数据时只调用了同步写入方法,未等待异步刷盘完成(没有加
await修饰put/add操作,也没有手动调用await _level.flush()),应用运行过程中如果出现临时的内存抖动,未刷入磁盘的Hive内存缓存数据会被释放,重新读取box就会拿到空数据。 - Level实体类序列化/反序列化异常:如果Level类的Hive Adapter注册有误、或者字段的
@HiveField注解被修改过,切换页面重新读取box时无法正常反序列化数据,会表现为values为空列表。
快速排查方案
- 给所有标签页的State混入
AutomaticKeepAliveClientMixin,重写wantKeepAlive返回true,先排除页面销毁导致的连带问题 - 在所有调用level box的
close、clear、deleteAll方法的位置加断点,确认这些方法是否被意外触发 - 写入Hive数据时务必加上
await修饰,写入完成后调用await _level.flush()主动刷盘确认数据持久化
内容的提问来源于stack exchange,提问作者ziba najafi
相关产品推荐
相关产品推荐

