在处置我的VideoPlayerController之后,使用后退按钮时引发异常。
我的VideoPlayer和VideoPlayerController设置如下:
String url;
var plan;
_VideoPlayerScreenState(this.url,{this.plan});
Future<Null> OnWillPop(){
_controller.dispose();
if(plan!=null)
Navigator.push(context, MaterialPageRoute(builder: (context)=>
ListSession(plan :plan)));
else
Navigator.push(context, MaterialPageRoute(builder: (context)=>
ListMoves()));
}
VideoPlayerController _controller;
Future<void> _initializeVideoPlayerFuture;
@override
void initState() {
_controller = VideoPlayerController.network(
url,
);
// Initialize the controller and store the Future for later use.
_initializeVideoPlayerFuture = _controller.initialize();
// Use the controller to loop the video.
_controller.setLooping(true);
_controller.play();
super.initState();
}
@override
void dispose() {
print("+++++++++++++++++++++++++++++++++++++++++++");
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return WillPopScope(onWillPop: OnWillPop,child:Scaffold(
// Use a FutureBuilder to display a loading spinner while waiting for the
// VideoPlayerController to finish initializing.
body: FutureBuilder(
future: _initializeVideoPlayerFuture,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
// If the VideoPlayerController has finished initialization, use
// the data it provides to limit the aspect ratio of the video.
return Center(
child: AspectRatio(
aspectRatio: _controller.value.aspectRatio,
// Use the VideoPlayer widget to display the video.
child: VideoPlayer(_controller),
),
);
} else {
// If the VideoPlayerController is still initializing, show a
// loading spinner.
return Center(child: CircularProgressIndicator());
}
},
),
));
}
但是当我按下后退按钮时,出现此错误:
Another exception was thrown: A VideoPlayerController was used after being disposed.
如何正确处置我的VideoPlayerController并合并后退按钮?
您可以在下面复制粘贴运行完整代码并取消标记Navigator.push
/ Navigator.pushReplacement
以检查效果在这种情况下,您不需要处理controller
,因为controller
在此页面上是本地的,所以您只需执行_controller.pause()
您使用Navigator.push
转到下一页意味着您将从下一页pop
如果您成功地将dispose controller
设置为controller
,则当从下一页弹出时,会出现错误,因为将不再调用null
,也不会再次初始化initState
如果使用controller
,则将自动调用Navigator.pushReplacement
,您可以在演示代码中看到console show _controller.dispose。
工作演示您可以从dispose
页面上看到返回的视频,仍然可以播放
ListMove
完整代码