enum Environment { production, } class AppConfig { static const Environment currentEnvironment = Environment.production; static const String appName = '本地打包'; static const String appLogo = ''; static final Map> _environmentHosts = { Environment.production: [ 'h5-im.imharry.work', ], }; static List get environmentHosts { return _environmentHosts[currentEnvironment] ?? const []; } static String homeUrl({String? appName, String? appLogo}) { final host = environmentHosts.isNotEmpty ? environmentHosts.first : 'h5-im.imharry.work'; return _withShellBranding( _normalizeHomeUrl(host), appName: appName, appLogo: appLogo, ); } static String _normalizeHomeUrl(String host) { final value = host.trim(); if (value.startsWith('http://') || value.startsWith('https://')) { return value.endsWith('/') ? value : '$value/'; } return 'https://$value/'; } static String _withShellBranding( String url, { String? appName, String? appLogo, }) { final uri = Uri.parse(url); final queryParameters = Map.from(uri.queryParameters) ..['flutter_shell'] = '1'; final trimmedName = (appName ?? AppConfig.appName).trim(); if (trimmedName.isNotEmpty) { queryParameters['shell_app_name'] = trimmedName; } final fragmentParameters = Map.from( Uri.splitQueryString(uri.fragment), ); final trimmedLogo = (appLogo ?? AppConfig.appLogo).trim(); if (trimmedLogo.isNotEmpty) { fragmentParameters['shell_app_logo'] = trimmedLogo; } return uri .replace( queryParameters: queryParameters, fragment: fragmentParameters.isEmpty ? null : Uri(queryParameters: fragmentParameters).query, ) .toString(); } }