feat(app): 初始化家庭网络监控Flutter应用基本结构
- 添加Flutter项目基础文件与配置,包括.gitignore和analysis_options.yaml - 配置Android相关文件及Gradle构建脚本支持 - 新增设备状态与网络状态数据模型及相关枚举 - 实现网络检测及网速测试服务 - 创建监控状态管理Provider,实现设备状态管理和自动刷新机制 - 编写主界面HomeScreen,包括设备列表、网速仪表盘及基础交互 - 添加资源文件支持应用图标和启动画面 - 配置项目元数据文件,支持Flutter迁移及版本控制 - 新增项目README,提供入门指引和相关资源链接
This commit is contained in:
169
home_monitor/lib/providers/monitor_provider.dart
Normal file
169
home_monitor/lib/providers/monitor_provider.dart
Normal file
@@ -0,0 +1,169 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
2
home_monitor/lib/providers/providers.dart
Normal file
2
home_monitor/lib/providers/providers.dart
Normal file
@@ -0,0 +1,2 @@
|
||||
// Provider导出文件
|
||||
export 'monitor_provider.dart';
|
||||
Reference in New Issue
Block a user