import 'dart:convert'; import 'dart:io'; import 'package:file_picker/file_picker.dart'; import 'package:path_provider/path_provider.dart'; import 'package:share_plus/share_plus.dart'; /// Kapselt die plattformseitige Ein-/Ausgabe fuer das Teilen/Importieren von /// Missionen und Drohnenprofilen (Doku 3.5/3.6): schreibt eine JSON-Datei in /// ein temporaeres Verzeichnis und oeffnet das native Share-Sheet (analog /// navigator.share() im HTML-Demonstrator), bzw. liest eine vom Nutzer /// ausgewaehlte JSON-Datei ein (analog dem versteckten ``). /// /// Bewusst als Klasse mit Instanzmethoden (nicht als statische Aufrufe der /// Plugins direkt) gehalten, damit sie sich ueber einen Riverpod-Provider /// durch einen Test-Doppelgaenger ersetzen laesst, ohne echte Platform- /// Channels anzusprechen. class SharingService { const SharingService(); /// Schreibt [json] in eine temporaere Datei namens [filename] und oeffnet /// das native Share-Sheet dafuer. Es gibt bewusst keinen Blob-/Download- /// Fallback wie im HTML-Demonstrator - auf Android ist `share_plus` /// immer verfuegbar. Future shareJsonFile({ required String json, required String filename, required String shareTitle, }) async { final dir = await getTemporaryDirectory(); final file = File('${dir.path}/$filename'); await file.writeAsString(json); await SharePlus.instance.share( ShareParams(files: [XFile(file.path)], title: shareTitle), ); } /// Oeffnet den nativen Dateiauswahl-Dialog fuer eine `.json`-Datei und /// gibt deren Textinhalt zurueck - null, wenn der Nutzer abgebrochen hat. Future pickJsonFileText() async { final result = await FilePicker.pickFiles( type: FileType.custom, allowedExtensions: ['json'], ); if (result == null || result.files.isEmpty) return null; final bytes = await result.files.first.readAsBytes(); return utf8.decode(bytes); } }