- 添加Flutter项目基础文件与配置,包括.gitignore和analysis_options.yaml - 配置Android相关文件及Gradle构建脚本支持 - 新增设备状态与网络状态数据模型及相关枚举 - 实现网络检测及网速测试服务 - 创建监控状态管理Provider,实现设备状态管理和自动刷新机制 - 编写主界面HomeScreen,包括设备列表、网速仪表盘及基础交互 - 添加资源文件支持应用图标和启动画面 - 配置项目元数据文件,支持Flutter迁移及版本控制 - 新增项目README,提供入门指引和相关资源链接
170 lines
4.0 KiB
Dart
170 lines
4.0 KiB
Dart
import 'dart:async';
|
|
import 'package:flutter/foundation.dart';
|
|
import '../models/models.dart';
|
|
import '../services/services.dart';
|
|
|
|
/// 监控状态管理
|
|
class MonitorProvider extends ChangeNotifier {
|
|
final NetworkService _networkService = NetworkService();
|
|
final SpeedTestService _speedTestService = SpeedTestService();
|
|
|
|
// 状态
|
|
NetworkStatus _networkStatus = NetworkStatus.initial();
|
|
List<DeviceStatus> _devices = [];
|
|
bool _isLoading = false;
|
|
bool _isTestingSpeed = false;
|
|
String? _errorMessage;
|
|
|
|
// 定时器
|
|
Timer? _autoRefreshTimer;
|
|
int _refreshInterval = 30; // 秒
|
|
|
|
// Getters
|
|
NetworkStatus get networkStatus => _networkStatus;
|
|
List<DeviceStatus> get devices => _devices;
|
|
bool get isLoading => _isLoading;
|
|
bool get isTestingSpeed => _isTestingSpeed;
|
|
String? get errorMessage => _errorMessage;
|
|
int get refreshInterval => _refreshInterval;
|
|
|
|
// 在线设备数量
|
|
int get onlineDevicesCount =>
|
|
_devices.where((d) => d.isOnline).length;
|
|
|
|
// 离线设备数量
|
|
int get offlineDevicesCount =>
|
|
_devices.where((d) => d.state == DeviceState.offline).length;
|
|
|
|
/// 初始化默认设备列表
|
|
void initDefaultDevices() {
|
|
_devices = [
|
|
DeviceStatus(
|
|
id: '1',
|
|
name: '主路由器',
|
|
type: DeviceType.gateway,
|
|
ip: '192.168.1.1',
|
|
port: 80,
|
|
lastCheck: DateTime.now(),
|
|
),
|
|
DeviceStatus(
|
|
id: '2',
|
|
name: '旁路由',
|
|
type: DeviceType.bypass,
|
|
ip: '192.168.1.2',
|
|
port: 80,
|
|
lastCheck: DateTime.now(),
|
|
),
|
|
DeviceStatus(
|
|
id: '3',
|
|
name: 'NAS',
|
|
type: DeviceType.nas,
|
|
ip: '192.168.1.100',
|
|
port: 5000,
|
|
lastCheck: DateTime.now(),
|
|
),
|
|
];
|
|
notifyListeners();
|
|
}
|
|
|
|
/// 添加设备
|
|
void addDevice(DeviceStatus device) {
|
|
_devices.add(device);
|
|
notifyListeners();
|
|
}
|
|
|
|
/// 移除设备
|
|
void removeDevice(String id) {
|
|
_devices.removeWhere((d) => d.id == id);
|
|
notifyListeners();
|
|
}
|
|
|
|
/// 更新设备
|
|
void updateDevice(DeviceStatus device) {
|
|
final index = _devices.indexWhere((d) => d.id == device.id);
|
|
if (index != -1) {
|
|
_devices[index] = device;
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
/// 刷新所有状态
|
|
Future<void> refreshAll() async {
|
|
_isLoading = true;
|
|
_errorMessage = null;
|
|
notifyListeners();
|
|
|
|
try {
|
|
// 检测网络状态
|
|
_networkStatus = await _speedTestService.quickCheck();
|
|
|
|
// 检测所有设备
|
|
if (_devices.isNotEmpty) {
|
|
_devices = await _networkService.checkAllDevices(_devices);
|
|
}
|
|
} catch (e) {
|
|
_errorMessage = e.toString();
|
|
} finally {
|
|
_isLoading = false;
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
/// 运行网速测试
|
|
Future<void> runSpeedTest() async {
|
|
_isTestingSpeed = true;
|
|
notifyListeners();
|
|
|
|
try {
|
|
_networkStatus = await _speedTestService.runFullTest();
|
|
} catch (e) {
|
|
_errorMessage = e.toString();
|
|
} finally {
|
|
_isTestingSpeed = false;
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
/// 检测单个设备
|
|
Future<void> checkSingleDevice(String deviceId) async {
|
|
final index = _devices.indexWhere((d) => d.id == deviceId);
|
|
if (index == -1) return;
|
|
|
|
final device = _devices[index];
|
|
final updatedDevice = await _networkService.checkDevice(device);
|
|
_devices[index] = updatedDevice;
|
|
notifyListeners();
|
|
}
|
|
|
|
/// 启动自动刷新
|
|
void startAutoRefresh({int intervalSeconds = 30}) {
|
|
_refreshInterval = intervalSeconds;
|
|
stopAutoRefresh();
|
|
|
|
_autoRefreshTimer = Timer.periodic(
|
|
Duration(seconds: intervalSeconds),
|
|
(_) => refreshAll(),
|
|
);
|
|
}
|
|
|
|
/// 停止自动刷新
|
|
void stopAutoRefresh() {
|
|
_autoRefreshTimer?.cancel();
|
|
_autoRefreshTimer = null;
|
|
}
|
|
|
|
/// 设置刷新间隔
|
|
void setRefreshInterval(int seconds) {
|
|
_refreshInterval = seconds;
|
|
if (_autoRefreshTimer != null) {
|
|
startAutoRefresh(intervalSeconds: seconds);
|
|
}
|
|
notifyListeners();
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
stopAutoRefresh();
|
|
super.dispose();
|
|
}
|
|
}
|