// Author: fruit.com.cn import 'package:flutter/foundation.dart'; import 'dev_config.dart'; import 'prod_config.dart'; /// 客户端运行时配置。 /// /// 两套环境各一个文件: /// - `dev_config.dart`:[DevConfig](本机联调) /// - `prod_config.dart`:[ProdConfig](生产) /// /// Debug 使用开发环境,Release 自动使用生产环境,不做网络探测。 abstract final class AppConfig { /// **环境开关**:Debug 使用开发环境,Release 使用生产环境。 static const bool useDevConfig = !kReleaseMode; /// 当前选中的环境地址。 static String get baseUrl => useDevConfig ? DevConfig.baseUrl : ProdConfig.baseUrl; /// 调试面板手改的地址(见 `ServerEndpoint`);为空表示用上面的环境地址。 static String _runtimeBaseUrl = ''; /// 启动期异步准备(iOS 无线数据权限弹窗),目录请求前等待它。 static Future? _ready; /// 启动准备完成信号;默认已完成,避免影响既有测试与调用方。 static Future get ready => _ready ?? Future.value(); static set ready(Future value) => _ready = value; static const Duration requestTimeout = Duration(seconds: 8); /// 实际使用的服务地址:运行时手改优先,否则用环境开关选中的地址。 static String get apiBaseUrl => _runtimeBaseUrl.isNotEmpty ? _runtimeBaseUrl : baseUrl; /// 应用一个已经规范化的运行时地址;传 null 表示清除。 static void applyRuntimeBaseUrl(String? value) { _runtimeBaseUrl = value ?? ''; } /// 清除运行时地址,主要给测试与重启流程用。 static void clearRuntimeBaseUrl() { _runtimeBaseUrl = ''; } /// 后端返回的是相对路径(/files/...),这里补上服务地址。 static String mediaUrl(String path) { if (path.isEmpty) return ''; if (path.startsWith('http://') || path.startsWith('https://')) return path; return '$apiBaseUrl$path'; } }