import 'dart:async'; import 'package:dio/dio.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../core/config/app_config.dart'; /// 每次从离线恢复到在线时自增。 /// 数据 provider 通过 watch 此值实现网络恢复后自动刷新。 final networkRecoveryCountProvider = StateProvider((ref) => 0); final connectivityProvider = StateNotifierProvider((ref) { return ConnectivityNotifier( onRecovered: () { ref.read(networkRecoveryCountProvider.notifier).update((s) => s + 1); }, ); }); class ConnectivityNotifier extends StateNotifier { final void Function()? onRecovered; ConnectivityNotifier({this.onRecovered, bool skipInit = false}) : super(true) { if (!skipInit) { _check(); _startOnlineTimer(); } } Timer? _timer; // 独立轻量 Dio:短超时,无拦截器 final _dio = Dio(BaseOptions( connectTimeout: const Duration(seconds: 3), receiveTimeout: const Duration(seconds: 3), )); /// 在线时:每 30 秒检测一次 void _startOnlineTimer() { _timer?.cancel(); _timer = Timer.periodic(const Duration(seconds: 30), (_) => _check()); } /// 离线时:每 1 分钟嗅探一次,降低频率节省资源 void _startOfflineTimer() { _timer?.cancel(); _timer = Timer.periodic(const Duration(minutes: 1), (_) => _check()); } /// 立即触发一次检测(供外部调用,如 API 请求失败 / 启动时) Future forceCheck() => _check(); Future _check() async { try { await _dio.get(AppConfig.healthUrl); if (!state) { // 离线 → 在线:切回高频检测,广播恢复事件 state = true; onRecovered?.call(); _startOnlineTimer(); } } catch (_) { if (state) { // 在线 → 离线:切换为低频嗅探 state = false; _startOfflineTimer(); } } } @override void dispose() { _timer?.cancel(); _dio.close(force: true); super.dispose(); } }