import 'dart:async'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; import '../config.dart'; /// وضعیتِ اینترنت را نگه می‌دارد: هم قطعِ رابطِ شبکه (وای‌فای/دیتا) و هم دسترسیِ /// واقعی به سرور (با پینگِ سبکِ /health). [online] برای نمایشِ اوورلیِ «اتصال نیست». class ConnectivityService { ConnectivityService._(); static final ConnectivityService I = ConnectivityService._(); final ValueNotifier online = ValueNotifier(true); final Connectivity _conn = Connectivity(); final Dio _dio = Dio(BaseOptions( connectTimeout: const Duration(seconds: 4), receiveTimeout: const Duration(seconds: 4), )); StreamSubscription? _sub; bool _checking = false; Future init() async { _sub = _conn.onConnectivityChanged.listen(_onChange); await recheck(); } void _onChange(List results) { final hasInterface = results.any((r) => r != ConnectivityResult.none); if (!hasInterface) { online.value = false; // بی‌درنگ: رابطِ شبکه قطع است } else { _verify(); // رابط هست؛ دسترسیِ واقعی را بررسی کن } } /// بررسیِ دستیِ اتصال (دکمه‌ی «تلاش مجدد»). Future recheck() async { final results = await _conn.checkConnectivity(); final hasInterface = results.any((r) => r != ConnectivityResult.none); if (!hasInterface) { online.value = false; return; } await _verify(); } Future _verify() async { if (_checking) return; _checking = true; try { final res = await _dio.get('${AppConfig.baseUrl}/health'); online.value = res.statusCode == 200; } catch (_) { online.value = false; } finally { _checking = false; } } void dispose() => _sub?.cancel(); }