|
@@ -2,14 +2,21 @@ import 'package:fis_measure/index.dart';
|
|
|
import 'package:fis_measure/interfaces/process/player/play_controller.dart';
|
|
|
import 'package:fis_vid/data_host/data_host.dart';
|
|
|
import 'package:flutter/material.dart';
|
|
|
-import 'package:vid_player_demo/notification/player_notification.dart';
|
|
|
+import 'package:get/get.dart';
|
|
|
+import 'package:vid_player_demo/controller/player_controller.dart';
|
|
|
import 'package:vid_player_demo/widgets/image_cache.dart';
|
|
|
|
|
|
import 'widgets/canvas_player.dart';
|
|
|
|
|
|
class CanvasPlayerView extends StatefulWidget {
|
|
|
- const CanvasPlayerView(this.vidURL, {Key? key}) : super(key: key);
|
|
|
+ const CanvasPlayerView(
|
|
|
+ this.vidURL, {
|
|
|
+ Key? key,
|
|
|
+ this.viewSize = const Size(600, 500),
|
|
|
+ }) : super(key: key);
|
|
|
final String vidURL;
|
|
|
+ final Size viewSize;
|
|
|
+
|
|
|
@override
|
|
|
_CanvasPlayerViewState createState() => _CanvasPlayerViewState();
|
|
|
}
|
|
@@ -20,6 +27,10 @@ class _CanvasPlayerViewState extends State<CanvasPlayerView> {
|
|
|
VidDataHost? _vidDataHost;
|
|
|
VidDataHost get dataHost => _vidDataHost!;
|
|
|
bool _ifInit = false;
|
|
|
+
|
|
|
+ /// 外部播放状态控制器
|
|
|
+ PlayerStateController? _playerStateController;
|
|
|
+ PlayerStateController get playerStateController => _playerStateController!;
|
|
|
void loadVidDataHost(String url) {
|
|
|
print("${DateTime.now()} Load vid data host");
|
|
|
_vidDataHost = VidDataHost(url);
|
|
@@ -51,46 +62,53 @@ class _CanvasPlayerViewState extends State<CanvasPlayerView> {
|
|
|
playerController.pause();
|
|
|
}
|
|
|
|
|
|
+ void onClickPlay(Object sender, dynamic e) {
|
|
|
+ print("${DateTime.now()} receive Play $e");
|
|
|
+ clickPlay();
|
|
|
+ }
|
|
|
+
|
|
|
@override
|
|
|
void initState() {
|
|
|
super.initState();
|
|
|
loadVidDataHost(widget.vidURL);
|
|
|
+ _playerStateController = Get.find<PlayerStateController>();
|
|
|
+ playerStateController.trigglePlay.addListener(onClickPlay);
|
|
|
}
|
|
|
|
|
|
@override
|
|
|
Widget build(BuildContext context) {
|
|
|
- return NotificationListener<PlayerNotification>(
|
|
|
- onNotification: ((notification) {
|
|
|
- clickPlay();
|
|
|
- return false;
|
|
|
- }),
|
|
|
- child: Center(
|
|
|
- child: Column(
|
|
|
+ return Center(
|
|
|
+ child: Column(
|
|
|
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
|
+ children: [
|
|
|
+ SizedBox(
|
|
|
+ width: widget.viewSize.width,
|
|
|
+ height: widget.viewSize.height,
|
|
|
+ child: RepaintBoundary(
|
|
|
+ child: VidCanvasPlayer(
|
|
|
+ _playerController as VidPlayerController,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ const Text('基于 Canvas 的播放器'),
|
|
|
+ Row(
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
|
children: [
|
|
|
- const ShowImageCache(),
|
|
|
ElevatedButton(
|
|
|
onPressed: () {
|
|
|
clickPlay();
|
|
|
},
|
|
|
- child: const Text('Play')),
|
|
|
+ child: const Text('▶ Play')),
|
|
|
ElevatedButton(
|
|
|
onPressed: () {
|
|
|
clickPause();
|
|
|
},
|
|
|
- child: const Text('Pause')),
|
|
|
- SizedBox(
|
|
|
- width: 600,
|
|
|
- height: 600,
|
|
|
- child: RepaintBoundary(
|
|
|
- child: VidCanvasPlayer(
|
|
|
- _playerController as VidPlayerController,
|
|
|
- ),
|
|
|
- ),
|
|
|
- ),
|
|
|
+ child: const Text('⏸ Pause')),
|
|
|
],
|
|
|
),
|
|
|
- ));
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ );
|
|
|
}
|
|
|
|
|
|
@override
|
|
@@ -98,6 +116,7 @@ class _CanvasPlayerViewState extends State<CanvasPlayerView> {
|
|
|
print("CanvasPlayerView dispose");
|
|
|
playerController.dispose();
|
|
|
dataHost.release();
|
|
|
+ playerStateController.trigglePlay.removeListener(onClickPlay);
|
|
|
super.dispose();
|
|
|
}
|
|
|
}
|