This commit is contained in:
sjk
2025-11-17 14:09:17 +08:00
commit 31e46c5bf6
479 changed files with 109324 additions and 0 deletions

View File

@@ -0,0 +1,239 @@
import 'package:flutter/foundation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'dart:async';
/// 网络连接状态枚举
enum NetworkStatus {
connected,
disconnected,
unknown,
}
/// 网络连接类型枚举
enum NetworkType {
wifi,
mobile,
ethernet,
none,
unknown,
}
/// 网络状态数据模型
class NetworkState {
final NetworkStatus status;
final NetworkType type;
final bool isOnline;
final DateTime lastChecked;
const NetworkState({
required this.status,
required this.type,
required this.isOnline,
required this.lastChecked,
});
NetworkState copyWith({
NetworkStatus? status,
NetworkType? type,
bool? isOnline,
DateTime? lastChecked,
}) {
return NetworkState(
status: status ?? this.status,
type: type ?? this.type,
isOnline: isOnline ?? this.isOnline,
lastChecked: lastChecked ?? this.lastChecked,
);
}
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is NetworkState &&
other.status == status &&
other.type == type &&
other.isOnline == isOnline;
}
@override
int get hashCode {
return status.hashCode ^
type.hashCode ^
isOnline.hashCode;
}
@override
String toString() {
return 'NetworkState(status: $status, type: $type, isOnline: $isOnline, lastChecked: $lastChecked)';
}
}
/// 网络状态管理Provider
class NetworkNotifier extends StateNotifier<NetworkState> {
late StreamSubscription<List<ConnectivityResult>> _connectivitySubscription;
final Connectivity _connectivity = Connectivity();
NetworkNotifier()
: super(NetworkState(
status: NetworkStatus.unknown,
type: NetworkType.unknown,
isOnline: false,
lastChecked: DateTime.now(),
)) {
_initializeNetworkMonitoring();
}
/// 初始化网络监控
void _initializeNetworkMonitoring() {
// 监听网络连接状态变化
_connectivitySubscription = _connectivity.onConnectivityChanged.listen(
(List<ConnectivityResult> results) {
_updateNetworkState(results);
},
);
// 初始检查网络状态
_checkInitialConnectivity();
}
/// 检查初始网络连接状态
Future<void> _checkInitialConnectivity() async {
try {
final results = await _connectivity.checkConnectivity();
_updateNetworkState(results);
} catch (e) {
if (kDebugMode) {
print('Error checking initial connectivity: $e');
}
state = state.copyWith(
status: NetworkStatus.unknown,
type: NetworkType.unknown,
isOnline: false,
lastChecked: DateTime.now(),
);
}
}
/// 更新网络状态
void _updateNetworkState(List<ConnectivityResult> results) {
// 取第一个有效的连接结果,如果列表为空则认为无连接
final result = results.isNotEmpty ? results.first : ConnectivityResult.none;
final networkType = _mapConnectivityResultToNetworkType(result);
final isOnline = result != ConnectivityResult.none;
final status = isOnline ? NetworkStatus.connected : NetworkStatus.disconnected;
state = NetworkState(
status: status,
type: networkType,
isOnline: isOnline,
lastChecked: DateTime.now(),
);
if (kDebugMode) {
print('Network state updated: $state');
}
}
/// 将ConnectivityResult映射到NetworkType
NetworkType _mapConnectivityResultToNetworkType(ConnectivityResult result) {
switch (result) {
case ConnectivityResult.wifi:
return NetworkType.wifi;
case ConnectivityResult.mobile:
return NetworkType.mobile;
case ConnectivityResult.ethernet:
return NetworkType.ethernet;
case ConnectivityResult.none:
return NetworkType.none;
default:
return NetworkType.unknown;
}
}
/// 手动刷新网络状态
Future<void> refreshNetworkStatus() async {
try {
final results = await _connectivity.checkConnectivity();
_updateNetworkState(results);
} catch (e) {
if (kDebugMode) {
print('Error refreshing network status: $e');
}
}
}
/// 检查是否有网络连接
bool get isConnected => state.isOnline;
/// 检查是否为WiFi连接
bool get isWifiConnected => state.type == NetworkType.wifi && state.isOnline;
/// 检查是否为移动网络连接
bool get isMobileConnected => state.type == NetworkType.mobile && state.isOnline;
/// 获取网络类型描述
String get networkTypeDescription {
switch (state.type) {
case NetworkType.wifi:
return 'WiFi';
case NetworkType.mobile:
return '移动网络';
case NetworkType.ethernet:
return '以太网';
case NetworkType.none:
return '无网络';
case NetworkType.unknown:
return '未知网络';
}
}
/// 获取网络状态描述
String get statusDescription {
switch (state.status) {
case NetworkStatus.connected:
return '已连接';
case NetworkStatus.disconnected:
return '已断开';
case NetworkStatus.unknown:
return '未知状态';
}
}
@override
void dispose() {
_connectivitySubscription.cancel();
super.dispose();
}
}
/// 网络状态Provider
final networkProvider = StateNotifierProvider<NetworkNotifier, NetworkState>(
(ref) => NetworkNotifier(),
);
/// 网络连接状态Provider简化版
final isConnectedProvider = Provider<bool>(
(ref) => ref.watch(networkProvider).isOnline,
);
/// 网络类型Provider
final networkTypeProvider = Provider<NetworkType>(
(ref) => ref.watch(networkProvider).type,
);
/// WiFi连接状态Provider
final isWifiConnectedProvider = Provider<bool>(
(ref) {
final networkState = ref.watch(networkProvider);
return networkState.type == NetworkType.wifi && networkState.isOnline;
},
);
/// 移动网络连接状态Provider
final isMobileConnectedProvider = Provider<bool>(
(ref) {
final networkState = ref.watch(networkProvider);
return networkState.type == NetworkType.mobile && networkState.isOnline;
},
);