import 'dart:io'; import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; // import 'package:flutter_map_tile_caching/flutter_map_tile_caching.dart'; import 'package:http/http.dart' as http; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' as path; import 'dart:ui' as ui; /// 地图瓦片缓存工具类 class KRFMTC { static const String kr_storeName = 'kaer_map_store'; /// HTTP 客户端,用于复用连接 static late final http.Client _httpClient = http.Client(); /// 瓦片提供者实例 static late final TileProvider _tileProvider = NetworkTileProvider(); /// 判断是否在中国大陆 static bool _kr_isInMainlandChina() { // 获取系统语言 final List systemLocales = ui.window.locales; final String? languageCode = systemLocales.isNotEmpty ? systemLocales.first.languageCode : null; final String? countryCode = systemLocales.isNotEmpty ? systemLocales.first.countryCode : null; // 获取系统时区 final String timeZoneName = DateTime.now().timeZoneName; // 检查是否为中文语言环境 bool isChineseLanguage = languageCode == 'zh'; // 检查是否为中国地区代码 bool isChineseRegion = countryCode == 'CN'; // 检查是否为中国时区 bool isChineseTimezone = timeZoneName.contains('China') || timeZoneName == 'Asia/Shanghai'; // 如果同时满足语言和地区或时区条件,则认为在中国大陆 return (isChineseLanguage && (isChineseRegion || isChineseTimezone)); } /// 获取地图瓦片URL static String kr_getTileUrl() { if (_kr_isInMainlandChina()) { // 使用高德地图 return 'https://webst0{s}.is.autonavi.com/appmaptile?style=7&x={x}&y={y}&z={z}'; } else { // 使用 OpenStreetMap return 'https://tile.openstreetmap.org/{z}/{x}/{y}.png'; } } /// 获取地图瓦片子域名 static List kr_getTileSubdomains() { if (_kr_isInMainlandChina()) { return ['1', '2', '3', '4']; } else { return ['a', 'b', 'c']; } } /// 获取地图瓦片提供者 static TileProvider kr_getTileProvider() { return _tileProvider; } /// 初始化地图缓存 static Future kr_initMapCache() async { // 不使用缓存,无需实现 } /// 清理地图缓存 static Future kr_clearMapCache() async { // 不使用缓存,无需实现 } /// 检查瓦片是否已缓存 static Future kr_isTileCached({ required TileCoordinates coords, required TileLayer options, }) async { return false; } /// 获取缓存状态信息 static Future<({bool isAvailable, int cacheCount, String cacheSize})> kr_checkCacheStatus() async { return (isAvailable: false, cacheCount: 0, cacheSize: '0 MB'); } /// 释放资源 static void kr_dispose() { _httpClient.close(); } }