问答 问答库 技术分享 Flutter使用VideoPlayer多次切换页面导致APP崩溃

Flutter使用VideoPlayer多次切换页面导致APP崩溃

下面代码 从视频列表打开播放器,然后关闭,再打开关闭,重复10几20几次会导致APP崩溃关闭,怀疑是内存泄漏,不知道代码哪里有问题

class VideoPlayerState extends State<VideoPlayerWidget> {
/**
* 视频播放控制器
*/
VideoPlayerController controller;

/**
* 初始执行播放了?
*/
bool startedPlaying = false;

/**
* 初始执行播放 播放中?
*/
bool startedIsPlaying = false;

/**
* 单例播放器
*/
var videoPlayer;

@override
void initState() {
super.initState();
//初始化 视频播放控制器
controller = VideoPlayerController.network(
//视频URL
widget.videoUrl)
//初始化 取视频播放控制器对象
..initialize()
//initialize 返回future对象执行then
.then(
//普通参数名 void类型
(arg) {
//初始 播放
controller.play().then((arg) {
// Ensure the first frame is shown after the video is initialized, even before the play button has been pressed.
//更新 开始播放了
setState(() {
//初始化播放器
videoPlayer = VideoPlayer(controller);
startedPlaying = true;
});
});
});
//设置监听
controller.addListener(() {
//监听 "初始播放中"
if (controller.value.isPlaying) {
//设置标志
startedIsPlaying = true;
}
});
}

@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
children: <Widget>[
//视频视图
Center(
child:
//如果控制器初始化完成
startedPlaying
//显示播放器视图
? AspectRatio(
aspectRatio: controller.value.aspectRatio,
child: videoPlayer,
)
//否则显示空视图
: Text(Strings.stringsIns.waitVideo),
),
//关闭按钮视图
GestureDetector(
onTap: () {
//点击时 关闭页面
Navigator.pop(context);
},
//关闭图片视图
child: Container(
//帧布局的右上角
alignment: Alignment.topRight,
child: Image.asset('images/pop_close.png'),
//设置外边距 避开顶部栏
margin: EdgeInsets.all(15),
//内边距 易点击
padding: EdgeInsets.all(5),
),
)
],
),
//悬浮控制按钮s
floatingActionButton: FloatingActionButton(
//点击时
onPressed: () {
// //控制器是否初始化完成
// bool initialized = _controller.value.initialized;
// //是否缓冲中
// bool isBuffering = _controller.value.isBuffering;
//如果初始播放了
if (startedIsPlaying) {
//如果已经缓冲过 且当前不在缓冲中
// if (isBuffering != null && !isBuffering)
{
//进行播放、暂停
setState(() {
//当前播放时间
var currentPosition=controller.value.position;
//总时间
Duration duration=controller.value.duration;
//如果播放完
if(currentPosition==duration){
//播放时间跳转到0
controller.seekTo(Duration());
}
//进行播放、暂停
controller.value.isPlaying
? controller.pause()
: controller.play();
});
}
}
},
child: Icon(
//判断控制器的播放状态-》显示按钮:播放、暂停
controller.value.isPlaying ? Icons.pause : Icons.play_arrow,
),
),
);
}

@override
void dispose() {
//退出时 控制器释放
controller.dispose();
super.dispose();

log('_controller.dispose------------');
}
}


赵六

引依赖应该只引service啊,引controller肯定都扫描出来了啊