import 'dart:async'; import 'dart:developer'; import 'package:flutter/foundation.dart'; import 'package:latlong2/latlong.dart'; import 'package:provider/provider.dart'; import '../Provider/RideProvider.dart'; class RideRequestProvider extends ChangeNotifier { bool isRequestVisible = true; late int rideId = -1; bool _disposed = false; // Track pending async operations final List _pendingOperations = []; bool _isInitializing = false; Future initializeRide(RideProvider rideProvider, int rideId) async { if (_disposed || rideId == null) return; try { _isInitializing = true; this.rideId = rideId; await _executeWithTimeout(rideProvider.findbyid(rideId), timeout: const Duration(seconds: 10), onTimeout: () => throw TimeoutException('Ride loading timed out'), ); if (rideProvider.currentride == null) { throw Exception('Failed to load ride details'); } } catch (e) { log('Ride initialization failed: $e'); _handleError(e); } finally { _isInitializing = false; } } Future _executeWithTimeout(Future future, { required Duration timeout, required FutureOr Function() onTimeout, }) async { final result = await future.timeout(timeout, onTimeout: onTimeout); _pendingOperations.remove(future); return result; } void _handleError(dynamic error) { if (_disposed) return; isRequestVisible = false; _safeNotify(); } void acceptRide() { if (_disposed) return; log("🟢🟢 acceptRide"); isRequestVisible = false; _safeNotify(); } void declinetRide() { if (_disposed) return; log("🟢 declinetRide"); isRequestVisible = false; _safeNotify(); } void _safeNotify() { if (!_disposed && !_isInitializing) { notifyListeners(); } } @override void dispose() { log("❗❗❗ dispose"); _disposed = true; super.dispose(); } }