Search code examples
flutterflutter-dependencies

Flutter Chewie Video Player - check when playback is complete


I'm using the Chewie Video player in my Flutter app. How to check when playback has completed, so that I can close the screen and dispose?


Solution

  • You can copy paste run full code below
    You can check position and duration
    full code is official example set loop to false and add the following code snippet

    code snippet

    _videoPlayerController1.addListener(() {
          if (_videoPlayerController1.value.position ==
              _videoPlayerController1.value.duration) {
            print('video Ended');
          }
        });
    

    Output

    I/flutter ( 4881): video Ended
    

    enter image description here

    full code

    import 'package:chewie/chewie.dart';
    import 'package:chewie/src/chewie_player.dart';
    import 'package:flutter/cupertino.dart';
    import 'package:flutter/material.dart';
    import 'package:video_player/video_player.dart';
    
    void main() {
      runApp(
        ChewieDemo(),
      );
    }
    
    class ChewieDemo extends StatefulWidget {
      ChewieDemo({this.title = 'Chewie Demo'});
    
      final String title;
    
      @override
      State<StatefulWidget> createState() {
        return _ChewieDemoState();
      }
    }
    
    class _ChewieDemoState extends State<ChewieDemo> {
      TargetPlatform _platform;
      VideoPlayerController _videoPlayerController1;
      VideoPlayerController _videoPlayerController2;
      ChewieController _chewieController;
    
      @override
      void initState() {
        super.initState();
        _videoPlayerController1 = VideoPlayerController.network(
            'https://flutter.github.io/assets-for-api-docs/assets/videos/butterfly.mp4');
        _videoPlayerController2 = VideoPlayerController.network(
            'https://www.sample-videos.com/video123/mp4/480/asdasdas.mp4');
        _chewieController = ChewieController(
          videoPlayerController: _videoPlayerController1,
          aspectRatio: 3 / 2,
          autoPlay: true,
          looping: false,
          // Try playing around with some of these other options:
    
          // showControls: false,
          // materialProgressColors: ChewieProgressColors(
          //   playedColor: Colors.red,
          //   handleColor: Colors.blue,
          //   backgroundColor: Colors.grey,
          //   bufferedColor: Colors.lightGreen,
          // ),
          // placeholder: Container(
          //   color: Colors.grey,
          // ),
          // autoInitialize: true,
        );
    
        _videoPlayerController1.addListener(() {
          if (_videoPlayerController1.value.position ==
              _videoPlayerController1.value.duration) {
            print('video Ended');
          }
        });
      }
    
      @override
      void dispose() {
        _videoPlayerController1.dispose();
        _videoPlayerController2.dispose();
        _chewieController.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: widget.title,
          theme: ThemeData.light().copyWith(
            platform: _platform ?? Theme.of(context).platform,
          ),
          home: Scaffold(
            appBar: AppBar(
              title: Text(widget.title),
            ),
            body: Column(
              children: <Widget>[
                Expanded(
                  child: Center(
                    child: Chewie(
                      controller: _chewieController,
                    ),
                  ),
                ),
                FlatButton(
                  onPressed: () {
                    _chewieController.enterFullScreen();
                  },
                  child: Text('Fullscreen'),
                ),
                Row(
                  children: <Widget>[
                    Expanded(
                      child: FlatButton(
                        onPressed: () {
                          setState(() {
                            _chewieController.dispose();
                            _videoPlayerController2.pause();
                            _videoPlayerController2.seekTo(Duration(seconds: 0));
                            _chewieController = ChewieController(
                              videoPlayerController: _videoPlayerController1,
                              aspectRatio: 3 / 2,
                              autoPlay: true,
                              looping: true,
                            );
                          });
                        },
                        child: Padding(
                          child: Text("Video 1"),
                          padding: EdgeInsets.symmetric(vertical: 16.0),
                        ),
                      ),
                    ),
                    Expanded(
                      child: FlatButton(
                        onPressed: () {
                          setState(() {
                            _chewieController.dispose();
                            _videoPlayerController1.pause();
                            _videoPlayerController1.seekTo(Duration(seconds: 0));
                            _chewieController = ChewieController(
                              videoPlayerController: _videoPlayerController2,
                              aspectRatio: 3 / 2,
                              autoPlay: true,
                              looping: true,
                            );
                          });
                        },
                        child: Padding(
                          padding: EdgeInsets.symmetric(vertical: 16.0),
                          child: Text("Error Video"),
                        ),
                      ),
                    )
                  ],
                ),
                Row(
                  children: <Widget>[
                    Expanded(
                      child: FlatButton(
                        onPressed: () {
                          setState(() {
                            _platform = TargetPlatform.android;
                          });
                        },
                        child: Padding(
                          child: Text("Android controls"),
                          padding: EdgeInsets.symmetric(vertical: 16.0),
                        ),
                      ),
                    ),
                    Expanded(
                      child: FlatButton(
                        onPressed: () {
                          setState(() {
                            _platform = TargetPlatform.iOS;
                          });
                        },
                        child: Padding(
                          padding: EdgeInsets.symmetric(vertical: 16.0),
                          child: Text("iOS controls"),
                        ),
                      ),
                    )
                  ],
                )
              ],
            ),
          ),
        );
      }
    }