From 122dfd6542c7031bd206b81fe5486130bb2470d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B1=8C=E6=9D=82?= <1147192855@qq.com> Date: Fri, 19 Dec 2025 16:29:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=8B=B9=E6=9E=9C=E7=99=BB?= =?UTF-8?q?=E9=99=86=E4=B8=8D=E8=83=BD=E8=BE=93=E5=85=A5=E9=9D=9E=E6=95=B0?= =?UTF-8?q?=E5=AD=97=EF=BC=8C=E4=BC=98=E5=8C=96=E5=8D=87=E7=BA=A7=E6=8F=92?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- making_school_asignment_app/.gitignore | 2 + .../ios/Flutter/AppFrameworkInfo.plist | 2 +- making_school_asignment_app/ios/Podfile | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 27 ++- .../controllers/app_state_controller.dart | 3 +- .../lib/common/controllers/upgrade_logic.dart | 77 ++++++ .../common/utils/app_upgrade/DownloadApk.dart | 159 ------------- .../utils/app_upgrade/UpdateDialog.dart | 223 ------------------ .../utils/app_upgrade/UpgradePermission.dart | 143 ----------- .../app_upgrade/model/UpdateAppEvent.dart | 83 ------- .../utils/app_upgrade/upgradeLogic.dart | 156 ------------ making_school_asignment_app/lib/main.dart | 23 +- .../lib/page/global_widget/start_page.dart | 24 +- .../lib/page/login_page/login_logic.dart | 20 +- .../lib/page/login_page/login_view.dart | 6 +- making_school_asignment_app/linux/.gitignore | 1 - .../linux/CMakeLists.txt | 145 ------------ .../linux/flutter/CMakeLists.txt | 88 ------- .../flutter/generated_plugin_registrant.cc | 15 -- .../flutter/generated_plugin_registrant.h | 15 -- .../linux/flutter/generated_plugins.cmake | 24 -- making_school_asignment_app/linux/main.cc | 6 - .../linux/my_application.cc | 124 ---------- .../linux/my_application.h | 18 -- making_school_asignment_app/pubspec.yaml | 23 +- 25 files changed, 135 insertions(+), 1274 deletions(-) create mode 100644 making_school_asignment_app/lib/common/controllers/upgrade_logic.dart delete mode 100644 making_school_asignment_app/lib/common/utils/app_upgrade/DownloadApk.dart delete mode 100644 making_school_asignment_app/lib/common/utils/app_upgrade/UpdateDialog.dart delete mode 100644 making_school_asignment_app/lib/common/utils/app_upgrade/UpgradePermission.dart delete mode 100644 making_school_asignment_app/lib/common/utils/app_upgrade/model/UpdateAppEvent.dart delete mode 100644 making_school_asignment_app/lib/common/utils/app_upgrade/upgradeLogic.dart delete mode 100644 making_school_asignment_app/linux/.gitignore delete mode 100644 making_school_asignment_app/linux/CMakeLists.txt delete mode 100644 making_school_asignment_app/linux/flutter/CMakeLists.txt delete mode 100644 making_school_asignment_app/linux/flutter/generated_plugin_registrant.cc delete mode 100644 making_school_asignment_app/linux/flutter/generated_plugin_registrant.h delete mode 100644 making_school_asignment_app/linux/flutter/generated_plugins.cmake delete mode 100644 making_school_asignment_app/linux/main.cc delete mode 100644 making_school_asignment_app/linux/my_application.cc delete mode 100644 making_school_asignment_app/linux/my_application.h diff --git a/making_school_asignment_app/.gitignore b/making_school_asignment_app/.gitignore index 0e34e70..e27d971 100644 --- a/making_school_asignment_app/.gitignore +++ b/making_school_asignment_app/.gitignore @@ -5,9 +5,11 @@ *.swp .DS_Store .atom/ +.build/ .buildlog/ .history .svn/ +.swiftpm/ migrate_working_dir/ # IntelliJ related diff --git a/making_school_asignment_app/ios/Flutter/AppFrameworkInfo.plist b/making_school_asignment_app/ios/Flutter/AppFrameworkInfo.plist index 7c56964..1dc6cf7 100644 --- a/making_school_asignment_app/ios/Flutter/AppFrameworkInfo.plist +++ b/making_school_asignment_app/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 12.0 + 13.0 diff --git a/making_school_asignment_app/ios/Podfile b/making_school_asignment_app/ios/Podfile index d97f17e..e51a31d 100644 --- a/making_school_asignment_app/ios/Podfile +++ b/making_school_asignment_app/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '12.0' +# platform :ios, '13.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/making_school_asignment_app/ios/Runner.xcodeproj/project.pbxproj b/making_school_asignment_app/ios/Runner.xcodeproj/project.pbxproj index 883b12c..cc433dd 100644 --- a/making_school_asignment_app/ios/Runner.xcodeproj/project.pbxproj +++ b/making_school_asignment_app/ios/Runner.xcodeproj/project.pbxproj @@ -477,9 +477,10 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = YES; SUPPORTED_PLATFORMS = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; @@ -495,7 +496,7 @@ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 9; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = Z778GC45N8; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -503,7 +504,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 6; + MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)"; PRODUCT_BUNDLE_IDENTIFIER = "com.yuanxuan.makingS--buneng--choolAsignmentApp"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -524,7 +525,7 @@ buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.yuanxuan.makingSchoolAsignmentApp.RunnerTests; @@ -542,7 +543,7 @@ buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = Z778GC45N8; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; @@ -559,7 +560,7 @@ buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.yuanxuan.makingSchoolAsignmentApp.RunnerTests; @@ -619,10 +620,11 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -671,9 +673,10 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = YES; SUPPORTED_PLATFORMS = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; @@ -689,7 +692,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 9; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = Z778GC45N8; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -697,7 +700,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 6; + MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)"; PRODUCT_BUNDLE_IDENTIFIER = com.yuanxuan.makingSchoolAsignmentApp; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -719,7 +722,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/RunnerRelease.entitlements; - CURRENT_PROJECT_VERSION = 9; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = Z778GC45N8; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -727,7 +730,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 6; + MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)"; PRODUCT_BUNDLE_IDENTIFIER = com.yuanxuan.makingSchoolAsignmentApp; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; diff --git a/making_school_asignment_app/lib/common/controllers/app_state_controller.dart b/making_school_asignment_app/lib/common/controllers/app_state_controller.dart index e974de8..b0c9abf 100644 --- a/making_school_asignment_app/lib/common/controllers/app_state_controller.dart +++ b/making_school_asignment_app/lib/common/controllers/app_state_controller.dart @@ -7,7 +7,8 @@ class AppStateController extends GetxController with WidgetsBindingObserver { final appLifecycleState = AppLifecycleState.resumed.obs; // 便捷方法:判断应用是否在前台 - bool get isAppInForeground => appLifecycleState.value == AppLifecycleState.resumed; + bool get isAppInForeground => + appLifecycleState.value == AppLifecycleState.resumed; @override void onInit() { diff --git a/making_school_asignment_app/lib/common/controllers/upgrade_logic.dart b/making_school_asignment_app/lib/common/controllers/upgrade_logic.dart new file mode 100644 index 0000000..72e4a8d --- /dev/null +++ b/making_school_asignment_app/lib/common/controllers/upgrade_logic.dart @@ -0,0 +1,77 @@ +import 'dart:async'; + +import 'package:flutter/widgets.dart'; +import 'package:get/get.dart'; +import 'package:making_school_asignment_app/common/job/app_version.dart'; +import 'package:making_school_asignment_app/common/mixins/request_tool_mixin.dart'; + +import 'package:yx_app_upgrade_flutter/yx_app_upgrade_flutter.dart'; + +class UpgradeLogic extends GetxService with RequestToolMixin { + Timer? _timer; + + @override + void onReady() { + /// 首次检查更新 + Future.delayed(const Duration(seconds: 10)).then( + (value) => checkUpdate(Get.context!), + ); + + /// 定时检查更新 + _timer?.cancel(); + _timer = Timer.periodic( + const Duration(seconds: 40), + (_) => checkUpdate(Get.context!), + ); + super.onReady(); + } + + @override + void onClose() { + _timer?.cancel(); + super.onClose(); + } + + void checkUpdate(BuildContext context) { + UpgradeAuxiliaryUtils.instance.initiateVersionCheck( + context, + future: (int upType) async { + // upType: 1 为 Android, 2 为 iOS + try { + AppVersion? result = await getClient().getLastAppVersion( + 'making_school_asignment_app', + upType, + ); + if (result != null) return _convertToAppUpgradeVersion(result); + } catch (e, stack) { + debugPrint('fetchLatestUpgradeVersion error: $e\n$stack'); + } + return null; + }, + ); + } + + /// 将 UpdateappResult 转换为 AppUpgradeVersion + AppUpgradeVersion? _convertToAppUpgradeVersion(AppVersion? model) { + if (model == null) return null; + + // 将文件大小从 KB 转换为字节 + final filePath = + (model.appFileUrl?.isNotEmpty ?? false) ? model.appFileUrl : null; + + return AppUpgradeVersion( + versionName: model.version, + // versionBuildNumber: model.version, + isForce: false, + updateContent: model.description ?? '修复BUG,优化体验', + downloadUrl: filePath, + appStoreUrl: filePath, + // apkSize: apkSizeBytes, + supportedMethods: [ + AppUpgradeMethod.market, + AppUpgradeMethod.inApp, + AppUpgradeMethod.browser, + ], + ); + } +} diff --git a/making_school_asignment_app/lib/common/utils/app_upgrade/DownloadApk.dart b/making_school_asignment_app/lib/common/utils/app_upgrade/DownloadApk.dart deleted file mode 100644 index 1b472af..0000000 --- a/making_school_asignment_app/lib/common/utils/app_upgrade/DownloadApk.dart +++ /dev/null @@ -1,159 +0,0 @@ -/* - * @Descripttion: 下载APK - * @version: DownloadApk - * @Author: wy - * @Date: 2020-07-30 15:54:40 - * @LastEditors: wangyang 1147192855@qq.com - * @LastEditTime: 2022-08-02 15:12:21 - */ -import 'dart:io'; - -import 'package:dio/dio.dart'; -import 'package:flutter/material.dart'; -import 'package:making_school_asignment_app/common/utils/utils.dart'; -import 'package:path_provider/path_provider.dart'; -import 'package:app_installer/app_installer.dart'; -import 'package:url_launcher/url_launcher.dart'; - -import 'UpgradePermission.dart'; -import 'model/UpdateAppEvent.dart'; -import 'upgradeLogic.dart'; - -class DownloadApk { - /// 下载安卓更新包 - static Future _downloadAndroid( - context, UpdateAppEvent event, UpgradeLogic logic) async { - /// 创建存储文件 - Directory? storageDir = await getExternalStorageDirectory(); - final storagePath = storageDir?.path ?? '/'; - String version = event.version.replaceAll(".", "-"); - File file = new File('$storagePath/${event.appName}v$version.apk'); - if (await file.exists()) await file.delete(); - if (!file.existsSync()) file.createSync(); - try { - /// 发起下载请求 - Response response = await Dio().get( - event.link, - onReceiveProgress: (num received, num total) { - showDownloadProgress(context, received, total, logic); - }, - options: Options( - responseType: ResponseType.bytes, - followRedirects: false, - ), - ); - file.writeAsBytesSync(response.data); - return file; - } catch (e) { - print(e); - // toPrint(val: e); - } - return null; - } - - // 安装apk - static Future installApk( - context, UpdateAppEvent event, UpgradeLogic logic) async { - try { - logic.loadingApk.value = true; - File? _apkFile = await _downloadAndroid(context, event, logic); - if (_apkFile == null) return false; - String _apkFilePath = _apkFile.path; - if (_apkFilePath.isEmpty) { - debugPrint('make sure the apk file is set'); - return false; - } - - await showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - title: const Text("未知应用安装权限提示", - style: TextStyle( - fontWeight: FontWeight.bold, - )), - content: const Text("请注意:更新时若出现需要同意“安装未知应用权限”,请同意!!!"), - actions: [ - MaterialButton( - color: Theme.of(context).primaryColor, - child: const Text("我已知晓", - style: TextStyle( - color: Colors.white, fontWeight: FontWeight.bold)), - onPressed: () => Navigator.of(context).pop(), - ), - ], - ); - }, - ); - await AppInstaller.installApk(_apkFilePath); // 安装APK - // 如果2秒还没有进入安装引导页面 一律视为更新失败,弹出其他方式更新 - Utils.getInstance().setTimeOut(1, () async { - try { - // 其他方式下载 - // await SystemNavigator.pop(); // 退出APP - var options = ['应用市场更新APP', '浏览器下载并安装APP']; - var uri = - Uri.parse('market://details?id=${event.packageName}'); // 应用市场URI - if (!await canLaunchUrl(uri)) - options.removeAt(0); // 如果不能打开应用市场 就屏蔽掉 这个安装方式 - String? option = await UpgradePermission.showCustomModalBottomSheet( - context, options); - if (option == '应用市场更新APP') await launchUrl(uri); - if (option == '浏览器下载并安装APP') await launchUrl(Uri.parse(event.link)); - } catch (_) {} - }); - - print('安装执行完成了..............0.0'); - } catch (e) { - print('安装进入报错....'); - print(e); - } finally { - logic.loadingApk.value = false; - } - - return false; - } - - /// 展示下载进度 - static void showDownloadProgress( - context, num received, num total, UpgradeLogic logic) { - if (total != -1) { - double progress = double.parse((received / total).toStringAsFixed(2)); - // debugPrint('下载进度$progress'); - logic.downloadRatio.value = progress; - } - } -} - -class RestartWidget extends StatefulWidget { - final Widget child; - - const RestartWidget({super.key, required this.child}); - - static restartApp(BuildContext context) { - final _RestartWidgetState? state = - context.findAncestorStateOfType<_RestartWidgetState>(); - state?.restartApp(); - } - - @override - State createState() => _RestartWidgetState(); -} - -class _RestartWidgetState extends State { - Key key = UniqueKey(); - - void restartApp() { - setState(() { - key = UniqueKey(); - }); - } - - @override - Widget build(BuildContext context) { - return KeyedSubtree( - key: key, - child: widget.child, - ); - } -} diff --git a/making_school_asignment_app/lib/common/utils/app_upgrade/UpdateDialog.dart b/making_school_asignment_app/lib/common/utils/app_upgrade/UpdateDialog.dart deleted file mode 100644 index 8b60c11..0000000 --- a/making_school_asignment_app/lib/common/utils/app_upgrade/UpdateDialog.dart +++ /dev/null @@ -1,223 +0,0 @@ -/* - * @Author: wangyang 1147192855@qq.com - * @Date: - * @LastEditors: wangyang 1147192855@qq.com - * @LastEditTime: 2022-09-29 10:11:54 - * @FilePath: \marking_app\lib\utils\app_upgrade\UpdateDialog.dart - * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE - */ -/* - * @Descripttion: 版本更新提示弹窗 - * @version: - * @Author: wy - * @Date: 2020-07-30 14:03:28 - * @LastEditors: Please set LastEditors - * @LastEditTime: 2021-01-12 15:08:43 - */ -import 'package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart'; -import 'package:get/get.dart'; -import 'package:making_school_asignment_app/common/utils/app_upgrade/DownloadApk.dart'; -import 'package:making_school_asignment_app/common/utils/app_upgrade/UpgradePermission.dart'; -import 'package:making_school_asignment_app/common/utils/app_upgrade/upgradeLogic.dart'; -import 'package:making_school_asignment_app/common/utils/utils.dart'; -import 'package:making_school_asignment_app/page/global_widget/my_text.dart'; -import 'package:percent_indicator/linear_percent_indicator.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:url_launcher/url_launcher.dart'; -import 'package:url_launcher/url_launcher_string.dart'; - -import '../anti_shake_throttling.dart'; -import 'model/UpdateAppEvent.dart'; - -class UpdateDialog extends Dialog { - final UpdateAppEvent updateAppEvent; - final String deviceInfo; - - const UpdateDialog({super.key, required this.updateAppEvent, required this.deviceInfo}); - - @override - Widget build(BuildContext context) { - return Center( - child: Container( - width: isPad() ? ScreenUtil().screenWidth * 0.62 : 319.w, - height: 440.h, - padding: EdgeInsets.symmetric(vertical: 8.h), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(18.sp), - image: const DecorationImage( - alignment: Alignment.topCenter, - image: AssetImage("assets/images/upgrade_dialog_bgc.png"), - fit: BoxFit.fitWidth, - ), - ), - child: Column( - children: [ - Expanded( - child: ListView( - physics: const BouncingScrollPhysics(), - padding: EdgeInsets.fromLTRB(16.w, 0, 16.w, 0), - children: [ - Container( - alignment: Alignment.center, - margin: EdgeInsets.only(top:isPad()? 136.h : 128.h, bottom: 10.h), - child: quickText( - updateAppEvent.title, - size: 18.sp, - fontWeight: FontWeight.w600, - color: const Color.fromRGBO(58, 90, 159, 1), - ), - ), - HtmlWidget( - updateAppEvent.description, - customStylesBuilder: (element) { - return {'color': '#666666', 'font-weight': 'normal', 'text-decoration': 'none'}; - }, - onLoadingBuilder: (context, element, loadingProgress) => const CircularProgressIndicator(), - renderMode: RenderMode.column, - textStyle: TextStyle(fontSize: 14.sp, color: Colors.black87), - ) - ], - ), - ), - DownloadProgress(), - DownloadButton(updateAppEvent, deviceInfo: deviceInfo), - ], - ), - ), - ); - } - - // 调起 - static showUpdateDialog(BuildContext context, UpdateAppEvent updateAppEvent) { - return showDialog( - barrierDismissible: false, - context: context, - builder: (BuildContext context) { - return WillPopScope( - onWillPop: () async => false, - child: UpdateDialog(updateAppEvent: updateAppEvent, deviceInfo: updateAppEvent.deviceInfo), - ); - }, - ); - } -} - -// 进度条 -class DownloadProgress extends StatelessWidget { - DownloadProgress({super.key}); - final logic = Get.find(); - - @override - Widget build(BuildContext context) { - return Obx(() { - var str = (logic.downloadRatio.value * 100).toString().split('.')[0]; - if (logic.downloadRatio.value <= 0) return Container(); - return Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - LinearPercentIndicator( - alignment: MainAxisAlignment.center, - width: isPad() ? ScreenUtil().screenWidth * 0.55 : 245.w, - animation: false, - lineHeight: 20.0.h, - percent: logic.downloadRatio.value, - center: quickText( - "$str%", - size: 14.sp, - align: TextAlign.center, - color: Colors.white, - ), - linearStrokeCap: LinearStrokeCap.roundAll, - progressColor: Theme.of(context).primaryColor, - ), - Container( - height: 6.h, - ), - quickText('更新中...', size: 12.sp, fontWeight: FontWeight.w500, color: const Color.fromRGBO(90, 90, 90, 1)) - ], - ); - }); - } -} - -// 点击下载按钮 -class DownloadButton extends StatelessWidget { - final UpdateAppEvent updateAppEvent; - final String deviceInfo; - DownloadButton(this.updateAppEvent, {required this.deviceInfo, super.key}); - final logic = Get.find(); - - // 打开浏览器或者对应的对应市场进行下载 - Future toLaunch(UpdateAppEvent data) async { - var uri = Uri.parse('market://details?id=${updateAppEvent.packageName}'); - if (await canLaunchUrl(uri)) { - // 跳进对应的应用市场进行更新操作 - return await launchUrl(uri); - } - // 无法进入应用市场就打开浏览器进行下载 - uri = Uri.parse(data.link); - if (await canLaunchUrl(uri)) return await launchUrl(uri); - return false; - } - - @override - Widget build(BuildContext context) { - return Obx(() { - final count = logic.downloadRatio.value; - if (count > 0) return Container(); - var primaryColor = Theme.of(context).primaryColor; - - if (updateAppEvent.equipment == Equipment.windows) { - return SizedBox( - child: quickText('若没有弹出更新弹框,可关闭APP重新打开执行更新...', size: 16.sp), - ); - } - - return Container( - height: 38.h, - width: isPad() ? ScreenUtil().screenWidth * 0.45 : 245.w, - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(42.h)), - gradient: LinearGradient(colors: [primaryColor, primaryColor.withOpacity(0.7)]), - ), - child: MaterialButton( - onPressed: () => easyThrottle('DownloadButton_App_Upgrade', duration: const Duration(milliseconds: 1000), () async { - if (deviceInfo == "android" && updateAppEvent.equipment == Equipment.android) { - // 权限检查 判断是否有读写内存的权限 - bool flag = await UpgradePermission(updateAppEvent.deviceInfo).checkPermission(context, updateAppEvent); - if (flag) { - flag = await DownloadApk.installApk(context, updateAppEvent, logic); - if (!flag) { - print('执行到了重置更新按钮的地方....'); - logic.downloadRatio.value = 0.0; // 更新失败重置 更新按钮 - } else { - print('更新成功重新打开APP..............'); - RestartWidget.restartApp(context); // 安装成功 重启APP - } - return; - } - // await FlutterClipboard.copy(updateAppEvent.link); - // setTimeOut(1000, () => ToastUtils.showInfo('下载链接已经复制到设备,可前往浏览器下载安装')); - } else if (deviceInfo == "ios" && updateAppEvent.equipment == Equipment.ios) { - try { - print(updateAppEvent.link); - await launchUrlString(updateAppEvent.link); - } catch (e) { - print('进来更新报错$e'); - } - } - // else if (deviceInfo == 'windows' && updateAppEvent.equipment == Equipment.windows) { - // await autoUpdater.setFeedURL(updateAppEvent.link); - // await autoUpdater.checkForUpdates(); - // await autoUpdater.setScheduledCheckInterval(0); - // } - }), - child: quickText(!logic.loadingApk.value ? '立即体验' : '正在下载...', size: 16.sp, color: Colors.white, fontWeight: FontWeight.w500), - ), - ); - }); - } -} diff --git a/making_school_asignment_app/lib/common/utils/app_upgrade/UpgradePermission.dart b/making_school_asignment_app/lib/common/utils/app_upgrade/UpgradePermission.dart deleted file mode 100644 index eb95444..0000000 --- a/making_school_asignment_app/lib/common/utils/app_upgrade/UpgradePermission.dart +++ /dev/null @@ -1,143 +0,0 @@ -/* - * @Descripttion: 获取本地权限 - * @version: UpgradePermission - * @Author: wy - * @Date: 2020-07-30 15:41:39 - * @LastEditors: wangyang 1147192855@qq.com - * @LastEditTime: 2022-08-01 14:08:57 - */ -import 'package:app_installer/app_installer.dart'; -import 'package:flutter/material.dart'; -import 'package:permission_handler/permission_handler.dart'; -import 'package:url_launcher/url_launcher.dart'; - -import 'model/UpdateAppEvent.dart'; - -class UpgradePermission { - final String _flatform; - const UpgradePermission(this._flatform); - - /// 检查是否有权限,用于安卓 - /// noExecutions 执行次数 - Future checkPermission(BuildContext context, UpdateAppEvent updateAppEvent, [int? noExecutions]) async { - noExecutions ??= 1; - if (_flatform != 'android') return true; // 非安卓 - var status = await Permission.storage.request(); - if (status.isGranted) return true; - - if (status.isDenied) { - // 普通拒绝 可以再进行提示 - - await showDialog( - context: context, - barrierDismissible: false, - builder: (BuildContext context) { - return AlertDialog( - title: const Text("权限提示"), - content: const Text("无法获取存储权限,请同意获取设备存储权限"), - actions: [ - MaterialButton( - color: Theme.of(context).primaryColor, - child: const Text("同意", style: TextStyle(color: Colors.white)), - onPressed: () => Navigator.of(context).pop(), - ), - ], - ); - }, - ); - - if (noExecutions < 2) return checkPermission(context, updateAppEvent, ++noExecutions); - // 执行次数大于2次,就不再询问直接打开设置权限页面(防止某些机型不会弹起权限询问交互弹框) - } - - // 拒绝并不再提示 - bool? res = await showDialog( - context: context, - barrierDismissible: false, - builder: (BuildContext context) { - return AlertDialog( - title: const Text("权限提示"), - content: const Text("储存权限被永久拒绝,并且不再提示。请前往设置页面同意储存权限"), - actions: [ - MaterialButton( - color: Colors.green.shade900, - child: const Text("其它方式更新", style: TextStyle(color: Colors.white)), - onPressed: () => Navigator.of(context).pop(false), - ), - MaterialButton( - color: Theme.of(context).primaryColor, - child: const Text("前往设置", style: TextStyle(color: Colors.white)), - onPressed: () => Navigator.of(context).pop(true), - ), - ], - ); - }, - ); - if (res == null || !res) { - // 其他方式下载 - // await SystemNavigator.pop(); // 退出APP - var options = ['应用市场更新APP', '浏览器下载并安装APP']; - var uri = Uri.parse('market://details?id=${updateAppEvent.packageName}'); // 应用市场URI - // if (!await canLaunchUrl(uri)) options.removeAt(0); // 如果不能打开应用市场 就屏蔽掉 这个安装方式 - String? option = await showCustomModalBottomSheet(context, options); - if (option == '应用市场更新APP') { - if (await canLaunchUrl(uri)) { - await launchUrl(uri); - } else { - await AppInstaller.goStore(updateAppEvent.packageName, 'iOSAppId'); - } - } - if (option == '浏览器下载并安装APP') await launchUrl(Uri.parse(updateAppEvent.link)); - } else - await openAppSettings(); - return false; - } - - // 其他方式下载选择 - static Future showCustomModalBottomSheet(context, List options) async { - return showModalBottomSheet( - backgroundColor: Colors.transparent, - isScrollControlled: true, - context: context, - builder: (BuildContext context) { - return Container( - clipBehavior: Clip.antiAlias, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.only( - topLeft: const Radius.circular(20.0), - topRight: const Radius.circular(20.0), - ), - ), - height: MediaQuery.of(context).size.height / 4.0, - child: Column(children: [ - SizedBox( - height: 50, - child: Stack( - textDirection: TextDirection.rtl, - children: [ - Center(child: Text('选择其它方式更新APP', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16.0))), - IconButton(icon: Icon(Icons.close), onPressed: () => Navigator.of(context).pop()), - ], - ), - ), - Divider(height: 1.0), - Expanded( - child: ListView.builder( - itemCount: options.length, - itemBuilder: (BuildContext context, int index) { - var name = options[index]; - return ListTile( - title: Text(name), - trailing: Icon(name.contains('浏览器') ? Icons.browser_updated_outlined : Icons.local_grocery_store_outlined), - onTap: () => Navigator.of(context).pop(name), - ); - }, - ), - ), - ]), - ); - }, - ); - } -} diff --git a/making_school_asignment_app/lib/common/utils/app_upgrade/model/UpdateAppEvent.dart b/making_school_asignment_app/lib/common/utils/app_upgrade/model/UpdateAppEvent.dart deleted file mode 100644 index da3fbf3..0000000 --- a/making_school_asignment_app/lib/common/utils/app_upgrade/model/UpdateAppEvent.dart +++ /dev/null @@ -1,83 +0,0 @@ -/* - * @Descripttion: - * @version: - * @Author: wy - * @Date: 2020-07-30 14:10:44 - * @LastEditors: wangyang 1147192855@qq.com - * @LastEditTime: 2022-09-28 18:20:11 - */ - -class UpdateAppEvent { - final String version; - final String title; - final String description; - final String link; - final bool upgrade; - final String deviceInfo; - final String appName; - final String packageName; - final Equipment equipment; - num? v; - num? lv; - - UpdateAppEvent({ - required this.version, - required this.title, - required this.description, - required this.link, - required this.upgrade, - required this.deviceInfo, - required this.appName, - required this.packageName, - this.v, - this.lv, - int type = 0, - }) : equipment = Equipment.values[type]; - - factory UpdateAppEvent.fromJson(Map json, String localVersion, String deviceInfo, String appName, String packageName, - {String keyStr = "version", String typeName = "packageNameType"}) { - String version = json[keyStr]; // 版本号 - String? descriptionStr = json["description"]; - - String newDescription = '系统有更新,请立即下载'; - bool upgrade = false; - num? v; - num? lv; - // 版本号 - if (version != '') { - v = num.parse(version.replaceAll(".", "")); - lv = num.parse(localVersion.replaceAll(".", "")); - - // if (lv < v) upgrade = true; - //当前版本不等于线上版本更新为线上版本 - if (lv != v) upgrade = true; - } - - // 升级说明 - if (descriptionStr != null && descriptionStr.isNotEmpty) { - newDescription = descriptionStr; - } - - return UpdateAppEvent( - version: version, // 版本号 - title: json["title"] ?? "发现新版本", // title - description: newDescription, //说明 - link: json["downloadPath"]??'', // 链接地址 - upgrade: upgrade, - deviceInfo: deviceInfo, - appName: appName, - packageName: packageName, - type: json[typeName] ?? 0, - v: v, - lv: lv, - ); - } - - @override - String toString() { - return "UpdateAppEvent { version: $version, title: $title, description: $description, link: $link}"; - } -} - -// 设备枚举 -enum Equipment { other, android, ios, windows } diff --git a/making_school_asignment_app/lib/common/utils/app_upgrade/upgradeLogic.dart b/making_school_asignment_app/lib/common/utils/app_upgrade/upgradeLogic.dart deleted file mode 100644 index 34ab6aa..0000000 --- a/making_school_asignment_app/lib/common/utils/app_upgrade/upgradeLogic.dart +++ /dev/null @@ -1,156 +0,0 @@ -import 'dart:io'; -import 'package:device_info_plus/device_info_plus.dart'; -import 'package:flutter/widgets.dart'; -import 'package:get/get.dart'; -import 'package:making_school_asignment_app/common/job/app_version.dart'; -import 'package:making_school_asignment_app/common/mixins/request_tool_mixin.dart'; -import 'package:making_school_asignment_app/common/store/user_store.dart'; -import 'package:making_school_asignment_app/common/utils/permission_describe_util.dart'; -import 'package:package_info_plus/package_info_plus.dart'; -import 'package:permission_handler/permission_handler.dart'; - -import 'UpdateDialog.dart'; -import 'model/UpdateAppEvent.dart'; - -class UpgradeLogic extends GetxController with RequestToolMixin { - Rx showUpgrade = false.obs; // 是否已经显示升级弹窗 - Rx loadingApk = false.obs; // 是否已经显示升级弹窗 - Rx downloadRatio = 0.0.obs; // 下载比例 - - // @override - // void onInit() { - - // super.onInit(); - // } - - Future getUpdateAppEvent() async { - // 获取设备信息 - String deviceInfo; - int deviceType; - if (Platform.isAndroid) { - deviceInfo = "android"; - deviceType = 1; - } else if (Platform.isIOS) { - deviceInfo = "ios"; - deviceType = 2; - } else if (Platform.isWindows) { - deviceInfo = "windows"; - deviceType = 3; - } else { - return null; - } - - AppVersion? result = await getClient().getLastAppVersion('making_school_asignment_app', deviceType); - if (result == null) return null; - - //获取当前版本 - PackageInfo packageInfo = await PackageInfo.fromPlatform(); - //获取当前版本 - String localVersion = packageInfo.version; - String appName = packageInfo.appName; //应用名称 - String packageName = packageInfo.packageName; //包名称 - // String buildNumber = packageInfo.buildNumber; //小版本号 - - Map json = { - 'downloadPath': Platform.isWindows ? '' : result.appFileUrl, - 'version': result.version, - 'systemType': deviceType, - 'description': result.description ?? 'APP新版本更新', - }; - return UpdateAppEvent.fromJson(json, localVersion, deviceInfo, appName, packageName, typeName: 'systemType'); - } - - Future getAppUpgrade(BuildContext context) async { - if (!const bool.fromEnvironment('dart.vm.product')) return; - - try { - showUpgrade.value = true; - - final names = [ - UserStore.to.userDetailInfo.value?.name, - UserStore.to.userDetailInfo.value?.account, - ].whereType().where((name) => name.isNotEmpty).toList(); - if (names.contains('AppleTester')) return; - - UpdateAppEvent? updateAppEvent = await getUpdateAppEvent(); - if (updateAppEvent != null && updateAppEvent.upgrade) { - if (Platform.isAndroid) { - DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin(); - AndroidDeviceInfo androidInfo = await deviceInfoPlugin.androidInfo; - Permission storagePermission; - if (androidInfo.version.sdkInt >= 33) { - storagePermission = Permission.manageExternalStorage; - } else { - storagePermission = Permission.storage; - } - await PermissionDescribeUtil.instance.toLaunchPermissionRequest( - Get.context ?? context, - title: '储存权限请求', - describe: "为了提供更好的服务,需要获取到存储权限用于保存APP升级文件APK,进行升级", - permissions: [storagePermission], - ); - } - - await UpdateDialog.showUpdateDialog( - Get.context ?? context, - updateAppEvent, - ); - } - /** - // 获取设备信息 - String deviceInfo; - int deviceType; - if (Platform.isAndroid) { - deviceInfo = "android"; - deviceType = 1; - } else if (Platform.isIOS) { - deviceInfo = "ios"; - deviceType = 2; - } else if (Platform.isWindows) { - deviceInfo = "windows"; - deviceType = 3; - } else { - return false; - } - - if (result != null) { - //获取当前版本 - PackageInfo packageInfo = await PackageInfo.fromPlatform(); - //获取当前版本 - String localVersion = packageInfo.version; - String appName = packageInfo.appName; //应用名称 - String packageName = packageInfo.packageName; //包名称 - // String buildNumber = packageInfo.buildNumber; //小版本号 - - Map json = {'downloadPath': Platform.isWindows ? '' : result.appFileUrl, 'version': result.version, 'systemType': deviceType, 'description': result.description ?? 'APP新版本更新'}; - UpdateAppEvent updateAppEvent = UpdateAppEvent.fromJson(json, localVersion, deviceInfo, appName, packageName, typeName: 'systemType'); - if (updateAppEvent.upgrade) { - if (Platform.isAndroid) { - DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin(); - AndroidDeviceInfo androidInfo = await deviceInfoPlugin.androidInfo; - Permission storagePermission; - if (androidInfo.version.sdkInt >= 33) { - storagePermission = Permission.manageExternalStorage; - } else { - storagePermission = Permission.storage; - } - await PermissionDescribeUtil.instance.toLaunchPermissionRequest( - Get.context ?? context, - title: '储存权限请求', - describe: "为了提供更好的服务,需要获取到存储权限用于保存APP升级文件APK,进行升级", - permissions: [storagePermission], - ); - } - - await UpdateDialog.showUpdateDialog( - Get.context ?? context, - updateAppEvent, - ); - } - } - */ - } finally { - showUpgrade.value = false; - } - } -} diff --git a/making_school_asignment_app/lib/main.dart b/making_school_asignment_app/lib/main.dart index 12dc883..0b0177b 100644 --- a/making_school_asignment_app/lib/main.dart +++ b/making_school_asignment_app/lib/main.dart @@ -16,12 +16,13 @@ import 'package:making_school_asignment_app/common/utils/utils.dart'; import 'package:making_school_asignment_app/routes/app_pages.dart'; import 'common/config/request_config.dart'; -import 'common/utils/app_upgrade/upgradeLogic.dart'; +import 'common/controllers/upgrade_logic.dart'; void main() async { // 在测试模式下运行Get Get.testMode = true; - FlutterNativeSplash.preserve(widgetsBinding: WidgetsFlutterBinding.ensureInitialized()); + FlutterNativeSplash.preserve( + widgetsBinding: WidgetsFlutterBinding.ensureInitialized()); /// 初始化本地存储 await Get.putAsync(() => StorageService.init()); @@ -31,7 +32,8 @@ void main() async { // Windows if (Platform.isWindows) { - String feedURL = '${RequestConfig.imgUrl}infra-app/making_school_asignment_app/3/appcast.xml'; + String feedURL = + '${RequestConfig.imgUrl}infra-app/making_school_asignment_app/3/appcast.xml'; await autoUpdater.setFeedURL(feedURL); await autoUpdater.checkForUpdates(); await autoUpdater.setScheduledCheckInterval(3600); @@ -41,11 +43,14 @@ void main() async { statusBarColor: Colors.transparent, //状态栏背景颜色 statusBarIconBrightness: Brightness.light // dark:一般显示黑色 light:一般显示白色 )); - SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky, overlays: [SystemUiOverlay.top]); // 屏幕刘海 - await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); // 屏幕强制竖屏 + SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky, + overlays: [SystemUiOverlay.top]); // 屏幕刘海 + await SystemChrome.setPreferredOrientations( + [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); // 屏幕强制竖屏 runApp(const MyApp()); - Future.delayed(const Duration(seconds: 3), () => FlutterNativeSplash.remove()); + Future.delayed( + const Duration(seconds: 3), () => FlutterNativeSplash.remove()); } class MyApp extends StatelessWidget { @@ -127,9 +132,11 @@ class MyApp extends StatelessWidget { builder: (context, child) { return MediaQuery( //Setting font does not change with system font size - data: MediaQuery.of(context).copyWith(textScaler: const TextScaler.linear(1.0)), + data: MediaQuery.of(context) + .copyWith(textScaler: const TextScaler.linear(1.0)), child: Scaffold( - body: GestureDetector(onTap: () => Utils.hideKeyboard(), child: child), + body: GestureDetector( + onTap: () => Utils.hideKeyboard(), child: child), ), ); }, diff --git a/making_school_asignment_app/lib/page/global_widget/start_page.dart b/making_school_asignment_app/lib/page/global_widget/start_page.dart index b49fad6..5d095ce 100644 --- a/making_school_asignment_app/lib/page/global_widget/start_page.dart +++ b/making_school_asignment_app/lib/page/global_widget/start_page.dart @@ -9,7 +9,6 @@ import 'package:making_school_asignment_app/common/job/user_info.dart'; import 'package:making_school_asignment_app/common/job/user_info_detail.dart'; import 'package:making_school_asignment_app/common/mixins/request_tool_mixin.dart'; import 'package:making_school_asignment_app/common/store/user_store.dart'; -import 'package:making_school_asignment_app/common/utils/app_upgrade/upgradeLogic.dart'; import 'package:making_school_asignment_app/common/utils/storage.dart'; import 'package:making_school_asignment_app/common/utils/toast_utils.dart'; import 'package:making_school_asignment_app/page/home_page/children/my_info.dart'; @@ -24,11 +23,8 @@ class StartPage extends StatefulWidget { } class _StartPageState extends State with RequestToolMixin { - Timer? _timer; - Timer? _timerPermission; DateTime? lastPopTime; final _pageController = Get.find(); - final _upgradeLogic = Get.find(); late final List _bodyList; @@ -38,26 +34,12 @@ class _StartPageState extends State with RequestToolMixin { // const WorkPage(), _bodyList = [const HomePage(), const MyInfo()]; - // APP 启动后就直接更新 - WidgetsBinding.instance.addPostFrameCallback((e) { - /// 首页用户未更新不进行更新判断,没有登陆的用户在登陆页面和40秒回调中检查弹出更新APP - if (!_upgradeLogic.showUpgrade.value && UserStore.to.userDetailInfo.value != null) - _upgradeLogic.getAppUpgrade(context); - }); - _timer?.cancel(); - _timer = Timer.periodic(const Duration(seconds: 40), (e) { - if (Get.currentRoute == Routes.login) return; // 在登录页面不更新APP - if (!_upgradeLogic.showUpgrade.value) _upgradeLogic.getAppUpgrade(context); - }); String? token = UserStore.to.token; UserInfo? userInfo = UserStore.to.userInfo.value; UserInfoDetail? userInfoDetail = UserStore.to.userDetailInfo.value; if ((token?.isNotEmpty ?? false) && userInfo != null) { - // Future.delayed(const Duration(milliseconds: 200)).then((e) { - // Get.toNamed(Routes.home); - // }); // 更新用户信息 if (userInfoDetail == null) UserStore.to.updateUserInfo(); } else { @@ -72,8 +54,6 @@ class _StartPageState extends State with RequestToolMixin { @override void dispose() { Get.delete(); - _timer?.cancel(); - _timerPermission?.cancel(); super.dispose(); } @@ -141,7 +121,9 @@ class _StartPageState extends State with RequestToolMixin { }), ), onPopInvokedWithResult: (bool didPop, dynamic result) async { - if (lastPopTime == null || DateTime.now().difference(lastPopTime!) > const Duration(seconds: 1)) { + if (lastPopTime == null || + DateTime.now().difference(lastPopTime!) > + const Duration(seconds: 1)) { lastPopTime = DateTime.now(); ToastUtils.getFluttertoast( context: context, diff --git a/making_school_asignment_app/lib/page/login_page/login_logic.dart b/making_school_asignment_app/lib/page/login_page/login_logic.dart index 37674f3..1ddd471 100644 --- a/making_school_asignment_app/lib/page/login_page/login_logic.dart +++ b/making_school_asignment_app/lib/page/login_page/login_logic.dart @@ -4,8 +4,7 @@ import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:get/get.dart'; import 'package:making_school_asignment_app/common/mixins/request_tool_mixin.dart'; import 'package:making_school_asignment_app/common/store/user_store.dart'; -import 'package:making_school_asignment_app/common/utils/app_upgrade/model/UpdateAppEvent.dart'; -import 'package:making_school_asignment_app/common/utils/app_upgrade/upgradeLogic.dart'; +import 'package:making_school_asignment_app/common/controllers/upgrade_logic.dart'; import 'package:making_school_asignment_app/common/utils/storage.dart'; import 'package:making_school_asignment_app/common/utils/toast_utils.dart'; import 'package:making_school_asignment_app/common/utils/utils.dart'; @@ -35,7 +34,7 @@ class LoginLogic extends GetxController with RequestToolMixin { } // state.userNameController.text = "AppleTester"; // state.passwordController.text = "AppleTester123!"; - + // state.userNameController.text = "SZJY200504252"; // state.passwordController.text = "504252"; @@ -67,9 +66,11 @@ class LoginLogic extends GetxController with RequestToolMixin { void toMsg(msg, [bool error = true]) { if (error) { - WidgetsBinding.instance.addPostFrameCallback((_) => ToastUtils.showError(msg)); + WidgetsBinding.instance + .addPostFrameCallback((_) => ToastUtils.showError(msg)); } else { - WidgetsBinding.instance.addPostFrameCallback((_) => ToastUtils.showInfo(msg)); + WidgetsBinding.instance + .addPostFrameCallback((_) => ToastUtils.showInfo(msg)); } state.canLogin.value = true; } @@ -87,15 +88,6 @@ class LoginLogic extends GetxController with RequestToolMixin { EasyLoading.show(status: 'loading...'); try { - /// 检查升级APP - if (userName != 'AppleTester' && const bool.fromEnvironment('dart.vm.product')) { - UpdateAppEvent? updateAppEvent = await upgradeLogic.getUpdateAppEvent(); - var upgrade = updateAppEvent?.upgrade ?? false; - if (upgrade) { - upgradeLogic.getAppUpgrade(Get.context ?? context); - return toMsg('请在升级APP后再次登陆', false); - } - } await getClient().toLogin(userName, userPwd); String? nameidentifier = UserStore.to.userInfo.value?.nameidentifier; if (nameidentifier == null) { diff --git a/making_school_asignment_app/lib/page/login_page/login_view.dart b/making_school_asignment_app/lib/page/login_page/login_view.dart index a38b8bf..d2941bd 100644 --- a/making_school_asignment_app/lib/page/login_page/login_view.dart +++ b/making_school_asignment_app/lib/page/login_page/login_view.dart @@ -4,7 +4,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:making_school_asignment_app/common/const_text.dart'; import 'package:making_school_asignment_app/common/utils/anti_shake_throttling.dart'; -import 'package:making_school_asignment_app/common/utils/app_upgrade/upgradeLogic.dart'; +import 'package:making_school_asignment_app/common/controllers/upgrade_logic.dart'; import 'package:making_school_asignment_app/common/utils/utils.dart'; import 'package:making_school_asignment_app/page/global_widget/my_text.dart'; import 'package:making_school_asignment_app/routes/app_pages.dart'; @@ -157,9 +157,7 @@ class _LoginPageState extends State { ), ), ), - SizedBox( - height: 20.r, - ), + SizedBox(height: 20.r), Obx(() { return Container( padding: EdgeInsets.symmetric(horizontal: 15.w), diff --git a/making_school_asignment_app/linux/.gitignore b/making_school_asignment_app/linux/.gitignore deleted file mode 100644 index d3896c9..0000000 --- a/making_school_asignment_app/linux/.gitignore +++ /dev/null @@ -1 +0,0 @@ -flutter/ephemeral diff --git a/making_school_asignment_app/linux/CMakeLists.txt b/making_school_asignment_app/linux/CMakeLists.txt deleted file mode 100644 index 068efa5..0000000 --- a/making_school_asignment_app/linux/CMakeLists.txt +++ /dev/null @@ -1,145 +0,0 @@ -# Project-level configuration. -cmake_minimum_required(VERSION 3.10) -project(runner LANGUAGES CXX) - -# The name of the executable created for the application. Change this to change -# the on-disk name of your application. -set(BINARY_NAME "making_school_asignment_app") -# The unique GTK application identifier for this application. See: -# https://wiki.gnome.org/HowDoI/ChooseApplicationID -set(APPLICATION_ID "com.yuanxuan.making_school_asignment_app") - -# Explicitly opt in to modern CMake behaviors to avoid warnings with recent -# versions of CMake. -cmake_policy(SET CMP0063 NEW) - -# Load bundled libraries from the lib/ directory relative to the binary. -set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") - -# Root filesystem for cross-building. -if(FLUTTER_TARGET_PLATFORM_SYSROOT) - set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) - set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) - set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) - set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) - set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) - set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) -endif() - -# Define build configuration options. -if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - set(CMAKE_BUILD_TYPE "Debug" CACHE - STRING "Flutter build mode" FORCE) - set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS - "Debug" "Profile" "Release") -endif() - -# Compilation settings that should be applied to most targets. -# -# Be cautious about adding new options here, as plugins use this function by -# default. In most cases, you should add new options to specific targets instead -# of modifying this function. -function(APPLY_STANDARD_SETTINGS TARGET) - target_compile_features(${TARGET} PUBLIC cxx_std_14) - target_compile_options(${TARGET} PRIVATE -Wall -Werror) - target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") - target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") -endfunction() - -# Flutter library and tool build rules. -set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") -add_subdirectory(${FLUTTER_MANAGED_DIR}) - -# System-level dependencies. -find_package(PkgConfig REQUIRED) -pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) - -add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") - -# Define the application target. To change its name, change BINARY_NAME above, -# not the value here, or `flutter run` will no longer work. -# -# Any new source files that you add to the application should be added here. -add_executable(${BINARY_NAME} - "main.cc" - "my_application.cc" - "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" -) - -# Apply the standard set of build settings. This can be removed for applications -# that need different build settings. -apply_standard_settings(${BINARY_NAME}) - -# Add dependency libraries. Add any application-specific dependencies here. -target_link_libraries(${BINARY_NAME} PRIVATE flutter) -target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) - -# Run the Flutter tool portions of the build. This must not be removed. -add_dependencies(${BINARY_NAME} flutter_assemble) - -# Only the install-generated bundle's copy of the executable will launch -# correctly, since the resources must in the right relative locations. To avoid -# people trying to run the unbundled copy, put it in a subdirectory instead of -# the default top-level location. -set_target_properties(${BINARY_NAME} - PROPERTIES - RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" -) - - -# Generated plugin build rules, which manage building the plugins and adding -# them to the application. -include(flutter/generated_plugins.cmake) - - -# === Installation === -# By default, "installing" just makes a relocatable bundle in the build -# directory. -set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") -if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) -endif() - -# Start with a clean build bundle directory every time. -install(CODE " - file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") - " COMPONENT Runtime) - -set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") -set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") - -install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" - COMPONENT Runtime) - -install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" - COMPONENT Runtime) - -install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) - -foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) - install(FILES "${bundled_library}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -endforeach(bundled_library) - -# Copy the native assets provided by the build.dart from all packages. -set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") -install(DIRECTORY "${NATIVE_ASSETS_DIR}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) - -# Fully re-copy the assets directory on each build to avoid having stale files -# from a previous install. -set(FLUTTER_ASSET_DIR_NAME "flutter_assets") -install(CODE " - file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") - " COMPONENT Runtime) -install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" - DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) - -# Install the AOT library on non-Debug builds only. -if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") - install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -endif() diff --git a/making_school_asignment_app/linux/flutter/CMakeLists.txt b/making_school_asignment_app/linux/flutter/CMakeLists.txt deleted file mode 100644 index d5bd016..0000000 --- a/making_school_asignment_app/linux/flutter/CMakeLists.txt +++ /dev/null @@ -1,88 +0,0 @@ -# This file controls Flutter-level build steps. It should not be edited. -cmake_minimum_required(VERSION 3.10) - -set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") - -# Configuration provided via flutter tool. -include(${EPHEMERAL_DIR}/generated_config.cmake) - -# TODO: Move the rest of this into files in ephemeral. See -# https://github.com/flutter/flutter/issues/57146. - -# Serves the same purpose as list(TRANSFORM ... PREPEND ...), -# which isn't available in 3.10. -function(list_prepend LIST_NAME PREFIX) - set(NEW_LIST "") - foreach(element ${${LIST_NAME}}) - list(APPEND NEW_LIST "${PREFIX}${element}") - endforeach(element) - set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) -endfunction() - -# === Flutter Library === -# System-level dependencies. -find_package(PkgConfig REQUIRED) -pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) -pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) -pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) - -set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") - -# Published to parent scope for install step. -set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) -set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) -set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) -set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) - -list(APPEND FLUTTER_LIBRARY_HEADERS - "fl_basic_message_channel.h" - "fl_binary_codec.h" - "fl_binary_messenger.h" - "fl_dart_project.h" - "fl_engine.h" - "fl_json_message_codec.h" - "fl_json_method_codec.h" - "fl_message_codec.h" - "fl_method_call.h" - "fl_method_channel.h" - "fl_method_codec.h" - "fl_method_response.h" - "fl_plugin_registrar.h" - "fl_plugin_registry.h" - "fl_standard_message_codec.h" - "fl_standard_method_codec.h" - "fl_string_codec.h" - "fl_value.h" - "fl_view.h" - "flutter_linux.h" -) -list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") -add_library(flutter INTERFACE) -target_include_directories(flutter INTERFACE - "${EPHEMERAL_DIR}" -) -target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") -target_link_libraries(flutter INTERFACE - PkgConfig::GTK - PkgConfig::GLIB - PkgConfig::GIO -) -add_dependencies(flutter flutter_assemble) - -# === Flutter tool backend === -# _phony_ is a non-existent file to force this command to run every time, -# since currently there's no way to get a full input/output list from the -# flutter tool. -add_custom_command( - OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} - ${CMAKE_CURRENT_BINARY_DIR}/_phony_ - COMMAND ${CMAKE_COMMAND} -E env - ${FLUTTER_TOOL_ENVIRONMENT} - "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" - ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} - VERBATIM -) -add_custom_target(flutter_assemble DEPENDS - "${FLUTTER_LIBRARY}" - ${FLUTTER_LIBRARY_HEADERS} -) diff --git a/making_school_asignment_app/linux/flutter/generated_plugin_registrant.cc b/making_school_asignment_app/linux/flutter/generated_plugin_registrant.cc deleted file mode 100644 index f6f23bf..0000000 --- a/making_school_asignment_app/linux/flutter/generated_plugin_registrant.cc +++ /dev/null @@ -1,15 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#include "generated_plugin_registrant.h" - -#include - -void fl_register_plugins(FlPluginRegistry* registry) { - g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); - url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); -} diff --git a/making_school_asignment_app/linux/flutter/generated_plugin_registrant.h b/making_school_asignment_app/linux/flutter/generated_plugin_registrant.h deleted file mode 100644 index e0f0a47..0000000 --- a/making_school_asignment_app/linux/flutter/generated_plugin_registrant.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#ifndef GENERATED_PLUGIN_REGISTRANT_ -#define GENERATED_PLUGIN_REGISTRANT_ - -#include - -// Registers Flutter plugins. -void fl_register_plugins(FlPluginRegistry* registry); - -#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/making_school_asignment_app/linux/flutter/generated_plugins.cmake b/making_school_asignment_app/linux/flutter/generated_plugins.cmake deleted file mode 100644 index f16b4c3..0000000 --- a/making_school_asignment_app/linux/flutter/generated_plugins.cmake +++ /dev/null @@ -1,24 +0,0 @@ -# -# Generated file, do not edit. -# - -list(APPEND FLUTTER_PLUGIN_LIST - url_launcher_linux -) - -list(APPEND FLUTTER_FFI_PLUGIN_LIST -) - -set(PLUGIN_BUNDLED_LIBRARIES) - -foreach(plugin ${FLUTTER_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) - target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) - list(APPEND PLUGIN_BUNDLED_LIBRARIES $) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) -endforeach(plugin) - -foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) -endforeach(ffi_plugin) diff --git a/making_school_asignment_app/linux/main.cc b/making_school_asignment_app/linux/main.cc deleted file mode 100644 index e7c5c54..0000000 --- a/making_school_asignment_app/linux/main.cc +++ /dev/null @@ -1,6 +0,0 @@ -#include "my_application.h" - -int main(int argc, char** argv) { - g_autoptr(MyApplication) app = my_application_new(); - return g_application_run(G_APPLICATION(app), argc, argv); -} diff --git a/making_school_asignment_app/linux/my_application.cc b/making_school_asignment_app/linux/my_application.cc deleted file mode 100644 index dcfcc75..0000000 --- a/making_school_asignment_app/linux/my_application.cc +++ /dev/null @@ -1,124 +0,0 @@ -#include "my_application.h" - -#include -#ifdef GDK_WINDOWING_X11 -#include -#endif - -#include "flutter/generated_plugin_registrant.h" - -struct _MyApplication { - GtkApplication parent_instance; - char** dart_entrypoint_arguments; -}; - -G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) - -// Implements GApplication::activate. -static void my_application_activate(GApplication* application) { - MyApplication* self = MY_APPLICATION(application); - GtkWindow* window = - GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); - - // Use a header bar when running in GNOME as this is the common style used - // by applications and is the setup most users will be using (e.g. Ubuntu - // desktop). - // If running on X and not using GNOME then just use a traditional title bar - // in case the window manager does more exotic layout, e.g. tiling. - // If running on Wayland assume the header bar will work (may need changing - // if future cases occur). - gboolean use_header_bar = TRUE; -#ifdef GDK_WINDOWING_X11 - GdkScreen* screen = gtk_window_get_screen(window); - if (GDK_IS_X11_SCREEN(screen)) { - const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); - if (g_strcmp0(wm_name, "GNOME Shell") != 0) { - use_header_bar = FALSE; - } - } -#endif - if (use_header_bar) { - GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); - gtk_widget_show(GTK_WIDGET(header_bar)); - gtk_header_bar_set_title(header_bar, "making_school_asignment_app"); - gtk_header_bar_set_show_close_button(header_bar, TRUE); - gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); - } else { - gtk_window_set_title(window, "making_school_asignment_app"); - } - - gtk_window_set_default_size(window, 1280, 720); - gtk_widget_show(GTK_WIDGET(window)); - - g_autoptr(FlDartProject) project = fl_dart_project_new(); - fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); - - FlView* view = fl_view_new(project); - gtk_widget_show(GTK_WIDGET(view)); - gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); - - fl_register_plugins(FL_PLUGIN_REGISTRY(view)); - - gtk_widget_grab_focus(GTK_WIDGET(view)); -} - -// Implements GApplication::local_command_line. -static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { - MyApplication* self = MY_APPLICATION(application); - // Strip out the first argument as it is the binary name. - self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); - - g_autoptr(GError) error = nullptr; - if (!g_application_register(application, nullptr, &error)) { - g_warning("Failed to register: %s", error->message); - *exit_status = 1; - return TRUE; - } - - g_application_activate(application); - *exit_status = 0; - - return TRUE; -} - -// Implements GApplication::startup. -static void my_application_startup(GApplication* application) { - //MyApplication* self = MY_APPLICATION(object); - - // Perform any actions required at application startup. - - G_APPLICATION_CLASS(my_application_parent_class)->startup(application); -} - -// Implements GApplication::shutdown. -static void my_application_shutdown(GApplication* application) { - //MyApplication* self = MY_APPLICATION(object); - - // Perform any actions required at application shutdown. - - G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); -} - -// Implements GObject::dispose. -static void my_application_dispose(GObject* object) { - MyApplication* self = MY_APPLICATION(object); - g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); - G_OBJECT_CLASS(my_application_parent_class)->dispose(object); -} - -static void my_application_class_init(MyApplicationClass* klass) { - G_APPLICATION_CLASS(klass)->activate = my_application_activate; - G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; - G_APPLICATION_CLASS(klass)->startup = my_application_startup; - G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; - G_OBJECT_CLASS(klass)->dispose = my_application_dispose; -} - -static void my_application_init(MyApplication* self) {} - -MyApplication* my_application_new() { - return MY_APPLICATION(g_object_new(my_application_get_type(), - "application-id", APPLICATION_ID, - "flags", G_APPLICATION_NON_UNIQUE, - nullptr)); -} diff --git a/making_school_asignment_app/linux/my_application.h b/making_school_asignment_app/linux/my_application.h deleted file mode 100644 index 72271d5..0000000 --- a/making_school_asignment_app/linux/my_application.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef FLUTTER_MY_APPLICATION_H_ -#define FLUTTER_MY_APPLICATION_H_ - -#include - -G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, - GtkApplication) - -/** - * my_application_new: - * - * Creates a new Flutter-based application. - * - * Returns: a new #MyApplication. - */ -MyApplication* my_application_new(); - -#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/making_school_asignment_app/pubspec.yaml b/making_school_asignment_app/pubspec.yaml index 04cf9c4..b6e7d5c 100644 --- a/making_school_asignment_app/pubspec.yaml +++ b/making_school_asignment_app/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.0.7+8 +version: 1.0.8+9 environment: sdk: '>=3.4.1 <4.0.0' @@ -55,7 +55,7 @@ dependencies: # 加密验签插件,支持SHA MD5 HMAC crypto: ^3.0.2 # 获取app版本号 - package_info_plus: ^8.0.0 + package_info_plus: ^9.0.0 # 网络监控 connectivity_plus: ^6.0.3 # toast组件用于系统尚未初始化完成时 @@ -71,15 +71,9 @@ dependencies: url: https://gitea.23544.com/wangyang/zoom_widget.git # url: https://github.com/semakers/zoom-widget.git # ref: a35c9da6afe405c23b5897b449683d424016e9f1 - # TODO 升级插件 暂时不使用 - # app_upgrade_plugin: - # # path: C:\Users\wy\Desktop\my_project\app_upgrade_plugin - # git: - # url: https://gitea.23544.com/wangyang/app_upgrade_plugin.git - # start retrofit请求封装 - retrofit: ^4.1.0 - json_annotation: 4.9.0 - # end retrofit请求封装 + + retrofit: 4.6.0 + json_annotation: ^4.9.0 # 进度条 percent_indicator: ^4.2.3 badges: ^3.1.2 @@ -102,7 +96,7 @@ dependencies: app_installer: ^1.1.0 # auto_updater: ^0.2.1 auto_updater: ^1.0.0 - permission_handler: ^11.3.1 + permission_handler: ^12.0.1 flutter_distributor: 0.6.5 # fastforge: ^0.6.5 flutter_native_splash: ^2.4.6 @@ -110,10 +104,15 @@ dependencies: app_settings: ^5.1.1 device_info_plus: ^11.1.0 auto_size_text: ^3.0.0 + yx_app_upgrade_flutter: + git: + url: https://gitea.23544.com/wangyang/yx_app_upgrade_flutter.git + ref: 2.0.4 dependency_overrides: archive: ^4.0.2 uuid: ^4.4.2 + # analyzer: ^3..0 # meta: ^1.15.0 dev_dependencies: