Flutter中State初始化时seekTo()方法无法生效问题求助
YouTube视频播放器无法从指定时间点启动的问题
我用Flutter的youtube_player_flutter库实现了YouTube视频播放功能,需求是让视频从指定时间点开始播放,但目前播放器总是从0秒开始,不符合预期。以下是我的代码:
class _stretchDetailState extends State<stretchDetail>{ late YoutubePlayerController _controller; @override void initState(){ int skipTo = widget.data_transfer.last; _controller = YoutubePlayerController( initialVideoId: widget.data_transfer[4], // Youtube Id flags: YoutubePlayerFlags( autoPlay: true, mute: false, ), ); _controller.seekTo(Duration(seconds: skipTo)); // skipTo is int var that tell from when to start. } Widget build(BuildContext context) { // _controller.seekTo(Duration(seconds: skipTo)); return Scaffold( body:Column( children: [ YoutubePlayer( controller: _controller, showVideoProgressIndicator: true, ), Container( height:20 ), ], ) ); } }
问题原因及解决办法
- 核心问题:调用时机错误
你在initState中直接调用seekTo,但此时播放器尚未完成初始化,视频资源还未加载完成,这个跳转指令不会被执行。
方法一:初始化时直接指定起始时间(推荐)
YoutubePlayerFlags提供了startAt参数,可以直接在初始化控制器时设置视频的起始播放秒数,无需额外调用seekTo:
@override void initState(){ int skipTo = widget.data_transfer.last; _controller = YoutubePlayerController( initialVideoId: widget.data_transfer[4], flags: YoutubePlayerFlags( autoPlay: true, mute: false, startAt: skipTo, // 直接设置起始播放秒数 ), ); }
方法二:监听播放器状态,在就绪后跳转
如果需要更灵活的控制逻辑,可以通过监听播放器状态,在视频进入ready状态后执行跳转:
@override void initState(){ int skipTo = widget.data_transfer.last; _controller = YoutubePlayerController( initialVideoId: widget.data_transfer[4], flags: YoutubePlayerFlags( autoPlay: true, mute: false, ), ); // 添加状态监听器 _controller.addListener(() { if (_controller.value.playerState == PlayerState.ready) { _controller.seekTo(Duration(seconds: skipTo)); // 仅需执行一次的话,可在此移除监听器避免重复触发 _controller.removeListener(() {}); } }); }
另外需要确认skipTo的值为有效的正整数,若该值为0或负数,播放器也会默认从0秒开始播放。
内容的提问来源于stack exchange,提问作者MooNChilD Song
相关产品推荐
相关产品推荐

