import 'dart:ui'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:plugin_basic/service/config_services_injection.dart'; import 'package:plugin_platform/engine/sp/sp_util.dart'; import 'package:shared/utils/device_utils.dart'; import 'package:shared/utils/log_utils.dart'; import 'package:shared/utils/screen_util.dart'; import '../constants/app_constant.dart'; /* * 获取并保存当前应用的信息。 * 获取并保存当前设备的信息。 */ class ConfigService extends GetxService { static ConfigService get to => Get.find(); //选择的国家 RxInt curSelectCountry = 0.obs; // 设备信息 /// android 设备信息 AndroidDeviceInfo? androidDeviceInfo; /// ios 设备信息 IosDeviceInfo? iosDeviceInfo; // 当前的languageCode Locale locale = PlatformDispatcher.instance.locale; PackageInfo? _appPackageInfo; String get version => _appPackageInfo?.version ?? '-'; String get appName => _appPackageInfo?.appName ?? '-'; String get packageName => _appPackageInfo?.packageName ?? '-'; String get buildNumber => _appPackageInfo?.buildNumber ?? '-'; final RxBool _isDarkModel = Get.isDarkMode.obs; // 是否是暗黑模式 bool get isDarkModel => _isDarkModel.value; // 顶部安全距离(pt) double get safeAreaPaddingTop => _safeAreaPaddingTop!; // 底部安全距离(pt) double get safeAreaPaddingBottom => _safeAreaPaddingBottom!; double? _safeAreaPaddingTop; double? _safeAreaPaddingBottom; //屏幕大小 Size? mSize; //密度 double? mRatio; //设备像素px double? width; double? height; //设备宽高比,大于1.9是全面屏手机 double whRatio = 1; //是否是全面屏设备(宽高比大于1.9) bool isFullScreenDevice = false; // 上下边距 (主要用于 刘海 和 内置导航键) double? topPadding; double? bottomPadding; double? textScaleFactor; Brightness? platformBrightness; EdgeInsets? viewInsets; EdgeInsets? padding; bool? alwaysUse24HourFormat; bool? accessibleNavigation; bool? invertColors; bool? disableAnimations; bool? boldText; Orientation? orientation; @override void onInit() { super.onInit(); } @override void onReady() { super.onReady(); //赋值选中的国家 int country = SPUtil.getInt(AppConstant.storageSelectedCountry, defValue: 0) ?? 0; curSelectCountry.value = country; //打印应用与设备的信息 getDeviceInfo(); getAppInfos(); //打印当前设备的一些Media信息 getMediaInfo(context: Get.context!); paddingSizeTop(context: Get.context!); paddingSizeBottom(context: Get.context!); } // ServicesInjection 已经获取到了信息,直接赋值过来并打印当前的应用信息 Future getAppInfos() async { // package_info 插件获取到当前运行平台上App的包信息 _appPackageInfo = ConfigServicesInjection.packageInfo; Log.d('package_info 插件获获取到的app【appName】$appName'); Log.d('package_info 插件获获取到的app【packageName】$packageName'); Log.d('package_info 插件获获取到的app【version】$version'); Log.d('package_info 插件获获取到的app【buildNumber】$buildNumber'); } // ServicesInjection 已经获取到了信息,直接赋值过来并打印当前的设备信息 void getDeviceInfo() { if (DeviceUtils.isIOS) { iosDeviceInfo = ConfigServicesInjection.iosDeviceInfo; Log.d('device_info_plus插件获取到设备信息【iosDeviceInfo】$iosDeviceInfo'); } else if (DeviceUtils.isAndroid) { androidDeviceInfo = ConfigServicesInjection.androidDeviceInfo; Log.d('device_info_plus插件获取到设备信息【androidDeviceInfo】$androidDeviceInfo'); } } // 获取当前的languageCode void initLocale() {} // 更换当前的languageCode void onLocaleUpdate(Locale value) { locale = value; Get.updateLocale(value); Log.d('glabalService-app_config_service.dart-更换后的locale【locale】$locale'); } // 切换主题模式 dark(暗黑) / light(明亮) Future switchThemeModel() async { _isDarkModel.value = !_isDarkModel.value; // Get.changeTheme( // _isDarkModel.value == true ? AppTheme.dark : AppTheme.light, // ); await Future.delayed(const Duration(seconds: 1)); } // 获取media相关信息 void getMediaInfo({BuildContext? context}) { //屏幕大小 mSize = MediaQuery.of(context!).size; //密度 mRatio = MediaQuery.of(context).devicePixelRatio; //设备像素 px width = mSize!.width * mRatio!; height = mSize!.height * mRatio!; whRatio = (height ?? 1) / (width ?? 1); isFullScreenDevice = whRatio > 1.9; // 上下边距 (主要用于 刘海 和 内置导航键) topPadding = MediaQuery.of(context).padding.top; bottomPadding = MediaQuery.of(context).padding.bottom; textScaleFactor = MediaQuery.of(context).textScaleFactor; platformBrightness = MediaQuery.of(context).platformBrightness; viewInsets = MediaQuery.of(context).viewInsets; padding = MediaQuery.of(context).padding; alwaysUse24HourFormat = MediaQuery.of(context).alwaysUse24HourFormat; accessibleNavigation = MediaQuery.of(context).accessibleNavigation; invertColors = MediaQuery.of(context).invertColors; disableAnimations = MediaQuery.of(context).disableAnimations; boldText = MediaQuery.of(context).boldText; orientation = MediaQuery.of(context).orientation; final screenDensity = MediaQuery.devicePixelRatioOf(context); //初始化Flustarts工具类中 ScreenUtils 工具,可以设置设计稿的大小,可以选择性的使用 getAdapterSizeCtx 适配大小屏不同尺寸的展示 setDesignWHD(375, 667, density: screenDensity); Log.d('service-app_config_service.dart---设备信息【MediaQuery.of(context)】:${MediaQuery.of(context)}'); Log.d('service-app_config_service.dart---设备像素比dpr(物理像素/逻辑像素)【mRatio】:$mRatio'); Log.d('service-app_config_service.dart--- ScreenUtil像素比: $screenDensity'); Log.d('service-app_config_service.dart---逻辑像素pt【mSize.width * mSize.height】:${mSize!.width} x ${mSize!.height}'); Log.d('service-app_config_service.dart---屏幕分辨率px(物理像素)【mSize.width * mRatio】 X 【mSize.height * mRatio】:$width x $height ' '屏幕的宽高比:$whRatio'); Log.d('service-app_config_service.dart---上边刘海(状态栏)【MediaQuery.of(context).padding.top】:$topPadding'); Log.d('service-app_config_service.dart---下边导航【MediaQuery.of(context).padding.bottom】:$bottomPadding'); Log.d('service-app_config_service.dart---textScaleFactor【MediaQuery.of(context).textScaleFactor】: $textScaleFactor'); Log.d('service-app_config_service.dart---platformBrightness【MediaQuery.of(context).platformBrightness】: $platformBrightness'); Log.d('service-app_config_service.dart---viewInsets【MediaQuery.of(context).viewInsets】: $viewInsets'); Log.d('service-app_config_service.dart---padding【MediaQuery.of(context).padding】: $padding'); Log.d('service-app_config_service.dart---alwaysUse24HourFormat: $alwaysUse24HourFormat'); Log.d('service-app_config_service.dart---accessibleNavigation: $accessibleNavigation'); Log.d('service-app_config_service.dart---invertColors: $invertColors'); Log.d('service-app_config_service.dart---disableAnimations: $disableAnimations'); Log.d('service-app_config_service.dart---boldText: $boldText'); Log.d('service-app_config_service.dart---orientation: $orientation'); } double paddingSizeBottom({required BuildContext context}) { final MediaQueryData data = MediaQuery.of(context); EdgeInsets padding = data.padding; padding = padding.copyWith(bottom: data.viewPadding.bottom); Log.d("glabalService-config.dart该设备底部的安全距离为----${padding.bottom}"); _safeAreaPaddingBottom = padding.bottom; return padding.bottom; } double paddingSizeTop({required BuildContext context}) { final MediaQueryData data = MediaQuery.of(context); EdgeInsets padding = data.padding; padding = padding.copyWith(top: data.viewPadding.top); Log.d("glabalService-config.dart该设备顶部的安全距离为----${padding.top}"); _safeAreaPaddingTop = padding.top; return padding.top; } int compareVersionNumbers(String version1, String version2) { List v1 = version1.split('.').map(int.parse).toList(); List v2 = version2.split('.').map(int.parse).toList(); int minLength = v1.length < v2.length ? v1.length : v2.length; for (int i = 0; i < minLength; i++) { if (v1[i] < v2[i]) { return -1; // version1 < version2 } else if (v1[i] > v2[i]) { return 1; } } if (v1.length < v2.length) { return -1; } else if (v1.length > v2.length) { return 1; // version1 > version2 } return 0; //version1 = version2 } }