Flutter更新youtube_player_flutter的initialVideoId后播放器不重载怎么办
youtube_player_flutter 点击列表更新视频无响应解决方案
核心原因
initialVideoId 是控制器初始化时仅生效一次的参数,当前写法存在两个核心问题:
- 旧的
YoutubePlayerController没有被正确释放,占用了播放器实例 - 重新创建的控制器没有和页面上的YoutubePlayer组件绑定触发重建
可行修复方案
方案1:调用控制器自带的load()方法更新视频(最推荐)
不需要重新创建控制器,直接调用现有控制器的load()方法传入新视频ID即可,性能最优。
修改点击回调逻辑:
// 删掉原有controllerFunc方法,直接用现有控制器调用API return ListTile( onTap: () { // 不需要setState,调用load方法自动触发播放器刷新 _controller.load(videosList[index]); // 如果需要自动播放可以额外加一行 _controller.play(); }, title: ...., );
方案2:强制绑定新控制器(适用于需要重置全部控制器配置的场景)
如果你要重置控制器的所有配置、监听器等内容,需要在重建控制器前先释放旧实例,并且给YoutubePlayer组件加唯一key强制重建:
- 修改controllerFunc逻辑:
controllerFunc(String initVid) { // 先释放旧控制器资源 _controller.dispose(); setState(() { _controller = YoutubePlayerController( initialVideoId: initVid, flags: const YoutubePlayerFlags( mute: false, autoPlay: false, disableDragSeek: false, loop: false, isLive: false, forceHD: false, enableCaption: true, ), )..addListener(listener); _videoMetaData = const YoutubeMetaData(); }); }
- 给YoutubePlayer组件绑定和控制器关联的key,强制videoId变化时重建组件:
YoutubePlayer( key: ValueKey(_controller.initialVideoId), // 新增此行配置 controller: _controller, // 其余原有配置保持不变 )
注意事项
- 不要在setState里重复调用YoutubePlayer组件的构建方法,会导致逻辑混乱
- 页面销毁时必须调用
_controller.dispose()释放资源,避免内存泄漏
内容的提问来源于stack exchange,提问作者mafortis
相关产品推荐
相关产品推荐

