| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- import 'dart:async';
- import 'package:body_detection/body_detection.dart';
- import 'package:body_detection/models/image_result.dart';
- import 'package:flutter/material.dart';
- class PoseDetector extends StatefulWidget {
- const PoseDetector({Key? key}) : super(key: key);
- @override
- State<PoseDetector> createState() => _PoseDetectorState();
- }
- class _PoseDetectorState extends State<PoseDetector> {
- Image? _cameraImage;
- Size _imageSize = Size.zero;
- late Future<void> _startCamera;
- @override
- initState() {
- super.initState();
- _startCamera = _startCameraStream();
- }
- Future<void> _startCameraStream() async {
- await BodyDetection.startCameraStream(
- onFrameAvailable: _handleCameraImage,
- );
- }
- Future<void> _stopCameraStream() async {
- await BodyDetection.stopCameraStream();
- }
- void _handleCameraImage(ImageResult result) {
- // Ignore callback if navigated out of the page.
- if (!mounted) return;
- // To avoid a memory leak issue.
- // https://github.com/flutter/flutter/issues/60160
- PaintingBinding.instance?.imageCache?.clear();
- PaintingBinding.instance?.imageCache?.clearLiveImages();
- final image = Image.memory(
- result.bytes,
- gaplessPlayback: true,
- fit: BoxFit.contain,
- );
- setState(() {
- _cameraImage = image;
- _imageSize = result.size;
- });
- }
- @override
- void dispose() {
- _stopCameraStream();
- super.dispose();
- }
- @override
- Widget build(BuildContext context) {
- return FutureBuilder<void>(
- future: _startCamera,
- builder: (context, snapshot) {
- if (snapshot.connectionState == ConnectionState.waiting) {
- return const Center(child: CircularProgressIndicator());
- }
- return Center(
- child: CustomPaint(
- size: _imageSize,
- child: _cameraImage,
- ),
- );
- },
- );
- }
- }
|