import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:appwrite/models.dart' as user_models; import '../controllers/login_controller.dart'; import '../controllers/geolocation_controller.dart'; import '../models/ptv_logistic_model.dart'; import '../routes/app_routes.dart'; class InputController extends GetxController { final GeolocationController geoCtrl = Get.put(GeolocationController()); // Lazy-get für LoginController - wird nur erstellt wenn benötigt LoginController get loginCtrl => Get.find(); final _ptvModel = Rxn(); final _user = (Get.arguments as user_models.User).obs; final formKey = GlobalKey(); late TextEditingController dateController; late TextEditingController odometerController; late TextEditingController litersController; late TextEditingController pricePerLiterController; late TextEditingController locationController; late TextEditingController sumPriceController; PTVModel? get ptvModel => _ptvModel.value; user_models.User? get currentUser => _user.value; // Sichere Getter für Controller-Text String get safeDate => _isControllerValid(dateController) ? dateController.text : ''; String get safeLocation => _isControllerValid(locationController) ? locationController.text : ''; // Hilfsmethode zur Controller-Validierung bool _isControllerValid(TextEditingController? controller) { try { return controller != null && controller.text.isNotEmpty; } catch (e) { return false; } } @override void onInit() { _initController(); _getLocation(); super.onInit(); } void _initController() { dateController = TextEditingController(); odometerController = TextEditingController(); litersController = TextEditingController(); pricePerLiterController = TextEditingController(); locationController = TextEditingController(); sumPriceController = TextEditingController(); // init Date today to dateController dateController.text = DateTime.now().toString().split(' ').first; } @override void onReady() {} @override void onClose() { // Dispose aller TextEditingController dateController.dispose(); odometerController.dispose(); litersController.dispose(); pricePerLiterController.dispose(); locationController.dispose(); sumPriceController.dispose(); geoCtrl.onClose(); // LoginController nicht schließen da er permanent sein könnte super.onClose(); } void _getLocation() async { await geoCtrl.getCurrentPosition().then( (_) => { _ptvModel.value = geoCtrl.ptvModel, locationController.text = geoCtrl.ptvModel?.locations?.first.formattedAddress ?? '', }, ); update(); } void goToListPage() { //AppNavigation.goToListPage } void logout() async { // Zeige Loading um weitere Interaktionen zu verhindern Get.dialog( const Center( child: CircularProgressIndicator(), ), barrierDismissible: false, ); try { // Kurze Verzögerung um sicherzustellen dass UI Updates verarbeitet werden await Future.delayed(const Duration(milliseconds: 100)); // Logout ausführen await loginCtrl.logout(); // Dialog schließen if (Get.isDialogOpen == true) { Get.back(); } // Navigation nach kurzer Verzögerung await Future.delayed(const Duration(milliseconds: 100)); AppNavigation.offAllToLogin(); } catch (e) { // Dialog schließen bei Fehler if (Get.isDialogOpen == true) { Get.back(); } Get.snackbar( 'Fehler', 'Logout fehlgeschlagen: $e', snackPosition: SnackPosition.BOTTOM, backgroundColor: Colors.red.shade500, ); } } }