Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Video player throws error when put in ListView and scrolled past really quickly #21

Closed
nathanfletcher opened this issue Jun 1, 2018 · 10 comments
Labels

Comments

@nathanfletcher
Copy link

When the video is part of a list and you scroll to it very quickly, it throws an error and the interface becomes red.

Code to reproduce:

import 'package:flutter/material.dart';
import 'package:chewie/chewie.dart';
import 'package:video_player/video_player.dart';


class Media extends StatefulWidget {
  @override
  MediaState createState() {
    return new MediaState();
  }
}

class MediaState extends State<Media> {
  VideoPlayerController _controller;


  @override
  void initState() {
    super.initState();
    _controller = new VideoPlayerController.network(
      'https://flutter.github.io/assets-for-api-docs/videos/butterfly.mp4',
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Media"),
        actions: <Widget>[],
      ),
      //TODO: Add a grid view (102)
      body: new ListView(
        children: <Widget>[
          Chewie(
            _controller,
            aspectRatio: 1280 / 720,
            autoPlay: false,
            looping: false,
          ),
          new Column(
            children: List.generate(20, (index) {
              return feedCard();
            }),
          ),
        ],
      ),
    );
  }

  Widget feedCard() {
    return new Card(
      child: new Column(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          ListTile(
            leading: Icon(Icons.ondemand_video),
            title: Text('The Enchanted Nightingale',
                style: TextStyle(fontWeight: FontWeight.bold)),
            subtitle: Column(
              children: <Widget>[
                Text('Video by Julie Gable. Lyrics by Sidney Stein.'),
                Align(
                  alignment: Alignment.bottomLeft,
                  child: Text('Sunday 5th July, 2020',
                      style: TextStyle(fontStyle: FontStyle.italic)),
                ),
              ],
            ),
          ),
          new ButtonTheme.bar(
            // make buttons use the appropriate styles for cards
            child: new ButtonBar(
              children: <Widget>[
                new FlatButton(
                  child: const Text('Download'),
                  onPressed: () {/* ... */},
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

I/flutter ( 6193): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter ( 6193): The following assertion was thrown building Chewie(state: _ChewiePlayerState#17748):
I/flutter ( 6193): A VideoPlayerController was used after being disposed.
I/flutter ( 6193): Once you have called dispose() on a VideoPlayerController, it can no longer be used.
I/flutter ( 6193): When the exception was thrown, this was the stack:
I/flutter ( 6193): #0      ChangeNotifier._debugAssertNotDisposed.<anonymous closure> (package:flutter/src/foundation/change_notifier.dart:61:9)
I/flutter ( 6193): #1      ChangeNotifier._debugAssertNotDisposed (package:flutter/src/foundation/change_notifier.dart:67:6)
I/flutter ( 6193): #2      ChangeNotifier.addListener (package:flutter/src/foundation/change_notifier.dart:97:12)
I/flutter ( 6193): #3      _VideoPlayerWithControlsState.initState (package:chewie/src/player_with_controls.dart:114:23)
I/flutter ( 6193): #4      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3751:58)
I/flutter ( 6193): #5      ComponentElement.mount (package:flutter/src/widgets/framework.dart:3617:5)
I/flutter ( 6193): #6      Element.inflateWidget (package:flutter/src/widgets/framework.dart:2907:14)
I/flutter ( 6193): #7      Element.updateChild (package:flutter/src/widgets/framework.dart:2710:12)
I/flutter ( 6193): #8      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3653:16)
I/flutter ( 6193): #9      Element.rebuild (package:flutter/src/widgets/framework.dart:3495:5)
I/flutter ( 6193): #10     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3622:5)
I/flutter ( 6193): #11     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3769:11)
I/flutter ( 6193): #12     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3617:5)
I/flutter ( 6193): #13     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2907:14)
I/flutter ( 6193): #14     Element.updateChild (package:flutter/src/widgets/framework.dart:2710:12)
I/flutter ( 6193): #15     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4654:14)
I/flutter ( 6193): #16     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2907:14)
I/flutter ( 6193): #17     Element.updateChild (package:flutter/src/widgets/framework.dart:2710:12)
I/flutter ( 6193): #18     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3653:16)
I/flutter ( 6193): #19     Element.rebuild (package:flutter/src/widgets/framework.dart:3495:5)
I/flutter ( 6193): #20     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3622:5)
I/flutter ( 6193): #21     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3617:5)
I/flutter ( 6193): #22     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2907:14)
I/flutter ( 6193): #23     Element.updateChild (package:flutter/src/widgets/framework.dart:2710:12)
I/flutter ( 6193): #24     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3653:16)
I/flutter ( 6193): #25     Element.rebuild (package:flutter/src/widgets/framework.dart:3495:5)
I/flutter ( 6193): #26     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3622:5)
I/flutter ( 6193): #27     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3617:5)
I/flutter ( 6193): #28     ParentDataElement.mount (package:flutter/src/widgets/framework.dart:3955:11)
I/flutter ( 6193): #29     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2907:14)
I/flutter ( 6193): #30     Element.updateChild (package:flutter/src/widgets/framework.dart:2710:12)
I/flutter ( 6193): #31     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3653:16)
I/flutter ( 6193): #32     Element.rebuild (package:flutter/src/widgets/framework.dart:3495:5)
I/flutter ( 6193): #33     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3622:5)
I/flutter ( 6193): #34     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3769:11)
I/flutter ( 6193): #35     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3617:5)
I/flutter ( 6193): #36     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2907:14)
I/flutter ( 6193): #37     Element.updateChild (package:flutter/src/widgets/framework.dart:2710:12)
I/flutter ( 6193): #38     SliverMultiBoxAdaptorElement.updateChild (package:flutter/src/widgets/sliver.dart:744:36)
I/flutter ( 6193): #39     SliverMultiBoxAdaptorElement.createChild.<anonymous closure> (package:flutter/src/widgets/sliver.dart:729:20)
I/flutter ( 6193): #40     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2222:19)
I/flutter ( 6193): #41     SliverMultiBoxAdaptorElement.createChild (package:flutter/src/widgets/sliver.dart:722:11)
I/flutter ( 6193): #42     RenderSliverMultiBoxAdaptor._createOrObtainChild.<anonymous closure> (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:254:23)
I/flutter ( 6193): #43     RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1666:58)
I/flutter ( 6193): #44     PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:740:15)
I/flutter ( 6193): #45     RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1666:13)
I/flutter ( 6193): #46     RenderSliverMultiBoxAdaptor._createOrObtainChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:243:5)
I/flutter ( 6193): #47     RenderSliverMultiBoxAdaptor.insertAndLayoutLeadingChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:352:5)
I/flutter ( 6193): #48     RenderSliverList.performLayout (package:flutter/src/rendering/sliver_list.dart:99:29)
I/flutter ( 6193): #49     RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7)
I/flutter ( 6193): #50     RenderSliverPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:182:11)
I/flutter ( 6193): #51     RenderObject.layout (package:flutter/src/rendering/object.dart:1570:7)
I/flutter ( 6193): #52     RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:336:13)
I/flutter ( 6193): #53     RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1131:12)
I/flutter ( 6193): #54     RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1049:20)
I/flutter ( 6193): #55     RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1445:7)
I/flutter ( 6193): #56     PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:709:18)
I/flutter ( 6193): #57     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:270:19)
I/flutter ( 6193): #58     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:627:13)
I/flutter ( 6193): #59     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:208:5)
I/flutter ( 6193): #60     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:990:15)
I/flutter ( 6193): #61     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:930:9)
I/flutter ( 6193): #62     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:842:5)
I/flutter ( 6193): #63     _invoke (dart:ui/hooks.dart:120:13)
I/flutter ( 6193): #64     _drawFrame (dart:ui/hooks.dart:109:3)
@brianegan
Copy link
Collaborator

Thanks! This is a bit of a tricky one, but I think I know where the bug is. I'll try to push up a fix for it over the weekend :)

@fukemy
Copy link

fukemy commented Jun 7, 2018

Yeah i just face this problem. Used chewie with hero animation then got same problem here. Plz take a look for my problem.

body: new ListView(
        children: <Widget>[
          new Padding(padding: new EdgeInsets.only(top: 1.0)),
          new Hero(
              tag: 'hero1',
              child: new Container(
                child: new Chewie(
                  _videoController,
                  aspectRatio: 16/9,
                  autoPlay: false,
                  autoInitialize: false,
                  showControls: true,
                ),
              )
          )
        ],
      ),
A VideoPlayerController was used after being disposed.
I/flutter ( 6474): Once you have called dispose() on a VideoPlayerController, it can no longer be used.

Thanks you

@fukemy
Copy link

fukemy commented Jun 7, 2018

Hi. I changed code to

new Hero(
            tag: 'hero$heroId',
            child: new Material(
              child: new AspectRatio(
                aspectRatio: 16 / 9,
                child: new VideoPlayer(_videoController),
              )
            ),
          )

then no problem. Only red screen when using chewie. Plz fix that

@marianoarga
Copy link

marianoarga commented Sep 4, 2018

@brianegan could this ve related to "didUpdateWidget" disposing the controller? (the hero issue)
https://github.com/brianegan/chewie/blob/master/lib/src/chewie_player.dart#L147

@cbenhagen cbenhagen added the bug label Sep 6, 2018
@cbenhagen
Copy link
Collaborator

cbenhagen commented Jan 20, 2019

Can't reproduce this issue in Chewie 0.9.0. If the issue should persist after updating to 0.9.0, please comment and I will reopen the issue.

@SameerDonga
Copy link

SameerDonga commented Jun 21, 2019

Hello,

I have tried to implement this inside my Listview widget and I have tried version 0.9.0 as well in 0.9.4 but I got the same issue(Black screen). In my code I just initialize video and i don't want to play it but on click of that I am opening another view and inside that, I play the video.

This is a snippet of my code:

VideoPlayerController _videoPlayerController = VideoPlayerController.network(mediaModel.path); final _chewieController = ChewieController( videoPlayerController: _videoPlayerController, autoPlay: false, looping: false, aspectRatio: 1, showControls: false, autoInitialize: true, overlay: Center( child: InkWell( onTap: () { goToMediaFullScreen(context, mediaModel); }, child: Icon( Icons.play_circle_outline, color: Colors.grey, size: 50, ), ), ));
mediaChildWidget.add(Chewie( controller: _chewieController, ));

Please help.

@klaszlo8207
Copy link

Any new on this? I get a lot of

"Another exception was thrown: A ChewieController was used after being disposed."

when I try to play a video from a gridview click...

@AriCohen8
Copy link

I am having this issue using version ^0.9.8+1. Can this be reopened?

void initState() {
super.initState();
_chewieController = ChewieController(
videoPlayerController: widget.videoPlayerController,
aspectRatio: 3/4,
autoInitialize: true,
looping: widget.looping,
errorBuilder: (context, errorMessage) {
return Center(
child: Text(
errorMessage,
style: TextStyle(color: Colors.white),
),
);
},
);
}

@AriCohen8
Copy link

This link solved my issue - I needed to move a super.dispose() line to after the chewie.dispose() in my override void dispose area.
#170

@GelidGeorge
Copy link

GelidGeorge commented May 15, 2022

I set the auto dispose parameter to false and dispose it when ever I am off the page... Use same video player controller and update the datasource with setDataSource... set autoplay to false and Add a listener to player controller with BetterPlayerEvents I manage Auto Play and things... One thing that bug me now is If I play video some times video doesn't initialize and throws a playback error only on iOS... And suggestion how to fix this...
Unhandled Exception: PlatformException(VideoError, Failed to load video: Cannot Complete Action, null, null)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

9 participants