Flutter Hive检索数据时报List<dynamic>无法转List<AudioModel>错误如何解决
问题原因
Hive 存储数据时不会保留集合的泛型类型,从 Box 中读取 List 类型数据时默认返回的是 List<dynamic>,无法直接赋值给 List<AudioModel> 类型的变量,因此触发类型不匹配异常。另外需要确认你存入的初始空列表newPlaylist是显式声明为List<AudioModel>类型,不要用var推导为List<dynamic>。
前置检查
首先确认你的自定义 AudioModel 类已完成 Hive 适配配置:
- 类声明上添加了
@HiveType()注解 - 所有需要持久化的字段添加了
@HiveField(序号)注解 - 项目启动时已注册对应的适配器:
Hive.registerAdapter(AudioModelAdapter())
解决方法
方案1(推荐):声明Box时指定泛型
你在打开存储播放列表的 Box 时直接指定泛型约束,后续读写都会自动匹配类型,无需额外转换:
// 打开Box时指定泛型 final allSongsBox = await Hive.openBox<List<AudioModel>>('你的Box名称');
修改后原读取代码可以直接使用,注意 Hive 的 get 方法为同步方法,无需加 await:
void getPlaylist(context) { List<AudioModel>? playlistSongs = allSongsBox!.get(playlistName); if(playlistSongs == null) return; print(playlistSongs); if(isExists()){ ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text("Song already exists"),)); } }
方案2(临时兼容):读取时手动转换类型
如果不想修改Box的声明,读取时手动对返回的List做类型转换即可:
void getPlaylist(context) { // 先把返回值转为List,再通过cast方法转换泛型 List<AudioModel> playlistSongs = (allSongsBox!.get(playlistName) as List).cast<AudioModel>(); print(playlistSongs); if(isExists()){ ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text("Song already exists"),)); } }
内容的提问来源于stack exchange,提问作者Vivek T V
相关产品推荐
相关产品推荐

