71 lines
2.8 KiB
Dart
71 lines
2.8 KiB
Dart
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://<LocalHostName>.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 _runtimeBaseUrl = '';
|
|
|
|
/// Build-time server URL supplied through `--dart-define=API_BASE_URL`.
|
|
static String get compiledBaseUrl => _overrideBaseUrl;
|
|
|
|
/// Existing platform-aware fallback used when no runtime or build override exists.
|
|
static String get defaultBaseUrl => _defaultBaseUrl;
|
|
|
|
/// Effective server URL, including the debug-only runtime override.
|
|
static String get apiBaseUrl => _runtimeBaseUrl.isNotEmpty
|
|
? _runtimeBaseUrl
|
|
: (compiledBaseUrl.isNotEmpty ? compiledBaseUrl : 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'));
|
|
|
|
/// Applies an already normalized runtime URL. Passing null clears it.
|
|
static void applyRuntimeBaseUrl(String? value) {
|
|
_runtimeBaseUrl = value ?? '';
|
|
}
|
|
|
|
/// Clears the in-memory runtime override, mainly for tests and restarts.
|
|
static void clearRuntimeBaseUrl() {
|
|
_runtimeBaseUrl = '';
|
|
}
|
|
|
|
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';
|
|
}
|
|
}
|