|
- // lib/presentation/screens/media_picker/media_picker_screen.dart
-
- import 'dart:convert'; // <<< NÉCESSAIRE POUR BASE64
- import 'dart:io';
- import 'package:flutter/material.dart';
- import 'package:image_picker/image_picker.dart';
- import 'package:social_content_creator/routes/app_routes.dart';
- import 'package:social_content_creator/services/image_analysis_service.dart'; // <<< IMPORT CORRECT
-
- class MediaPickerScreen extends StatefulWidget {
- const MediaPickerScreen({super.key});
-
- @override
- State<MediaPickerScreen> createState() => _MediaPickerScreenState();
- }
-
- class _MediaPickerScreenState extends State<MediaPickerScreen> {
- final _picker = ImagePicker();
- XFile? _selectedMedia;
-
- // On instancie la classe CONCRÈTE
- final ImageAnalysisService _analysisService = OllamaImageAnalysisService();
- bool _isAnalyzing = false;
-
- Future<void> _pickImage(ImageSource source) async {
- try {
- final file = await _picker.pickImage(source: source, imageQuality: 85, maxWidth: 1280);
- if (file != null) {
- setState(() => _selectedMedia = file);
- _analyzeAndNavigate();
- }
- } catch (e) {
- if (!mounted) return;
- ScaffoldMessenger.of(context).showSnackBar(
- SnackBar(content: Text("Erreur lors de la sélection de l'image: $e")),
- );
- }
- }
-
- /// Fonction qui analyse l'image et navigue vers l'écran suivant.
- Future<void> _analyzeAndNavigate() async {
- if (_selectedMedia == null) return;
-
- setState(() => _isAnalyzing = true);
-
- try {
- final imageFile = File(_selectedMedia!.path);
-
- // --- CORRECTION APPLIQUÉE ICI ---
- // 1. Convertir l'image en base64, comme attendu par le service.
- final imageBytes = await imageFile.readAsBytes();
- final String imageBase64 = base64Encode(imageBytes);
-
- // 2. Appeler la bonne méthode (`analyzeImage`) avec le bon argument (`base64Image`).
- final String imagePrompt = await _analysisService.analyzeImage(imageBase64);
- // --- FIN DE LA CORRECTION ---
-
- if (!mounted) return;
-
- // 3. Navigation avec l'image et le prompt
- Navigator.pushNamed(
- context,
- AppRoutes.aiEnhancement,
- arguments: <String, dynamic>{
- 'image': imageFile,
- 'prompt': imagePrompt,
- },
- );
-
- } catch (e) {
- if (!mounted) return;
- ScaffoldMessenger.of(context).showSnackBar(
- SnackBar(content: Text("Erreur lors de l'analyse de l'image : $e")),
- );
- } finally {
- if (mounted) {
- setState(() => _isAnalyzing = false);
- }
- }
- }
-
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- appBar: AppBar(title: const Text('1. Choisir une Image')),
- body: Stack(
- children: [
- SafeArea(
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.stretch,
- children: [
- Expanded(
- child: Center(
- child: Padding(
- padding: const EdgeInsets.all(24.0),
- child: Column(
- mainAxisSize: MainAxisSize.min,
- crossAxisAlignment: CrossAxisAlignment.stretch,
- children: [
- const Icon(Icons.camera_enhance, size: 80, color: Colors.grey),
- const SizedBox(height: 24),
- Text(
- "Choisissez une image pour commencer",
- style: Theme.of(context).textTheme.headlineSmall,
- textAlign: TextAlign.center,
- ),
- const SizedBox(height: 48),
- FilledButton.icon(
- onPressed: _isAnalyzing ? null : () => _pickImage(ImageSource.gallery),
- icon: const Icon(Icons.photo_library_outlined),
- label: const Text('Importer depuis la galerie'),
- style: FilledButton.styleFrom(padding: const EdgeInsets.symmetric(vertical: 12)),
- ),
- const SizedBox(height: 12),
- OutlinedButton.icon(
- onPressed: _isAnalyzing ? null : () => _pickImage(ImageSource.camera),
- icon: const Icon(Icons.camera_alt_outlined),
- label: const Text('Prendre une photo'),
- style: OutlinedButton.styleFrom(padding: const EdgeInsets.symmetric(vertical: 12)),
- ),
- ],
- ),
- ),
- ),
- ),
- ],
- ),
- ),
- if (_isAnalyzing)
- Container(
- color: Colors.black.withOpacity(0.5),
- child: const Center(
- child: Column(
- mainAxisSize: MainAxisSize.min,
- children: [
- CircularProgressIndicator(),
- SizedBox(height: 16),
- Text("Analyse de l'image...", style: TextStyle(color: Colors.white, fontSize: 16)),
- ],
- ),
- ),
- ),
- ],
- ),
- );
- }
- }
|