player.dart 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import 'dart:typed_data';
  2. import 'package:fis_vid/data_host/data_host.dart';
  3. import 'package:fis_measure/view/frame_view/native/frame_view.dart';
  4. import 'package:flutter/foundation.dart';
  5. import 'package:flutter/material.dart';
  6. import 'controller.dart';
  7. import 'enums.dart';
  8. import 'events.dart';
  9. class VidPlayer extends StatefulWidget {
  10. const VidPlayer(
  11. this.controller, {
  12. Key? key,
  13. this.width,
  14. this.height,
  15. }) : super(key: key);
  16. final VidPlayerController controller;
  17. final double? width;
  18. final double? height;
  19. @override
  20. State<StatefulWidget> createState() => _VidPlayerState();
  21. }
  22. class _VidPlayerState extends State<VidPlayer> {
  23. Uint8List? frameBytes;
  24. @override
  25. void initState() {
  26. widget.controller.eventHandler.addListener(onControllerEvent);
  27. super.initState();
  28. }
  29. @override
  30. void didUpdateWidget(covariant VidPlayer oldWidget) {
  31. if (oldWidget.controller != widget.controller) {
  32. throw UnsupportedError("[VidTestPlayer] unsupport replace controller.");
  33. }
  34. super.didUpdateWidget(oldWidget);
  35. }
  36. void onControllerEvent(Object sender, VidPlayerEvent e) {
  37. if (e is VidPlayerStatusChangeEvent) {
  38. if (!widget.controller.hasView) {
  39. setState(() {});
  40. }
  41. }
  42. if (e is VidPlayerFrameIndexChangeEvent) {
  43. onFrameChanged(e);
  44. }
  45. if (e is VidPlayerBrightnessChangeEvent) {
  46. updateFrame();
  47. }
  48. if (e is VidPlayerContrastChangeEvent) {
  49. updateFrame();
  50. }
  51. }
  52. void onFrameChanged(VidPlayerFrameIndexChangeEvent e) {
  53. setState(() {
  54. frameBytes = e.bytes;
  55. });
  56. }
  57. void updateFrame() {
  58. setState(() {});
  59. }
  60. @override
  61. Widget build(BuildContext context) {
  62. Widget? child;
  63. switch (widget.controller.status) {
  64. case VidPlayStatus.init:
  65. child = Container(child: const Text("Loading"));
  66. break;
  67. case VidPlayStatus.ready:
  68. child = Container(child: const Text("Ready"));
  69. break;
  70. case VidPlayStatus.loadFail:
  71. child = Container(child: const Text("Load fail"));
  72. break;
  73. case VidPlayStatus.play:
  74. case VidPlayStatus.pause:
  75. // return buildFrameView(context);
  76. // child = Container(
  77. // child: Text(
  78. // widget.controller.currentFrameIndex.toString(),
  79. // ),
  80. // );
  81. child = buildFrameView(context);
  82. break;
  83. case VidPlayStatus.stop:
  84. case VidPlayStatus.dispose:
  85. child = Container(child: const Text("Closed"));
  86. break;
  87. }
  88. return buildBox(context, child);
  89. }
  90. Widget buildBox(BuildContext context, Widget child) {
  91. return Container(
  92. alignment: Alignment.center,
  93. child: child,
  94. );
  95. }
  96. Widget buildFrameView(BuildContext context) {
  97. if (frameBytes != null) {
  98. final size = MediaQuery.of(context).size;
  99. return VidFrameView(
  100. frameBytes!,
  101. // width: widget.width,
  102. // height: widget.height,
  103. width: size.width,
  104. height: size.height,
  105. );
  106. } else {
  107. return Container();
  108. }
  109. }
  110. @override
  111. void dispose() {
  112. widget.controller.eventHandler.removeListener(onControllerEvent);
  113. super.dispose();
  114. }
  115. }