chore: supprime le code mort signale par flutter analyze
Retire imports, champs et variables locales non utilises (14 warnings) : - imports inutilises (app, database_helper, impact_editor, target_calibration, session_provider) - champs write-only de capture_screen (_cropService, _scanAnimation, _isCameraInitialized, _alignmentStatus) et _movingShotId - bloc de calcul mort dans crop_screen et variables locales (themeProvider, ny) _filterType (history_screen) volontairement conserve : c'est une fonctionnalite de filtre inachevee, pas du code mort. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -3,7 +3,6 @@ import 'package:provider/provider.dart';
|
|||||||
import 'core/theme/theme_provider.dart';
|
import 'core/theme/theme_provider.dart';
|
||||||
import 'core/theme/app_theme.dart';
|
import 'core/theme/app_theme.dart';
|
||||||
import 'main_navigation_holder.dart';
|
import 'main_navigation_holder.dart';
|
||||||
import 'features/home/home_screen.dart';
|
|
||||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||||
|
|
||||||
class BullyApp extends StatelessWidget {
|
class BullyApp extends StatelessWidget {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import 'dart:io';
|
|
||||||
import 'package:sqflite/sqflite.dart';
|
import 'package:sqflite/sqflite.dart';
|
||||||
import 'package:path/path.dart';
|
import 'package:path/path.dart';
|
||||||
import '../models/session.dart';
|
import '../models/session.dart';
|
||||||
|
|||||||
@@ -118,7 +118,6 @@ class _AnalysisScreenContentState extends State<_AnalysisScreenContent> {
|
|||||||
TransformationController();
|
TransformationController();
|
||||||
final GlobalKey _imageKey = GlobalKey();
|
final GlobalKey _imageKey = GlobalKey();
|
||||||
double _currentZoomScale = 1.0;
|
double _currentZoomScale = 1.0;
|
||||||
String? _movingShotId;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import 'dart:math' as math;
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
import '../../core/theme/app_theme.dart';
|
|
||||||
import '../../data/models/shot.dart';
|
import '../../data/models/shot.dart';
|
||||||
import 'analysis_provider.dart';
|
import 'analysis_provider.dart';
|
||||||
import 'widgets/target_overlay.dart';
|
import 'widgets/target_overlay.dart';
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
/// Les anneaux sont répartis proportionnellement.
|
/// Les anneaux sont répartis proportionnellement.
|
||||||
library;
|
library;
|
||||||
|
|
||||||
import 'dart:math' as math;
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import '../../../core/theme/app_theme.dart';
|
import '../../../core/theme/app_theme.dart';
|
||||||
import '../../../data/models/target_type.dart';
|
import '../../../data/models/target_type.dart';
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ import '../../data/models/target_type.dart';
|
|||||||
import '../crop/crop_screen.dart';
|
import '../crop/crop_screen.dart';
|
||||||
import '../session/session_provider.dart';
|
import '../session/session_provider.dart';
|
||||||
import 'widgets/image_source_button.dart';
|
import 'widgets/image_source_button.dart';
|
||||||
import '../../services/image_crop_service.dart';
|
|
||||||
import '../../services/opencv_target_service.dart';
|
import '../../services/opencv_target_service.dart';
|
||||||
import '../../services/parallelism_service.dart'; // NOUVEAU
|
import '../../services/parallelism_service.dart'; // NOUVEAU
|
||||||
import 'package:image/image.dart' as img;
|
import 'package:image/image.dart' as img;
|
||||||
@@ -31,7 +30,6 @@ class CaptureScreen extends StatefulWidget {
|
|||||||
class _CaptureScreenState extends State<CaptureScreen>
|
class _CaptureScreenState extends State<CaptureScreen>
|
||||||
with SingleTickerProviderStateMixin {
|
with SingleTickerProviderStateMixin {
|
||||||
final ImagePicker _picker = ImagePicker();
|
final ImagePicker _picker = ImagePicker();
|
||||||
final ImageCropService _cropService = ImageCropService();
|
|
||||||
final TargetType _selectedType = TargetType.concentric;
|
final TargetType _selectedType = TargetType.concentric;
|
||||||
final OpenCVTargetService _opencvService = OpenCVTargetService();
|
final OpenCVTargetService _opencvService = OpenCVTargetService();
|
||||||
|
|
||||||
@@ -56,15 +54,12 @@ class _CaptureScreenState extends State<CaptureScreen>
|
|||||||
// Caméra live
|
// Caméra live
|
||||||
CameraController? _cameraController;
|
CameraController? _cameraController;
|
||||||
List<CameraDescription>? _cameras;
|
List<CameraDescription>? _cameras;
|
||||||
bool _isCameraInitialized = false;
|
|
||||||
bool _showLiveCamera = false;
|
bool _showLiveCamera = false;
|
||||||
|
|
||||||
// Animation pulsation du viseur
|
// Animation pulsation du viseur
|
||||||
late AnimationController _scanAnimationController;
|
late AnimationController _scanAnimationController;
|
||||||
late Animation<double> _scanAnimation;
|
|
||||||
|
|
||||||
// Détection OpenCV (cible circulaire) — on garde le résultat COMPLET
|
// Détection OpenCV (cible circulaire) — on garde le résultat COMPLET
|
||||||
bool? _alignmentStatus;
|
|
||||||
TargetDetectionResult? _targetResult; // NOUVEAU : centre + rayon de la cible
|
TargetDetectionResult? _targetResult; // NOUVEAU : centre + rayon de la cible
|
||||||
Timer? _detectionTimer;
|
Timer? _detectionTimer;
|
||||||
bool _isAnalyzingFrame = false;
|
bool _isAnalyzingFrame = false;
|
||||||
@@ -80,10 +75,6 @@ class _CaptureScreenState extends State<CaptureScreen>
|
|||||||
duration: const Duration(seconds: 2),
|
duration: const Duration(seconds: 2),
|
||||||
vsync: this,
|
vsync: this,
|
||||||
)..repeat(reverse: true);
|
)..repeat(reverse: true);
|
||||||
|
|
||||||
_scanAnimation = Tween<double>(begin: 0.8, end: 1.0).animate(
|
|
||||||
CurvedAnimation(parent: _scanAnimationController, curve: Curves.easeInOut),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -190,7 +181,6 @@ class _CaptureScreenState extends State<CaptureScreen>
|
|||||||
if (_cameraController != null) {
|
if (_cameraController != null) {
|
||||||
await _cameraController!.dispose();
|
await _cameraController!.dispose();
|
||||||
_cameraController = null;
|
_cameraController = null;
|
||||||
_isCameraInitialized = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_cameras = await availableCameras();
|
_cameras = await availableCameras();
|
||||||
@@ -211,9 +201,7 @@ class _CaptureScreenState extends State<CaptureScreen>
|
|||||||
await _cameraController!.initialize();
|
await _cameraController!.initialize();
|
||||||
|
|
||||||
setState(() {
|
setState(() {
|
||||||
_isCameraInitialized = true;
|
|
||||||
_showLiveCamera = true;
|
_showLiveCamera = true;
|
||||||
_alignmentStatus = null;
|
|
||||||
_targetResult = null; // reset détection cible
|
_targetResult = null; // reset détection cible
|
||||||
_parallelismData = null; // NOUVEAU : reset IMU
|
_parallelismData = null; // NOUVEAU : reset IMU
|
||||||
});
|
});
|
||||||
@@ -269,16 +257,6 @@ class _CaptureScreenState extends State<CaptureScreen>
|
|||||||
setState(() {
|
setState(() {
|
||||||
// On garde le résultat complet pour dessiner le cercle.
|
// On garde le résultat complet pour dessiner le cercle.
|
||||||
_targetResult = result.success ? result : null;
|
_targetResult = result.success ? result : null;
|
||||||
|
|
||||||
if (!result.success) {
|
|
||||||
_alignmentStatus = null;
|
|
||||||
} else {
|
|
||||||
final bool isCentered =
|
|
||||||
result.centerX > 0.25 && result.centerX < 0.75 &&
|
|
||||||
result.centerY > 0.25 && result.centerY < 0.75;
|
|
||||||
final bool isSizedCorrectly = result.radius > 0.15;
|
|
||||||
_alignmentStatus = isCentered && isSizedCorrectly;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -298,7 +276,6 @@ class _CaptureScreenState extends State<CaptureScreen>
|
|||||||
_cameraController!.stopImageStream();
|
_cameraController!.stopImageStream();
|
||||||
}
|
}
|
||||||
} catch (_) {}
|
} catch (_) {}
|
||||||
_alignmentStatus = null;
|
|
||||||
_targetResult = null;
|
_targetResult = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -345,21 +345,6 @@ class _CropScreenState extends State<CropScreen> {
|
|||||||
void _initializeImagePosition() {
|
void _initializeImagePosition() {
|
||||||
if (_imageSize == null) return;
|
if (_imageSize == null) return;
|
||||||
|
|
||||||
final imageAspect = _imageSize!.width / _imageSize!.height;
|
|
||||||
final viewportAspect = _viewportSize.width / _viewportSize.height;
|
|
||||||
|
|
||||||
// 1. Calcul strict de la taille de l'image affichée en BoxFit.contain
|
|
||||||
double displayWidth, displayHeight;
|
|
||||||
if (imageAspect > viewportAspect) {
|
|
||||||
displayWidth = _viewportSize.width;
|
|
||||||
displayHeight = _viewportSize.width / imageAspect;
|
|
||||||
} else {
|
|
||||||
displayHeight = _viewportSize.height;
|
|
||||||
displayWidth = _viewportSize.height * imageAspect;
|
|
||||||
}
|
|
||||||
|
|
||||||
final minDisplayDim = math.min(displayWidth, displayHeight);
|
|
||||||
|
|
||||||
// 2. Calcul du scale initial basé sur la dimension de l'image (et non du viewport)
|
// 2. Calcul du scale initial basé sur la dimension de l'image (et non du viewport)
|
||||||
_scale = widget.initialScale ?? 1.0;
|
_scale = widget.initialScale ?? 1.0;
|
||||||
if (_scale < 1.0 && widget.initialScale == null) _scale = 1.0;
|
if (_scale < 1.0 && widget.initialScale == null) _scale = 1.0;
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import '../../data/models/session.dart';
|
|
||||||
import '../../data/models/target_analysis.dart';
|
import '../../data/models/target_analysis.dart';
|
||||||
import '../../data/models/weapon.dart';
|
|
||||||
|
|
||||||
class SessionProvider extends ChangeNotifier {
|
class SessionProvider extends ChangeNotifier {
|
||||||
DateTime? _sessionDate;
|
DateTime? _sessionDate;
|
||||||
|
|||||||
@@ -85,8 +85,6 @@ class _SettingsScreenState extends State<SettingsScreen> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _showThemeDialog() {
|
void _showThemeDialog() {
|
||||||
final themeProvider = context.read<ThemeProvider>();
|
|
||||||
|
|
||||||
showDialog(
|
showDialog(
|
||||||
context: context,
|
context: context,
|
||||||
builder: (context) => AlertDialog(
|
builder: (context) => AlertDialog(
|
||||||
|
|||||||
@@ -119,7 +119,6 @@ class ParallelismService {
|
|||||||
|
|
||||||
// Normalisation par la magnitude réelle (indépendant de g exact)
|
// Normalisation par la magnitude réelle (indépendant de g exact)
|
||||||
final double nx = gx / magnitude;
|
final double nx = gx / magnitude;
|
||||||
final double ny = gy / magnitude;
|
|
||||||
final double nz = gz / magnitude;
|
final double nz = gz / magnitude;
|
||||||
|
|
||||||
// Pitch et Roll mesurent l'inclinaison autour de chaque axe.
|
// Pitch et Roll mesurent l'inclinaison autour de chaque axe.
|
||||||
|
|||||||
Reference in New Issue
Block a user