view.dart 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import 'package:fis_measure/index.dart';
  2. import 'package:fis_measure/interfaces/process/player/play_controller.dart';
  3. import 'package:fis_vid/data_host/data_host.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:get/get.dart';
  6. import 'package:vid_player_demo/controller/player_controller.dart';
  7. import 'package:vid_player_demo/widgets/image_cache.dart';
  8. import 'widgets/scene_player.dart';
  9. class ScenePlayerView extends StatefulWidget {
  10. const ScenePlayerView(
  11. this.vidURL, {
  12. Key? key,
  13. this.viewSize = const Size(600, 500),
  14. }) : super(key: key);
  15. final String vidURL;
  16. final Size viewSize;
  17. @override
  18. _ScenePlayerViewState createState() => _ScenePlayerViewState();
  19. }
  20. class _ScenePlayerViewState extends State<ScenePlayerView> {
  21. IPlayerController? _playerController;
  22. IPlayerController get playerController => _playerController!;
  23. VidDataHost? _vidDataHost;
  24. VidDataHost get dataHost => _vidDataHost!;
  25. bool _ifInit = false;
  26. /// 外部播放状态控制器
  27. PlayerStateController? _playerStateController;
  28. PlayerStateController get playerStateController => _playerStateController!;
  29. void loadVidDataHost(String url) {
  30. print("${DateTime.now()} Load vid data host");
  31. _vidDataHost = VidDataHost(url);
  32. _playerController = VidPlayerController(dataHost: dataHost);
  33. }
  34. void clickPlay() {
  35. print("${DateTime.now()} Click play");
  36. if (_ifInit) {
  37. playerController.play();
  38. } else {
  39. dataHost.load().then((value) {
  40. if (value == null) {
  41. // TOOO: add log
  42. } else {
  43. playerController.setLoadState(true);
  44. Future.delayed(const Duration(milliseconds: 100), () {
  45. playerController.play();
  46. });
  47. print("${DateTime.now()} Load vid data host success");
  48. }
  49. _ifInit = true;
  50. });
  51. }
  52. }
  53. void clickPause() {
  54. print("${DateTime.now()} Click pause");
  55. playerController.pause();
  56. }
  57. void onClickPlay(Object sender, dynamic e) {
  58. print("${DateTime.now()} receive Play $e");
  59. clickPlay();
  60. }
  61. @override
  62. void initState() {
  63. super.initState();
  64. loadVidDataHost(widget.vidURL);
  65. _playerStateController = Get.find<PlayerStateController>();
  66. playerStateController.trigglePlay.addListener(onClickPlay);
  67. }
  68. @override
  69. Widget build(BuildContext context) {
  70. return Center(
  71. child: Column(
  72. mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  73. children: [
  74. SizedBox(
  75. width: widget.viewSize.width,
  76. height: widget.viewSize.height,
  77. child: RepaintBoundary(
  78. child: VidScenePlayer(
  79. _playerController as VidPlayerController,
  80. ),
  81. ),
  82. ),
  83. const Text('基于 Scene 的播放器'),
  84. Row(
  85. mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  86. children: [
  87. ElevatedButton(
  88. onPressed: () {
  89. clickPlay();
  90. },
  91. child: const Text('▶ Play')),
  92. ElevatedButton(
  93. onPressed: () {
  94. clickPause();
  95. },
  96. child: const Text('⏸ Pause')),
  97. ],
  98. ),
  99. ],
  100. ),
  101. );
  102. }
  103. @override
  104. void dispose() {
  105. print("ScenePlayerView dispose");
  106. playerController.dispose();
  107. dataHost.release();
  108. playerStateController.trigglePlay.removeListener(onClickPlay);
  109. super.dispose();
  110. }
  111. }