Kaynağa Gözat

add status builder

cjl_macbook 6 yıl önce
ebeveyn
işleme
cc9a5a5d79

+ 6 - 2
lib/src/controller.dart

@@ -113,8 +113,12 @@ class IjkMediaController with IjkMediaControllerMixin {
   IjkStatus get ijkStatus => __ijkStatus;
 
   set _ijkStatus(IjkStatus status) {
-    __ijkStatus = status;
-    _ijkStatusController?.add(status);
+    if (status != __ijkStatus) {
+      __ijkStatus = status;
+      _ijkStatusController?.add(status);
+    } else {
+      __ijkStatus = status;
+    }
   }
 
   /// playFinish

+ 3 - 1
lib/src/ijkplayer.dart

@@ -38,7 +38,7 @@ class IjkPlayer extends StatefulWidget {
     @required this.mediaController,
     this.controllerWidgetBuilder = defaultBuildIjkControllerWidget,
     this.textureBuilder = buildDefaultIjkPlayer,
-    this.stateWidgetBuilder = defaultBuildStateWidget,
+    this.stateWidgetBuilder = IjkStateWidget.defaultBuildStateWidget,
   }) : super(key: key);
 
   @override
@@ -88,10 +88,12 @@ class IjkPlayerState extends State<IjkPlayer> {
       },
     );
     var controllerWidget = widget.controllerWidgetBuilder?.call(controller);
+    var statusWidget = buildIjkStateWidget();
     Widget stack = Stack(
       children: <Widget>[
         IgnorePointer(child: video),
         controllerWidget,
+        statusWidget,
       ],
     );
 //    return stack;

+ 67 - 4
lib/src/widget/state_builder.dart

@@ -1,17 +1,80 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
 
-Widget defaultBuildStateWidget(IjkMediaController controller) {
-  return IjkStateWidget(controller);
-}
+typedef Widget StatusWidgetBuilder(
+  IjkMediaController controller,
+  IjkStatus status,
+);
 
 class IjkStateWidget extends StatelessWidget {
   final IjkMediaController controller;
+  final StatusWidgetBuilder statusWidgetBuilder;
 
-  const IjkStateWidget(this.controller);
+  const IjkStateWidget({
+    this.controller,
+    this.statusWidgetBuilder = IjkStateWidget.buildStatusWidget,
+  });
 
   @override
   Widget build(BuildContext context) {
+    return StreamBuilder<IjkStatus>(
+      initialData: controller.ijkStatus,
+      stream: controller.ijkStatusStream,
+      builder: (BuildContext context, snapshot) {
+        return buildStatusWidget(controller, snapshot.data);
+      },
+    );
+  }
+
+  static Widget defaultBuildStateWidget(IjkMediaController controller) {
+    return IjkStateWidget(
+      controller: controller,
+    );
+  }
+
+  static Widget buildStatusWidget(
+    IjkMediaController controller,
+    IjkStatus status,
+  ) {
+    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(),
+          ),
+        ),
+      );
+    }
+    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 Container();
   }
 }