فهرست منبع

feat: display camera images

Léo Salé 3 سال پیش
والد
کامیت
8bfa2796aa

+ 2 - 1
app/lib/exercises/exercises_validation/exercise_validation_page.dart

@@ -1,5 +1,6 @@
 import 'package:flutter/material.dart';
 import 'package:physigo/exercises/exercises_validation/utils/permissions_utils.dart';
+import 'package:physigo/exercises/exercises_validation/widgets/pose_detector.dart';
 
 class ExerciseValidationPage extends StatelessWidget {
   const ExerciseValidationPage({Key? key}) : super(key: key);
@@ -16,7 +17,7 @@ class ExerciseValidationPage extends StatelessWidget {
           if (snapshot.hasError) {
             return Center(child: Text(snapshot.error.toString()));
           }
-          return Container();
+          return PoseDetector();
         }),
       ),
     );

+ 79 - 0
app/lib/exercises/exercises_validation/widgets/pose_detector.dart

@@ -0,0 +1,79 @@
+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,
+          ),
+        );
+      },
+    );
+  }
+}

+ 7 - 0
app/pubspec.lock

@@ -8,6 +8,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "2.8.2"
+  body_detection:
+    dependency: "direct main"
+    description:
+      name: body_detection
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.0.3"
   boolean_selector:
     dependency: transitive
     description:

+ 1 - 0
app/pubspec.yaml

@@ -39,6 +39,7 @@ dependencies:
   flutter_map: ^0.14.0
   flutter_map_location_marker: ^3.1.0
   permission_handler: ^9.2.0
+  body_detection: ^0.0.3
 
 dev_dependencies:
   flutter_test: