Hive中调用getAt获取指定索引元素却返回整个列表的问题
问题描述
使用以下代码将PropertiesEntity列表存入Hive的LazyBox:
@override Future<void> saveProperty(List? propertyEntity) async { try { final invoiceBox = await Hive.openLazyBox(_propertyBox); await invoiceBox.put('list', propertyEntity); } on CacheException catch (e) { throw CacheException(e.message); } }
通过get方法可以正常获取整个列表:
@override Future<List<PropertiesEntity>?> getPropertiesList() async { try { final propertiesBox = await Hive.openLazyBox(_propertyBox); if (propertiesBox.isEmpty) return []; var list = await propertiesBox.get('list'); if (list == null) return []; return list.cast<PropertiesEntity>(); } on CacheException catch (e) { throw CacheException(e.message); } }
但调用getAt(0)试图获取索引为0的单个PropertiesEntity实例时:
@override Future<PropertiesEntity?> getPropertyDetails() async { try { final propertiesBox = await Hive.openLazyBox(_propertyBox); var propertyEntity = await propertiesBox.getAt(0); // this is the Listview's index debugPrint(propertyEntity.toString()); } on CacheException catch (e) { throw CacheException(e.message); } }
返回结果为[Instance of 'PropertiesEntity', Instance of 'PropertiesEntity'],无法得到指定索引的单个元素。
原因分析
你通过invoiceBox.put('list', propertyEntity)把整个列表作为单个值存入了LazyBox,此时LazyBox内仅存在1个条目(键为list,值是完整的列表)。getAt(0)方法的作用是获取LazyBox中索引为0的条目,也就是你存入的整个列表,所以返回的是完整列表而非列表内的单个元素。
解决方案
有两种可行的处理方式:
方式一:先获取完整列表再提取元素
修改getPropertyDetails方法,先通过get('list')拿到整个列表,再从中提取目标索引的元素:
@override Future<PropertiesEntity?> getPropertyDetails() async { try { final propertiesBox = await Hive.openLazyBox(_propertyBox); var list = await propertiesBox.get('list'); if (list == null || list.isEmpty) return null; return list.cast<PropertiesEntity>()[0]; } on CacheException catch (e) { throw CacheException(e.message); } }
方式二:将列表元素逐个存入LazyBox
修改saveProperty方法,把每个PropertiesEntity单独存入LazyBox,而非存储整个列表:
@override Future<void> saveProperty(List<PropertiesEntity>? propertyEntity) async { try { final invoiceBox = await Hive.openLazyBox(_propertyBox); await invoiceBox.clear(); // 先清空旧数据 if (propertyEntity != null) { for (var entity in propertyEntity) { await invoiceBox.add(entity); // 逐个添加元素 } } } on CacheException catch (e) { throw CacheException(e.message); } }
此时getAt(0)就能直接拿到单个PropertiesEntity实例:
@override Future<PropertiesEntity?> getPropertyDetails() async { try { final propertiesBox = await Hive.openLazyBox(_propertyBox); if (propertiesBox.isEmpty) return null; var propertyEntity = await propertiesBox.getAt(0); debugPrint(propertyEntity.toString()); return propertyEntity as PropertiesEntity?; } on CacheException catch (e) { throw CacheException(e.message); } }
内容的提问来源于stack exchange,提问作者John Joe
相关产品推荐
相关产品推荐

