Flutter无法配置VideoPlayerController

问题描述 投票:1回答:1

在处置我的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并合并后退按钮?

flutter dart dispose
1个回答
1
投票

您可以在下面复制粘贴运行完整代码并取消标记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

完整代码

enter image description here
© www.soinside.com 2019 - 2024. All rights reserved.