import 'dart:io'; import 'package:flutter/foundation.dart'; /// 客户端与后端约定的运行时配置。 /// /// 接口地址的优先级:`--dart-define=API_BASE_URL=...` > 按运行环境判断的默认值。 /// 开发机的局域网地址会随网络变化,换网络后改 [devHostBaseUrl] 即可。 class AppConfig { const AppConfig._(); /// 开发机的局域网地址。真机上的 `127.0.0.1` 指向手机自己,只能走这个地址。 /// /// 这个地址跟着电脑所在的网络走,换网络后要用 /// `ipconfig getifaddr en0` 重新确认并改这里; /// 也可以换成 Bonjour 名字 `http://.local:8081`(本机是 /// `jiangdeMacBook-Air.local`),换网络不用改,但部分办公网会拦组播解析。 static const String devHostBaseUrl = 'http://jiangdeMacBook-Air.local:8081'; static const String _loopbackBaseUrl = 'http://127.0.0.1:8081'; static const String _overrideBaseUrl = String.fromEnvironment('API_BASE_URL'); static String get apiBaseUrl => _overrideBaseUrl.isNotEmpty ? _overrideBaseUrl : _defaultBaseUrl; static final String _defaultBaseUrl = _runsOnDevMachine ? _loopbackBaseUrl : devHostBaseUrl; /// 模拟器、桌面端与开发机同机,环回地址可用;iOS 真机不满足。 /// Android 没有等价的探测方式,统一按真机处理(模拟器用 /// `--dart-define=API_BASE_URL=http://10.0.2.2:8081` 覆盖)。 static final bool _runsOnDevMachine = kIsWeb || defaultTargetPlatform == TargetPlatform.macOS || defaultTargetPlatform == TargetPlatform.windows || defaultTargetPlatform == TargetPlatform.linux || (defaultTargetPlatform == TargetPlatform.iOS && Platform.environment.containsKey('SIMULATOR_DEVICE_NAME')); static const Duration requestTimeout = Duration(seconds: 8); /// 后端返回的是相对路径(/files/...),这里补上服务地址。 static String mediaUrl(String path) { if (path.isEmpty) return ''; if (path.startsWith('http://') || path.startsWith('https://')) return path; return '$apiBaseUrl$path'; } }