加载Youtube视频列表时报错List<dynamic>无法赋值给Iterable<Video>如何解决
错误原因
addAll()方法返回值为void,仅会修改调用它的列表实例本身,不会返回新的列表,你将addAll()的执行结果赋值给List<Video>类型的allVideos属于语法错误。- 接口返回的
moreVideos是List<dynamic>类型,没有做类型转换直接传入addAll()方法,不符合参数要求的Iterable<Video>类型,触发类型不匹配报错。
修复方案
你需要先将moreVideos中的每一个动态类型元素转换为Video类型的实例,再完成列表拼接,两种常用写法如下:
写法1:生成新列表赋值(无副作用)
_loadMoreVideos() async { _isLoading = true; List moreVideos = await APIService.instance .fetchVideosFromPlaylist(playlistId: _channel.uploadPlaylistId); // 转换dynamic元素为Video实例,根据你的项目实际转换逻辑调整Video.fromJson部分 List<Video> convertedVideos = moreVideos.map((e) => Video.fromJson(e)).toList(); // 拼接原有视频和新视频 List<Video> allVideos = [..._channel.videos, ...convertedVideos]; setState(() { _channel.videos = allVideos; }); _isLoading = false; }
写法2:直接修改原有列表(简化写法)
如果你不需要额外保留拼接前的原有视频列表,可以直接调用原有列表的addAll方法更新:
_loadMoreVideos() async { _isLoading = true; List moreVideos = await APIService.instance .fetchVideosFromPlaylist(playlistId: _channel.uploadPlaylistId); List<Video> convertedVideos = moreVideos.map((e) => Video.fromJson(e)).toList(); setState(() { _channel.videos.addAll(convertedVideos); }); _isLoading = false; }
注意事项
如果你的Video类没有fromJson构造方法,请替换为你项目中实际将接口返回的Map数据转换为Video实例的逻辑即可。
内容的提问来源于stack exchange,提问作者ashish rana
相关产品推荐
相关产品推荐

