loadIPAddress method

Future<String> loadIPAddress()

获取公网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;
  }
}