Caijinglong 6 éve
szülő
commit
cde3a6d744

+ 4 - 2
lib/flutter_ijkplayer.dart

@@ -1,6 +1,8 @@
 export 'src/error.dart';
 export 'src/ijkplayer.dart';
-export 'package:flutter_ijkplayer/src/entity/video_info.dart';
+export 'src/entity/video_info.dart';
 export 'src/widget/controller_widget_builder.dart'
     show DefaultIJKControllerWidget, VolumeType;
-export 'package:flutter_ijkplayer/src/helper/config.dart';
+export 'src/helper/config.dart';
+export 'src/widget/state_builder.dart'
+    show IjkStatusWidget, StatusWidgetBuilder;

+ 15 - 1
lib/src/controller.dart → lib/src/controller/controller.dart

@@ -1,4 +1,4 @@
-part of './ijkplayer.dart';
+part of '../ijkplayer.dart';
 
 /// Media Controller
 class IjkMediaController with IjkMediaControllerMixin {
@@ -146,6 +146,7 @@ class IjkMediaController with IjkMediaControllerMixin {
   /// [reset] and close all controller
   void dispose() async {
     await reset();
+    _ijkStatus = IjkStatus.disposed;
     _playingController?.close();
     _videoInfoController?.close();
     _textureIdController?.close();
@@ -171,6 +172,7 @@ class IjkMediaController with IjkMediaControllerMixin {
     _plugin = null;
     eventChannel?.dispose();
     eventChannel = null;
+    _ijkStatus = IjkStatus.noDataSource;
   }
 
   /// set net DataSource
@@ -533,3 +535,15 @@ enum DataSourceType {
   file,
   asset,
 }
+
+/// Current IjkMedia status
+enum IjkStatus {
+  noDataSource,
+  preparing,
+  loadingDataSourceFail,
+  prepared,
+  pause,
+  playing,
+  complete,
+  disposed,
+}

+ 1 - 1
lib/src/ijk_event_channel.dart → lib/src/controller/ijk_event_channel.dart

@@ -1,4 +1,4 @@
-part of 'ijkplayer.dart';
+part of '../ijkplayer.dart';
 
 class _IJKEventChannel {
   int get textureId => controller?.textureId;

+ 0 - 0
lib/src/ijkplayer_controller_mixin.dart → lib/src/controller/ijkplayer_controller_mixin.dart


+ 8 - 8
lib/src/ijkplayer.dart

@@ -4,18 +4,18 @@ import 'dart:typed_data';
 
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
-import 'package:flutter_ijkplayer/src/ijkplayer_controller_mixin.dart';
-import 'package:flutter_ijkplayer/src/widget/state_builder.dart';
 
+import 'controller/ijkplayer_controller_mixin.dart';
+import 'entity/video_info.dart';
+import 'engine/ijk_controller_manager.dart';
 import 'error.dart';
-import 'package:flutter_ijkplayer/src/helper/logutil.dart';
-import 'package:flutter_ijkplayer/src/entity/video_info.dart';
+import 'helper/logutil.dart';
 import 'widget/controller_widget_builder.dart';
 import 'widget/ijkplayer_builder.dart';
-import 'engine/ijk_controller_manager.dart';
+import 'widget/state_builder.dart';
 
-part 'controller.dart';
-part 'ijk_event_channel.dart';
+part 'controller/controller.dart';
+part 'controller/ijk_event_channel.dart';
 part 'engine/manager.dart';
 
 typedef Widget IjkStateWidgetBuilder(IjkMediaController controller);
@@ -38,7 +38,7 @@ class IjkPlayer extends StatefulWidget {
     @required this.mediaController,
     this.controllerWidgetBuilder = defaultBuildIjkControllerWidget,
     this.textureBuilder = buildDefaultIjkPlayer,
-    this.stateWidgetBuilder = IjkStateWidget.defaultBuildStateWidget,
+    this.stateWidgetBuilder = IjkStatusWidget.defaultBuildStateWidget,
   }) : super(key: key);
 
   @override

+ 47 - 47
lib/src/widget/state_builder.dart

@@ -1,18 +1,21 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
 
+/// Construct a Widget based on the current status.
 typedef Widget StatusWidgetBuilder(
+  BuildContext context,
   IjkMediaController controller,
   IjkStatus status,
 );
 
-class IjkStateWidget extends StatelessWidget {
+/// Default IjkStatusWidget
+class IjkStatusWidget extends StatelessWidget {
   final IjkMediaController controller;
   final StatusWidgetBuilder statusWidgetBuilder;
 
-  const IjkStateWidget({
+  const IjkStatusWidget({
     this.controller,
-    this.statusWidgetBuilder = IjkStateWidget.buildStatusWidget,
+    this.statusWidgetBuilder = IjkStatusWidget.buildStatusWidget,
   });
 
   @override
@@ -21,69 +24,66 @@ class IjkStateWidget extends StatelessWidget {
       initialData: controller.ijkStatus,
       stream: controller.ijkStatusStream,
       builder: (BuildContext context, snapshot) {
-        return buildStatusWidget(controller, snapshot.data);
+        return buildStatusWidget(context, controller, snapshot.data);
       },
     );
   }
 
   static Widget defaultBuildStateWidget(IjkMediaController controller) {
-    return IjkStateWidget(
+    return IjkStatusWidget(
       controller: controller,
     );
   }
 
   static Widget buildStatusWidget(
+    BuildContext context,
     IjkMediaController controller,
     IjkStatus status,
   ) {
+    if (status == IjkStatus.preparing || status == IjkStatus.noDataSource) {
+      return _buildProgressWidget(context);
+    }
     if (status == IjkStatus.pause) {
-      return Center(
-        child: Container(
-          width: 50,
-          height: 50,
-          decoration: BoxDecoration(
-            color: Colors.white,
-            borderRadius: BorderRadius.circular(30),
-          ),
-          child: IconButton(
-            iconSize: 30,
-            color: Colors.black,
-            icon: Icon(Icons.play_arrow),
-            onPressed: () => controller.play(),
-          ),
-        ),
-      );
+      return _buildCenterIconButton(Icons.play_arrow, controller.play);
     }
     if (status == IjkStatus.complete) {
-      return Center(
-        child: Container(
-          width: 50,
-          height: 50,
-          decoration: BoxDecoration(
-            color: Colors.white,
-            borderRadius: BorderRadius.circular(30),
-          ),
-          child: IconButton(
-            iconSize: 30,
-            color: Colors.black,
-            icon: Icon(Icons.replay),
-            onPressed: () async {
-              await controller?.seekTo(0);
-              await controller?.play();
-            },
-          ),
-        ),
-      );
+      return _buildCenterIconButton(Icons.replay, () async {
+        await controller?.seekTo(0);
+        await controller?.play();
+      });
     }
     return Container();
   }
 }
 
-enum IjkStatus {
-  noDataSource,
-  preparing,
-  prepared,
-  pause,
-  playing,
-  complete,
+Widget _buildCenterIconButton(IconData iconData, Function onTap) {
+  return Center(
+    child: Container(
+      width: 50,
+      height: 50,
+      decoration: BoxDecoration(
+        color: Colors.white.withOpacity(0.75),
+        borderRadius: BorderRadius.circular(30),
+      ),
+      child: IconButton(
+        iconSize: 30,
+        color: Colors.black,
+        icon: Icon(iconData),
+        onPressed: onTap,
+      ),
+    ),
+  );
+}
+
+Widget _buildProgressWidget(BuildContext context) {
+  return Center(
+    child: Container(
+      width: 60,
+      height: 60,
+      child: RefreshProgressIndicator(
+        backgroundColor: Colors.transparent,
+        valueColor: AlwaysStoppedAnimation(Colors.white),
+      ),
+    ),
+  );
 }