flutter如何检测video_player的播放完成状态
在Flutter中使用video_player插件时,如何检测视频是否播放完成?我尝试监听controller的状态,但没有找到直接判断播放结束的方法。目前只能在onPositionChanged里比较duration和position,感觉不太优雅。有没有更准确的回调或事件可以监听?
2 回复
使用video_player_controller的addListener方法监听播放状态。当value.position >= value.duration时,表示视频播放完成。
更多关于flutter如何检测video_player的播放完成状态的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在 Flutter 中,使用 video_player 插件检测视频播放完成状态,可以通过监听 VideoPlayerController 的播放位置来实现。当播放位置达到视频总时长时,表示播放完成。
以下是实现步骤和示例代码:
- 添加依赖:在
pubspec.yaml中添加video_player和chewie(可选,用于增强播放器控件)依赖。 - 初始化控制器:创建
VideoPlayerController并初始化。 - 监听播放位置:使用
addListener方法监听控制器状态,比较position和duration。
示例代码:
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
class VideoPlayerScreen extends StatefulWidget {
@override
_VideoPlayerScreenState createState() => _VideoPlayerScreenState();
}
class _VideoPlayerScreenState extends State<VideoPlayerScreen> {
late VideoPlayerController _controller;
@override
void initState() {
super.initState();
// 初始化控制器,替换为你的视频 URL 或本地文件路径
_controller = VideoPlayerController.network('https://example.com/sample.mp4')
..initialize().then((_) {
setState(() {});
// 开始监听
_controller.addListener(_checkVideoCompletion);
});
}
void _checkVideoCompletion() {
if (_controller.value.position >= _controller.value.duration &&
_controller.value.duration > Duration.zero) {
// 播放完成后的操作,例如显示提示或跳转页面
print('视频播放完成');
// 可选:移除监听以避免重复触发
_controller.removeListener(_checkVideoCompletion);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: _controller.value.isInitialized
? AspectRatio(
aspectRatio: _controller.value.aspectRatio,
child: VideoPlayer(_controller),
)
: CircularProgressIndicator(),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
_controller.value.isPlaying
? _controller.pause()
: _controller.play();
});
},
child: Icon(
_controller.value.isPlaying ? Icons.pause : Icons.play_arrow,
),
),
);
}
@override
void dispose() {
_controller.removeListener(_checkVideoCompletion);
_controller.dispose();
super.dispose();
}
}
关键点说明:
- 在
initState中初始化控制器并添加监听。 _checkVideoCompletion方法检查当前位置是否达到总时长,并处理完成逻辑。- 在
dispose中移除监听并释放控制器,避免内存泄漏。
使用此方法即可准确检测视频播放完成状态。

