pose_detector.dart 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import 'dart:async';
  2. import 'package:body_detection/body_detection.dart';
  3. import 'package:body_detection/models/image_result.dart';
  4. import 'package:flutter/material.dart';
  5. class PoseDetector extends StatefulWidget {
  6. const PoseDetector({Key? key}) : super(key: key);
  7. @override
  8. State<PoseDetector> createState() => _PoseDetectorState();
  9. }
  10. class _PoseDetectorState extends State<PoseDetector> {
  11. Image? _cameraImage;
  12. Size _imageSize = Size.zero;
  13. late Future<void> _startCamera;
  14. @override
  15. initState() {
  16. super.initState();
  17. _startCamera = _startCameraStream();
  18. }
  19. Future<void> _startCameraStream() async {
  20. await BodyDetection.startCameraStream(
  21. onFrameAvailable: _handleCameraImage,
  22. );
  23. }
  24. Future<void> _stopCameraStream() async {
  25. await BodyDetection.stopCameraStream();
  26. }
  27. void _handleCameraImage(ImageResult result) {
  28. // Ignore callback if navigated out of the page.
  29. if (!mounted) return;
  30. // To avoid a memory leak issue.
  31. // https://github.com/flutter/flutter/issues/60160
  32. PaintingBinding.instance?.imageCache?.clear();
  33. PaintingBinding.instance?.imageCache?.clearLiveImages();
  34. final image = Image.memory(
  35. result.bytes,
  36. gaplessPlayback: true,
  37. fit: BoxFit.contain,
  38. );
  39. setState(() {
  40. _cameraImage = image;
  41. _imageSize = result.size;
  42. });
  43. }
  44. @override
  45. void dispose() {
  46. _stopCameraStream();
  47. super.dispose();
  48. }
  49. @override
  50. Widget build(BuildContext context) {
  51. return FutureBuilder<void>(
  52. future: _startCamera,
  53. builder: (context, snapshot) {
  54. if (snapshot.connectionState == ConnectionState.waiting) {
  55. return const Center(child: CircularProgressIndicator());
  56. }
  57. return Center(
  58. child: CustomPaint(
  59. size: _imageSize,
  60. child: _cameraImage,
  61. ),
  62. );
  63. },
  64. );
  65. }
  66. }