fluttercommunity / chewie

The video player for Flutter with a heart of gold
MIT License
1.93k stars 992 forks source link

A VideoPlayerController was used after being disposed. #129

Open nildebug opened 5 years ago

nildebug commented 5 years ago
class videoView extends StatefulWidget{

  @override
  _videoViewState createState() => _videoViewState();
}
class _videoViewState extends State<videoView> {
  VideoPlayerController videoPlayController;
  ChewieController chewieController;
  Chewie playerWidget;
void initState(){
   super.initState();
this.videoPlayController = VideoPlayerController.network('https://www.google.com/a.m3u8');
    this.chewieController = ChewieController(videoPlayerController: videoPlayController, aspectRatio: 16 / 9, autoPlay: true, looping: false, isLive: false);
    this.playerWidget = Chewie(
      controller: chewieController,
    );
}
void _changeVideo(url){
setState((){
 this.videoPlayController.pause();
this.videoPlayController.dispose(); //
this.videoPlayController=VideoPlayerController.network(url);
this.chewieController = ChewieController(videoPlayerController: videoPlayController, aspectRatio: 16 / 9, autoPlay: true, looping: false);
      this.playerWidget = Chewie(
        controller: this.chewieController,
      );
});
}
}

How many times has the button been pressed(_changeVideo)?It's going to play multiple video's Add this. VideoPlayController. The dispose ();It's always going to play one video, But it will tell you “A VideoPlayerController was used after being disposed. ” This problem has been bothering me for a few days. Can you take a look at it?Thank you very much!!!

nildebug commented 5 years ago

_changeVideo('https://www.google.com/b.m3u8'); _changeVideo('https://www.google.com/c.m3u8'); If you add this.videoPlayController.dispose() It's only going to play C but sometimes it's going to show up A VideoPlayerController was used after being disposed. If you don't, it's going to play b and c at the same time

suyie001 commented 5 years ago

try this.

 initState(){
    videoPlayController = VideoPlayerController.network('https://www.google.com/a.m3u8');
    chewieController = ChewieController(videoPlayerController: videoPlayController, aspectRatio: 16 / 9, 
        autoPlay: true, looping: false, isLive: false);
    playerWidget = Chewie(
        controller: chewieController,
    );
    super.initState();
}
void _changeVideo(url){
    videoPlayController.dispose();
    videoPlayController.dispose(); //
    videoPlayController=VideoPlayerController.network(url);
    chewieController = ChewieController(videoPlayerController: videoPlayController, aspectRatio: 16 / 9, 
        autoPlay: true, looping: false);
    playerWidget = Chewie(
        controller: chewieController,
    );
}
ysyfff commented 5 years ago

try this.

 initState(){
    videoPlayController = VideoPlayerController.network('https://www.google.com/a.m3u8');
    chewieController = ChewieController(videoPlayerController: videoPlayController, aspectRatio: 16 / 9, 
        autoPlay: true, looping: false, isLive: false);
    playerWidget = Chewie(
        controller: chewieController,
    );
    super.initState();
}
void _changeVideo(url){
    videoPlayController.dispose();
    videoPlayController.dispose(); //
    videoPlayController=VideoPlayerController.network(url);
    chewieController = ChewieController(videoPlayerController: videoPlayController, aspectRatio: 16 / 9, 
        autoPlay: true, looping: false);
    playerWidget = Chewie(
        controller: chewieController,
    );
}

not work

atjosue commented 4 years ago

Have you been able to solve this problem?

ericpenghan commented 4 years ago

I have the same problem please help

liuswong commented 4 years ago

I have the same problem please help, ui will report an error, If instead of using videoPlayController.dispose (), use chewieController.dispose () Memory overflow

zhangshexin commented 4 years ago

you can like that: videoPlayController.pause(); not use videoPlayController.dispose();

jinyus commented 3 years ago

I solved this issue by using a list of VideoPlayerControllers instead. This will allow you to safely dispose the current controller and use a new instance when changing the url.This snippet should work:

List<VideoPlayerController> vControllers = [];
List<ChewieController> cControllers = [];

initState(){
    var videoPlayController = VideoPlayerController.network('https://www.google.com/a.m3u8');
    var chewieController = ChewieController(videoPlayerController: videoPlayController);
    vControllers.add(videoPlayController);
    cControllers.add(chewieController);
    playerWidget = Chewie(
        controller: chewieController,
    );
    super.initState();
}
void _changeVideo(url){
  vControllers?.first?.dispose();
  cControllers?.first?.dispose();
  vControllers?.removeAt(0);
  cControllers?.removeAt(0);
  var videoPlayController=VideoPlayerController.network(url);
  var chewieController = ChewieController(videoPlayerController: videoPlayController);
  vControllers.add(videoPlayController);
  cControllers.add(chewieController);
  playerWidget = Chewie(
        controller: chewieController,
    );
}
Arrooy commented 3 years ago

Hi guys, the problem can be solved with this answer: Stack Overflow