feat: dialig for conectivity
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
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();
|
||||
}
|
||||
Reference in New Issue
Block a user