// ignore_for_file: constant_identifier_names, deprecated_member_use import 'dart:io'; import 'package:dio/dio.dart'; import 'package:dio/io.dart'; import 'package:hgdj/tools_base/debug_log.dart'; import 'package:hgdj/tools_base/net/http_manager.dart'; import '../../config/address.dart'; import '../../hj_utils/light_model.dart'; import '../../hj_utils/store_keys.dart'; import '../../hj_utils/text_util.dart'; // import 'client_api.dart'; import '../../track_event_manager/device_service.dart'; /// 连接超时15秒 const int CONNECT_TIME_OUT = 15 * 1000; final netManager = NetManager(); class NetManager { static bool _inited = false; init(String baseUrl) { httpManager.init(baseUrl); _inited = true; } reset() { netManager.init(Address.baseApiPath ?? ""); } static bool get isInited => _inited; Future getToken() async { // 优先读内存(每次启动自动登录后 setToken 已写入), // 兜底再读 lightKV:iOS release 包若 MMKV 异常,至少内存 token 能保证可用 var token = Address.token ?? ''; if (token.isEmpty) { token = (await lightKV.getString(StoreKeys.NET_TOKEN)) ?? ''; if (token.isNotEmpty) { Address.token = token; } } return token; } Future setToken(String? token) async { // 该key不共享,不放全局变量 Address.token = token; return lightKV.setString(StoreKeys.NET_TOKEN, token); } /// 获取 UA:优先命中 KV 缓存。 Future userAgent() => DeviceInfoService.getCachedUserAgent(); /// 强制重新生成并写回缓存(扫码登录、设备切换等场景)。 Future refreshUserAgent() => DeviceInfoService.getCachedUserAgent( deviceId: DeviceInfoService.deviceId); /// 清除ua Future clearUserAgent() => DeviceInfoService.clearCachedUserAgent(); /// 服务器时间 DateTime? _serverTime; /// 服务器时间和本地时间的差值 int _diffTimeInSeconds = 0; /// 获取上一次服务器返回的时间 DateTime? getServerTime() { if (null != _serverTime) { return _serverTime; } else { return DateTime.now(); } } /// 设置服务器时间 void setServerTime(String? serverTimeS) { if (TextUtil.isNotEmpty(serverTimeS)) { _serverTime = DateTime.parse(serverTimeS!); _diffTimeInSeconds = DateTime.now().difference(_serverTime!).inSeconds; debugLog( "============>server diff from local in seconds:$_diffTimeInSeconds"); } } /// 获取修复后的本地时间,应该是和服务器时间是同步的 DateTime getFixedCurTime() { return DateTime.now().add(Duration(seconds: -_diffTimeInSeconds)); } } Dio createDio({BaseOptions? options}) { final defaultOptions = BaseOptions( connectTimeout: const Duration(seconds: 15), receiveTimeout: const Duration(seconds: 15), // dio 原生会加上 request header:accept-encoding gzip,导致部分请求失败 // headers: {HttpHeaders.acceptEncodingHeader: "*"}, validateStatus: (int? status) => (status ?? 600) < 600, ); options ??= defaultOptions; options.headers[HttpHeaders.acceptEncodingHeader] = "*"; var dio = Dio(options); var adapter = DefaultHttpClientAdapter(); // var adapter = DefaultHttpClientAdapter(); adapter.onHttpClientCreate = (client) { client.badCertificateCallback = (X509Certificate cert, String host, int port) => true; return client; }; dio.httpClientAdapter = adapter; return dio; }