Files
2026-09-15 15:44:13 +07:00

119 lines
3.4 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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<String> getToken() async {
// 优先读内存(每次启动自动登录后 setToken 已写入),
// 兜底再读 lightKViOS 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<String> userAgent() => DeviceInfoService.getCachedUserAgent();
/// 强制重新生成并写回缓存(扫码登录、设备切换等场景)。
Future<String> 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;
}