Просмотр исходного кода

Remove setter for videoPlayerController

Ben Hagen 6 лет назад
Родитель
Сommit
79011c777e
2 измененных файлов с 44 добавлено и 45 удалено
  1. 28 12
      example/lib/main.dart
  2. 16 33
      lib/src/chewie_controller.dart

+ 28 - 12
example/lib/main.dart

@@ -23,17 +23,20 @@ class ChewieDemo extends StatefulWidget {
 
 class _ChewieDemoState extends State<ChewieDemo> {
   TargetPlatform _platform;
-  VideoPlayerController _videoPlayerController;
+  VideoPlayerController _videoPlayerController1;
+  VideoPlayerController _videoPlayerController2;
   ChewieController _chewieController;
 
   @override
   void initState() {
     super.initState();
-    _videoPlayerController = VideoPlayerController.network(
-      'https://flutter.github.io/assets-for-api-docs/assets/videos/butterfly.mp4',
-    );
+    _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/big_buck_bunny_480p_20mb.mp4');
     _chewieController = ChewieController(
-      _videoPlayerController, aspectRatio: 3 / 2,
+      videoPlayerController: _videoPlayerController1,
+      aspectRatio: 3 / 2,
       autoPlay: true,
       looping: true,
       // Try playing around with some of these other options:
@@ -52,6 +55,14 @@ class _ChewieDemoState extends State<ChewieDemo> {
     );
   }
 
+  @override
+  void dispose() {
+    _videoPlayerController1.dispose();
+    _videoPlayerController2.dispose();
+    _chewieController.dispose();
+    super.dispose();
+  }
+
   @override
   Widget build(BuildContext context) {
     return MaterialApp(
@@ -84,9 +95,12 @@ class _ChewieDemoState extends State<ChewieDemo> {
                   child: FlatButton(
                     onPressed: () {
                       setState(() {
-                        _chewieController.videoPlayerController =
-                            VideoPlayerController.network(
-                          'https://flutter.github.io/assets-for-api-docs/assets/videos/butterfly.mp4',
+                        _chewieController.dispose();
+                        _chewieController = ChewieController(
+                          videoPlayerController: _videoPlayerController1,
+                          aspectRatio: 3 / 2,
+                          autoPlay: true,
+                          looping: true,
                         );
                       });
                     },
@@ -100,10 +114,12 @@ class _ChewieDemoState extends State<ChewieDemo> {
                   child: FlatButton(
                     onPressed: () {
                       setState(() {
-                        _chewieController.videoPlayerController =
-                            VideoPlayerController.network(
-                              'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4',
-//                          'https://www.sample-videos.com/video123/mp4/480/big_buck_bunny_480p_20mb.mp4',
+                        _chewieController.dispose();
+                        _chewieController = ChewieController(
+                          videoPlayerController: _videoPlayerController2,
+                          aspectRatio: 3 / 2,
+                          autoPlay: true,
+                          looping: true,
                         );
                       });
                     },

+ 16 - 33
lib/src/chewie_controller.dart

@@ -5,23 +5,18 @@ import 'package:video_player/video_player.dart';
 /// The state of the [ChewieController].
 @immutable
 class ChewieValue {
-  ChewieValue(
-    this.videoPlayerController, {
+  ChewieValue({
     this.isFullScreen = false,
   });
 
   /// True if the video is currently playing fullscreen
   final bool isFullScreen;
 
-  /// The controller for the video you want to play
-  final VideoPlayerController videoPlayerController;
-
   ChewieValue copyWith({
     VideoPlayerController videoPlayerController,
     bool isFullScreen,
   }) {
     return ChewieValue(
-      videoPlayerController ?? this.videoPlayerController,
       isFullScreen: isFullScreen ?? this.isFullScreen,
     );
   }
@@ -29,14 +24,13 @@ class ChewieValue {
   @override
   String toString() {
     return '$runtimeType('
-        'isFullscreen: $isFullScreen, '
-        'videoPlayerController: $videoPlayerController, ';
+        'isFullscreen: $isFullScreen, ';
   }
 }
 
 class ChewieController extends ValueNotifier<ChewieValue> {
-  ChewieController(
-    VideoPlayerController videoPlayerController, {
+  ChewieController({
+    this.videoPlayerController,
     this.aspectRatio,
     this.autoInitialize = false,
     this.autoPlay = false,
@@ -51,10 +45,13 @@ class ChewieController extends ValueNotifier<ChewieValue> {
     this.isLive = false,
   })  : assert(videoPlayerController != null,
             'You must provide a controller to play a video'),
-        super(ChewieValue(videoPlayerController)) {
+        super(ChewieValue()) {
     _initialize();
   }
 
+  /// The controller for the video you want to play
+  final VideoPlayerController videoPlayerController;
+
   /// Initialize the Video on Startup. This will prep the video for playback.
   final bool autoInitialize;
 
@@ -99,14 +96,11 @@ class ChewieController extends ValueNotifier<ChewieValue> {
 
   bool get isFullScreen => value.isFullScreen;
 
-  VideoPlayerController get videoPlayerController =>
-      value.videoPlayerController;
-
   Future _initialize() async {
-    await value.videoPlayerController.setLooping(looping);
+    await videoPlayerController.setLooping(looping);
 
     if (autoInitialize || autoPlay) {
-      await value.videoPlayerController.initialize();
+      await videoPlayerController.initialize();
     }
 
     if (autoPlay) {
@@ -114,16 +108,16 @@ class ChewieController extends ValueNotifier<ChewieValue> {
         enterFullscreen();
       }
 
-      await value.videoPlayerController.play();
+      await videoPlayerController.play();
     }
 
     if (startAt != null) {
-      await value.videoPlayerController.seekTo(startAt);
+      await videoPlayerController.seekTo(startAt);
     }
 
     if (fullScreenByDefault) {
-      value.videoPlayerController.addListener(() async {
-        if (await value.videoPlayerController.value.isPlaying &&
+      videoPlayerController.addListener(() async {
+        if (await videoPlayerController.value.isPlaying &&
             !value.isFullScreen) {
           enterFullscreen();
         }
@@ -144,22 +138,11 @@ class ChewieController extends ValueNotifier<ChewieValue> {
   }
 
   void play() {
-    value.videoPlayerController.play();
+    videoPlayerController.play();
   }
 
   void pause() {
-    value.videoPlayerController.pause();
-  }
-
-  // TODO: Do we really need the ability to change the controller?
-  set videoPlayerController(VideoPlayerController controller) {
-    if (value.videoPlayerController.dataSource != controller.dataSource) {
-      // FIXME: The VideoPlayer widget still tries to access the controller
-      value.videoPlayerController.dispose();
-      value = value.copyWith(videoPlayerController: controller);
-      exitFullscreen();
-      _initialize();
-    }
+    videoPlayerController.pause();
   }
 }