66 lines
2.0 KiB
Dart
66 lines
2.0 KiB
Dart
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<bool> online = ValueNotifier<bool>(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<void> init() async {
|
|
_sub = _conn.onConnectivityChanged.listen(_onChange);
|
|
await recheck();
|
|
}
|
|
|
|
void _onChange(List<ConnectivityResult> results) {
|
|
final hasInterface =
|
|
results.any((r) => r != ConnectivityResult.none);
|
|
if (!hasInterface) {
|
|
online.value = false; // بیدرنگ: رابطِ شبکه قطع است
|
|
} else {
|
|
_verify(); // رابط هست؛ دسترسیِ واقعی را بررسی کن
|
|
}
|
|
}
|
|
|
|
/// بررسیِ دستیِ اتصال (دکمهی «تلاش مجدد»).
|
|
Future<void> recheck() async {
|
|
final results = await _conn.checkConnectivity();
|
|
final hasInterface = results.any((r) => r != ConnectivityResult.none);
|
|
if (!hasInterface) {
|
|
online.value = false;
|
|
return;
|
|
}
|
|
await _verify();
|
|
}
|
|
|
|
Future<void> _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();
|
|
}
|