flutter - 如何在 Flutter 中检测视频播放器的进度(初始化/结束)?
问题描述
我对 Flutter 很陌生,对它了解不多。
我在 Flutter 中使用 video_player 和 Chewie 包。我想在视频开始和结束时发送分析数据。
所以,我想知道这两个时间。如何检测视频开始/结束时间?
我的代码如下。
import 'package:chewie/chewie.dart';
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
class VideoItem extends StatefulWidget {
final VideoPlayerController videoPlayerController;
final bool looping;
VideoItem({
@required this.videoPlayerController,
this.looping,
Key key,
}) : super(key: key);
@override
_VideoState createState() => _VideoState();
}
class _VideoState extends State<VideoItem> {
ChewieController _chewieController;
@override
void initState() {
super.initState();
_chewieController = ChewieController(
videoPlayerController: widget.videoPlayerController,
aspectRatio: 1 / 1,
autoPlay: true,
autoInitialize: true,
looping: widget.looping,
allowFullScreen: false,
allowMuting: true,
errorBuilder: (context, errorMessage) {
return Center(
child: Text(
errorMessage,
style: TextStyle(color: Colors.white),
),
);
},
);
}
...
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(0.0),
child: Chewie(
controller: _chewieController,
),
);
}
}
解决方案
向您的 中添加一个Listener
函数videoPlayerController
,并在该函数中检查您的当前位置VideoPlayer
:
import 'package:chewie/chewie.dart';
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
class VideoItem extends StatefulWidget {
final VideoPlayerController videoPlayerController;
final bool looping;
VideoItem({
@required this.videoPlayerController,
this.looping,
Key key,
}) : super(key: key);
@override
_VideoState createState() => _VideoState();
}
class _VideoState extends State<VideoItem> {
ChewieController _chewieController;
@override
void initState() {
super.initState();
widget.videoPlayerController.addListener(checkVideo);
_chewieController = ChewieController(
videoPlayerController: widget.videoPlayerController,
aspectRatio: 1 / 1,
autoPlay: true,
autoInitialize: true,
looping: widget.looping,
allowFullScreen: false,
allowMuting: true,
errorBuilder: (context, errorMessage) {
return Center(
child: Text(
errorMessage,
style: TextStyle(color: Colors.white),
),
);
},
);
}
...
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(0.0),
child: Chewie(
controller: _chewieController,
),
);
}
void checkVideo(){
// Implement your calls inside these conditions' bodies :
if(videoPlayerController.value.position == Duration(seconds: 0, minutes: 0, hours: 0)) {
print('video Started');
}
if(videoPlayerController.value.position == videoPlayerController.value.duration) {
print('video Ended');
}
}
}
推荐阅读
- javascript - 在 sql 查询结果中添加新行
- json - Weebly Uncaught SyntaxError: Unexpected token < in JSON at position 0
- windows - inc dword ptr gs : [] 在这里做什么?
- javascript - 在 JavaScript 中如何将多个文件连接成一个对象数组
- facebook-messenger - 如何使用 Dialogflow 聊天机器人在 Facebook Messenger 中生成 Spotify 歌曲预览
- python - 如何让 VScode 运行 python 2.7.13 而不是 python 3.6
- swift - 调整 NSWindow 的大小不会正确地自动调整其 contentView
- arrays - 拆分数组并找到最大值 |max (L) -max (R)|
- webpack - Webpack 配置输出文件名使用方括号参数而不是纯文本
- jquery - 上传前无法查看图像预览