# video **Repository Path**: panlke/video ## Basic Information - **Project Name**: video - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-25 - **Last Updated**: 2025-08-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Dio 单例模式实现方案 ## 🎯 目标 确保全局只有一个 Dio 实例,避免重复配置和内存浪费。 ## 📋 实现要点 ### 1. BaseHttp 单例设计 ```dart class BaseHttp { // 单例模式 - 确保 BaseHttp 只有一个实例 static final BaseHttp _instance = BaseHttp._internal(); factory BaseHttp() => _instance; BaseHttp._internal(); // 静态 Dio 实例 - 确保全局只有一个 Dio static final Dio _dio = Dio(); static bool _isInitialized = false; // 防止重复初始化 } ``` ### 2. 初始化保护机制 ```dart void init({...}) { // 防止重复初始化 if (_isInitialized) { _logger.w('BaseHttp 已经初始化过了,跳过重复初始化'); return; } // 配置 Dio... _isInitialized = true; } ``` ### 3. HttpUtil 统一管理 ```dart class HttpUtil { static bool _hasInitialized = false; static void init() { if (_hasInitialized) return; // 防止重复初始化 BaseHttp().init(...); _hasInitialized = true; } static BaseHttp get instance { if (!isInitialized) { throw Exception('HttpUtil 尚未初始化'); } return BaseHttp(); // 返回单例 } } ``` ## 🚀 使用方式 ### 1. 在 main.dart 中初始化 ```dart void main() async { WidgetsFlutterBinding.ensureInitialized(); // 全局初始化 - 只需要调用一次 HttpUtil.init(); runApp(MyApp()); } ``` ### 2. 在服务类中使用 ```dart class AuthService { static get _http => HttpUtil.instance; // 获取单例 static Future> login(LoginDto dto) { return _http.request(...); } } ``` ## ✅ 单例保证机制 ### 1. 实例级别单例 - `BaseHttp` 使用工厂构造函数确保单例 - `_instance` 为静态 final,确保唯一性 ### 2. Dio 实例单例 - `_dio` 为静态 final,全局唯一 - 所有请求共享同一个 Dio 实例 ### 3. 初始化保护 - 双重检查:HttpUtil 和 BaseHttp 都有初始化标志 - 防止重复配置覆盖已有设置 ### 4. 访问控制 - 通过 HttpUtil.instance 统一访问 - 未初始化时抛出异常,强制正确使用 ## 🔍 验证方法 ```dart // 验证单例 final http1 = BaseHttp(); final http2 = BaseHttp(); assert(identical(http1, http2)); // true // 验证 Dio 实例 assert(identical(BaseHttp.dioInstance, BaseHttp.dioInstance)); // true // 验证 HttpUtil 实例 final util1 = HttpUtil.instance; final util2 = HttpUtil.instance; assert(identical(util1, util2)); // true ``` ## 🎁 优势 1. **内存优化**: 全局只有一个 Dio 实例 2. **配置统一**: 所有请求共享相同配置 3. **连接复用**: HTTP 连接池共享 4. **状态一致**: Token、拦截器等状态统一 5. **初始化安全**: 防止重复初始化 ## ⚠️ 注意事项 1. 必须在 main() 中调用 `HttpUtil.init()` 2. 服务类应通过 `HttpUtil.instance` 获取实例 3. 不要直接 `new BaseHttp()` 或多次初始化 4. Token 设置会影响全局请求