我有这样的视频播放器
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());
}
},
),
// This trailing comma makes auto-formatting nicer for build methods.
));
}
但是当我按下返回按钮时出现此错误
Another exception was thrown: A VideoPlayerController was used after being disposed.
我以多种方式进行测试,但是不处理如何处置videoplayerContoroller id删除onWillPop方法中的处置,但不处置视频的处理方式请尽快帮助我,我需要帮助我进行多种测试,但是不起作用如何处理videoplayerContoroller id删除onWillPop方法中的处理方法,但不要处理视频的处理方法]
您可以在下面复制粘贴运行完整代码并取消标记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
完整代码