loadIPAddress method
获取公网IP
Implementation
Future<String> loadIPAddress() async {
// 如果正在执行,直接返回默认IP
if (_isGettingPublicIP) {
Logger.log('网络: 正在获取公网IP中,返回默认IP: 127.0.0.1');
return '127.0.0.1';
}
// 如果已有有效IP,直接返回
if (publicIP.isValidIP()) {
Logger.log('网络: 已获取公网IP,跳过获取: $publicIP');
return publicIP;
}
// 设置执行状态
_isGettingPublicIP = true;
try {
Logger.log('网络: 开始获取公网IP......');
final apiEndpoints = [
'https://api.ipify.org',
'https://ifconfig.me/ip',
'https://icanhazip.com',
'https://checkip.amazonaws.com',
'https://ipapi.co/ip',
'https://ipinfo.io/ip',
];
int retryCount = 0;
String? resultIP;
// 重试循环
while (retryCount < maxRetryCount && resultIP == null) {
Logger.log('网络: 第 ${retryCount + 1} 次尝试获取公网IP');
try {
resultIP = await _attemptGetPublicIP(apiEndpoints);
publicIP = resultIP ?? '127.0.0.1';
Logger.log('网络: 成功获取公网IP: $publicIP');
return publicIP;
} catch (e) {
Logger.log('网络: 第 ${retryCount + 1} 次获取公网IP失败: $e');
}
retryCount++;
// 如果不是最后一次重试,等待后继续
if (retryCount < maxRetryCount) {
Logger.log('网络: 等待 ${retryDelay.inSeconds} 秒后重试...');
await Future.delayed(retryDelay);
}
}
// 所有重试都失败,返回默认IP
Logger.log('网络: 获取公网IP失败,已达到最大重试次数 ($maxRetryCount),返回默认IP');
return '127.0.0.1';
} catch (e) {
Logger.log('网络: 获取公网IP过程中发生异常: $e');
return '127.0.0.1';
} finally {
// 重置执行状态
_isGettingPublicIP = false;
}
}