|
@@ -1,18 +1,21 @@
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/material.dart';
|
|
|
import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
|
|
import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
|
|
|
|
|
|
|
|
|
|
+/// Construct a Widget based on the current status.
|
|
|
typedef Widget StatusWidgetBuilder(
|
|
typedef Widget StatusWidgetBuilder(
|
|
|
|
|
+ BuildContext context,
|
|
|
IjkMediaController controller,
|
|
IjkMediaController controller,
|
|
|
IjkStatus status,
|
|
IjkStatus status,
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
-class IjkStateWidget extends StatelessWidget {
|
|
|
|
|
|
|
+/// Default IjkStatusWidget
|
|
|
|
|
+class IjkStatusWidget extends StatelessWidget {
|
|
|
final IjkMediaController controller;
|
|
final IjkMediaController controller;
|
|
|
final StatusWidgetBuilder statusWidgetBuilder;
|
|
final StatusWidgetBuilder statusWidgetBuilder;
|
|
|
|
|
|
|
|
- const IjkStateWidget({
|
|
|
|
|
|
|
+ const IjkStatusWidget({
|
|
|
this.controller,
|
|
this.controller,
|
|
|
- this.statusWidgetBuilder = IjkStateWidget.buildStatusWidget,
|
|
|
|
|
|
|
+ this.statusWidgetBuilder = IjkStatusWidget.buildStatusWidget,
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
@override
|
|
@override
|
|
@@ -21,69 +24,66 @@ class IjkStateWidget extends StatelessWidget {
|
|
|
initialData: controller.ijkStatus,
|
|
initialData: controller.ijkStatus,
|
|
|
stream: controller.ijkStatusStream,
|
|
stream: controller.ijkStatusStream,
|
|
|
builder: (BuildContext context, snapshot) {
|
|
builder: (BuildContext context, snapshot) {
|
|
|
- return buildStatusWidget(controller, snapshot.data);
|
|
|
|
|
|
|
+ return buildStatusWidget(context, controller, snapshot.data);
|
|
|
},
|
|
},
|
|
|
);
|
|
);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static Widget defaultBuildStateWidget(IjkMediaController controller) {
|
|
static Widget defaultBuildStateWidget(IjkMediaController controller) {
|
|
|
- return IjkStateWidget(
|
|
|
|
|
|
|
+ return IjkStatusWidget(
|
|
|
controller: controller,
|
|
controller: controller,
|
|
|
);
|
|
);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static Widget buildStatusWidget(
|
|
static Widget buildStatusWidget(
|
|
|
|
|
+ BuildContext context,
|
|
|
IjkMediaController controller,
|
|
IjkMediaController controller,
|
|
|
IjkStatus status,
|
|
IjkStatus status,
|
|
|
) {
|
|
) {
|
|
|
|
|
+ if (status == IjkStatus.preparing || status == IjkStatus.noDataSource) {
|
|
|
|
|
+ return _buildProgressWidget(context);
|
|
|
|
|
+ }
|
|
|
if (status == IjkStatus.pause) {
|
|
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) {
|
|
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();
|
|
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),
|
|
|
|
|
+ ),
|
|
|
|
|
+ ),
|
|
|
|
|
+ );
|
|
|
}
|
|
}
|