diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 922170a95..3e1cc5701 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -81,7 +81,6 @@ jobs: - name: Apply Patch shell: pwsh run: lib/scripts/patch.ps1 android - continue-on-error: true - name: Write key if: github.event_name == 'workflow_dispatch' diff --git a/.github/workflows/ios.yml b/.github/workflows/ios.yml index 403bd593c..6f7821625 100644 --- a/.github/workflows/ios.yml +++ b/.github/workflows/ios.yml @@ -33,7 +33,6 @@ jobs: - name: Apply Patch shell: pwsh run: lib/scripts/patch.ps1 iOS - continue-on-error: true - name: Build iOS run: | diff --git a/.github/workflows/linux_x64.yml b/.github/workflows/linux_x64.yml index 65ad9d269..eb2b35ce0 100644 --- a/.github/workflows/linux_x64.yml +++ b/.github/workflows/linux_x64.yml @@ -54,7 +54,6 @@ jobs: - name: Apply Patch shell: pwsh run: lib/scripts/patch.ps1 Linux - continue-on-error: true #TODO: deb and rpm packages need to be build - name: Build Linux diff --git a/.github/workflows/mac.yml b/.github/workflows/mac.yml index f674854ca..2ed0d9581 100644 --- a/.github/workflows/mac.yml +++ b/.github/workflows/mac.yml @@ -33,7 +33,6 @@ jobs: - name: Apply Patch shell: pwsh run: lib/scripts/patch.ps1 macOS - continue-on-error: true - name: Build Mac run: flutter build macos --release --dart-define-from-file=pili_release.json diff --git a/.github/workflows/win_x64.yml b/.github/workflows/win_x64.yml index 07a8112e1..19b967521 100644 --- a/.github/workflows/win_x64.yml +++ b/.github/workflows/win_x64.yml @@ -29,7 +29,6 @@ jobs: - name: Apply Patch shell: pwsh run: lib/scripts/patch.ps1 windows - continue-on-error: true - name: Add fastforge and Inno Setup run: | diff --git a/lib/pages/login/controller.dart b/lib/pages/login/controller.dart index 5a90ba43f..7c2db501f 100644 --- a/lib/pages/login/controller.dart +++ b/lib/pages/login/controller.dart @@ -19,7 +19,6 @@ import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; -import 'package:gt3_flutter_plugin/gt3_flutter_plugin.dart'; class LoginPageController extends GetxController with GetSingleTickerProviderStateMixin { @@ -34,8 +33,6 @@ class LoginPageController extends GetxController late final TabController tabController; - late final Gt3FlutterPlugin captcha = Gt3FlutterPlugin(); - late final CaptchaDataModel captchaData = CaptchaDataModel(); late final RxInt qrCodeLeftTime = 180.obs; late final RxString statusQRCode = ''.obs; @@ -125,115 +122,19 @@ class LoginPageController extends GetxController String geeChallenge, VoidCallback onSuccess, ) { - void updateCaptchaData(Map json) { - captchaData - ..validate = json['geetest_validate'] - ..seccode = json['geetest_seccode'] - ..geetest = GeetestData( - challenge: json['geetest_challenge'], - gt: geeGt, - ); - SmartDialog.showToast('验证成功'); - onSuccess(); - } - - if (PlatformUtils.isDesktop) { - showDialog>( - context: Get.context!, - builder: (context) => GeetestWebviewDialog(geeGt, geeChallenge), - ).then((res) { - if (res != null) { - updateCaptchaData(res); - } - }); - } else { - final registerData = Gt3RegisterData( - challenge: geeChallenge, - gt: geeGt, - success: true, - ); - - captcha - ..addEventHandler( - onShow: (Map message) {}, - onClose: (Map message) { - SmartDialog.showToast('关闭验证'); - }, - onResult: (Map message) { - if (kDebugMode) debugPrint("Captcha result: $message"); - final String code = message["code"]; - if (code == "1") { - // 发送 message["result"] 中的数据向 B 端的业务服务接口进行查询 - updateCaptchaData(message['result']); - } else { - // 终端用户完成验证失败,自动重试 If the verification fails, it will be automatically retried. - if (kDebugMode) debugPrint("Captcha result code : $code"); - } - }, - onError: (Map message) { - SmartDialog.showToast("Captcha onError: $message"); - String code = message["code"]; - // 处理验证中返回的错误 Handling errors returned in verification - if (Platform.isAndroid) { - // Android 平台 - if (code == "-2") { - // Dart 调用异常 Call exception - } else if (code == "-1") { - // Gt3RegisterData 参数不合法 Parameter is invalid - } else if (code == "201") { - // 网络无法访问 Network inaccessible - } else if (code == "202") { - // Json 解析错误 Analysis error - } else if (code == "204") { - // WebView 加载超时,请检查是否混淆极验 SDK Load timed out - } else if (code == "204_1") { - // WebView 加载前端页面错误,请查看日志 Error loading front-end page, please check the log - } else if (code == "204_2") { - // WebView 加载 SSLError - } else if (code == "206") { - // gettype 接口错误或返回为 null API error or return null - } else if (code == "207") { - // getphp 接口错误或返回为 null API error or return null - } else if (code == "208") { - // ajax 接口错误或返回为 null API error or return null - } else { - // 更多错误码参考开发文档 More error codes refer to the development document - // https://docs.geetest.com/sensebot/apirefer/errorcode/android - } - } - - if (Platform.isIOS) { - // iOS 平台 - if (code == "-1009") { - // 网络无法访问 Network inaccessible - } else if (code == "-1004") { - // 无法查找到 HOST Unable to find HOST - } else if (code == "-1002") { - // 非法的 URL Illegal URL - } else if (code == "-1001") { - // 网络超时 Network timeout - } else if (code == "-999") { - // 请求被意外中断, 一般由用户进行取消操作导致 The interrupted request was usually caused by the user cancelling the operation - } else if (code == "-21") { - // 使用了重复的 challenge Duplicate challenges are used - // 检查获取 challenge 是否进行了缓存 Check if the fetch challenge is cached - } else if (code == "-20") { - // 尝试过多, 重新引导用户触发验证即可 Try too many times, lead the user to request verification again - } else if (code == "-10") { - // 预判断时被封禁, 不会再进行图形验证 Banned during pre-judgment, and no more image captcha verification - } else if (code == "-2") { - // Dart 调用异常 Call exception - } else if (code == "-1") { - // Gt3RegisterData 参数不合法 Parameter is invalid - } else { - // 更多错误码参考开发文档 More error codes refer to the development document - // https://docs.geetest.com/sensebot/apirefer/errorcode/ios - } - } - }, - ) - ..startCaptcha(registerData); - } + GeetestWebviewDialog.geetest(geeGt, geeChallenge).then((res) { + if (res is Map) { + captchaData + ..validate = res['geetest_validate'] + ..seccode = res['geetest_seccode'] + ..geetest = GeetestData( + challenge: res['geetest_challenge'], + gt: geeGt, + ); + SmartDialog.showToast('验证成功'); + onSuccess(); + } + }); } static String validateCookie(String cookie) { diff --git a/lib/pages/login/geetest/geetest_webview_dialog.dart b/lib/pages/login/geetest/geetest_webview_dialog.dart index b78ad963e..7a0461170 100644 --- a/lib/pages/login/geetest/geetest_webview_dialog.dart +++ b/lib/pages/login/geetest/geetest_webview_dialog.dart @@ -1,5 +1,5 @@ -import 'dart:convert' show jsonDecode, jsonEncode; -import 'dart:io' show Platform, Directory, File; +import 'dart:convert' show base64, jsonDecode, jsonEncode, utf8; +import 'dart:io' show Platform; import 'package:PiliPlus/http/browser_ua.dart'; import 'package:PiliPlus/http/init.dart'; @@ -20,6 +20,13 @@ class GeetestWebviewDialog extends StatefulWidget { @override State createState() => _GeetestWebviewDialogState(); + + static Future geetest(String gt, String challenge) { + return showDialog( + context: Get.context!, + builder: (context) => GeetestWebviewDialog(gt, challenge), + ); + } } class _GeetestWebviewDialogState extends State { @@ -30,6 +37,9 @@ class _GeetestWebviewDialogState extends State { Webview? _linuxWebview; late bool _linuxWebviewLoading = true; + String _showJs(String response) => + 't=Geetest($response).onSuccess(()=>R("success",t.getValidate())).onError(o=>R("error",o)).onClose(o=>R("close",o));t.onReady(()=>t.verify())'; + @override void initState() { super.initState(); @@ -122,6 +132,8 @@ class _GeetestWebviewDialogState extends State { } } else if (msgStr.startsWith("error:")) { debugPrint('geetest error: $msgStr'); + } else if (msgStr.startsWith('close:')) { + Get.back(); } }); @@ -136,27 +148,15 @@ class _GeetestWebviewDialogState extends State { '''; - final tempDir = Directory.systemTemp; - final file = File( - '${tempDir.path}/geetest_${DateTime.now().millisecondsSinceEpoch}.html', + _linuxWebview!.launch( + 'data:text/html;base64,${base64.encode(utf8.encode(html))}', ); - await file.writeAsString(html); - - if (!mounted) { - _closeLinuxWebview(); - return; - } - - _linuxWebview!.launch('file://${file.path}'); if (mounted) { setState(() { @@ -205,7 +205,7 @@ class _GeetestWebviewDialogState extends State { return AlertDialog( title: const Text('验证码'), content: SizedBox( - width: 300, + width: 320, height: 400, child: InAppWebView( webViewEnvironment: webViewEnvironment, @@ -217,11 +217,31 @@ class _GeetestWebviewDialogState extends State { algorithmicDarkeningAllowed: true, useShouldOverrideUrlLoading: true, userAgent: BrowserUa.mob, - mixedContentMode: MixedContentMode.MIXED_CONTENT_ALWAYS_ALLOW, + mixedContentMode: .MIXED_CONTENT_ALWAYS_ALLOW, + + incognito: true, + allowFileAccess: false, + allowsLinkPreview: false, + allowContentAccess: false, + useOnDownloadStart: false, + geolocationEnabled: false, + thirdPartyCookiesEnabled: false, + enterpriseAuthenticationAppLinkPolicyEnabled: false, + saveFormData: false, + safeBrowsingEnabled: false, + isFraudulentWebsiteWarningEnabled: false, + domStorageEnabled: false, + databaseEnabled: false, + cacheEnabled: false, + cacheMode: .LOAD_NO_CACHE, + + horizontalScrollBarEnabled: false, + verticalScrollBarEnabled: false, + overScrollMode: .NEVER, ), initialData: InAppWebViewInitialData( data: - '', + '', ), onWebViewCreated: (ctr) { ctr @@ -242,16 +262,17 @@ class _GeetestWebviewDialogState extends State { callback: (args) { debugPrint('geetest error: $args'); }, + ) + ..addJavaScriptHandler( + handlerName: 'close', + callback: (args) => Get.back(), ); }, onLoadStop: (ctr, _) async { final config = await _future; if (!mounted) return; if (config case Success(:final response)) { - ctr.evaluateJavascript( - source: - 'let t=Geetest($response).onSuccess(()=>R("success",t.getValidate())).onError((o)=>R("error",o));t.onReady(()=>t.verify());', - ); + ctr.evaluateJavascript(source: _showJs(response)); } else { config.toast(); Get.back(); diff --git a/lib/scripts/bottom_sheet_ios_piliplus.patch b/lib/scripts/bottom_sheet_ios_piliplus.patch index 40aca1a04..47eeadc27 100644 --- a/lib/scripts/bottom_sheet_ios_piliplus.patch +++ b/lib/scripts/bottom_sheet_ios_piliplus.patch @@ -9,7 +9,7 @@ index 58ba68b7c..a6bb398ac 100644 -import 'package:flutter/gestures.dart' show HorizontalDragGestureRecognizer; +import 'package:flutter/gestures.dart' + show HorizontalDragGestureRecognizer, DeviceGestureSettings; - import 'package:flutter/material.dart' ; + import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -142,6 +143,10 @@ class SlideDragGestureRecognizer extends HorizontalDragGestureRecognizer { diff --git a/lib/scripts/geetest_ios.patch b/lib/scripts/geetest_ios.patch new file mode 100644 index 000000000..edda3ec22 --- /dev/null +++ b/lib/scripts/geetest_ios.patch @@ -0,0 +1,146 @@ +diff --git a/lib/pages/login/geetest/geetest_plugin.dart b/lib/pages/login/geetest/geetest_plugin.dart +new file mode 100644 +index 000000000..2823c2188 +--- /dev/null ++++ b/lib/pages/login/geetest/geetest_plugin.dart +@@ -0,0 +1,110 @@ ++import 'dart:async' show Completer; ++import 'dart:io' show Platform; ++ ++import 'package:flutter/foundation.dart' show kDebugMode, debugPrint; ++import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; ++import 'package:gt3_flutter_plugin/gt3_flutter_plugin.dart'; ++ ++abstract final class GeetestPlugin { ++ static Future geetest(String gt, String challenge) { ++ final completer = Completer(); ++ void complete([result]) { ++ if (!completer.isCompleted) { ++ completer.complete(result); ++ } ++ } ++ ++ final registerData = Gt3RegisterData( ++ challenge: challenge, ++ gt: gt, ++ success: true, ++ ); ++ ++ Gt3FlutterPlugin() ++ ..addEventHandler( ++ onShow: (Map message) {}, ++ onClose: (Map message) { ++ SmartDialog.showToast('关闭验证'); ++ complete(); ++ }, ++ onResult: (Map message) { ++ if (kDebugMode) debugPrint("Captcha result: $message"); ++ final String code = message["code"]; ++ if (code == "1") { ++ // 发送 message["result"] 中的数据向 B 端的业务服务接口进行查询 ++ complete(message['result']); ++ return; ++ } else { ++ // 终端用户完成验证失败,自动重试 If the verification fails, it will be automatically retried. ++ if (kDebugMode) debugPrint("Captcha result code : $code"); ++ } ++ complete(); ++ }, ++ onError: (Map message) { ++ SmartDialog.showToast("Captcha onError: $message"); ++ String code = message["code"]; ++ // 处理验证中返回的错误 Handling errors returned in verification ++ if (Platform.isAndroid) { ++ // Android 平台 ++ if (code == "-2") { ++ // Dart 调用异常 Call exception ++ } else if (code == "-1") { ++ // Gt3RegisterData 参数不合法 Parameter is invalid ++ } else if (code == "201") { ++ // 网络无法访问 Network inaccessible ++ } else if (code == "202") { ++ // Json 解析错误 Analysis error ++ } else if (code == "204") { ++ // WebView 加载超时,请检查是否混淆极验 SDK Load timed out ++ } else if (code == "204_1") { ++ // WebView 加载前端页面错误,请查看日志 Error loading front-end page, please check the log ++ } else if (code == "204_2") { ++ // WebView 加载 SSLError ++ } else if (code == "206") { ++ // gettype 接口错误或返回为 null API error or return null ++ } else if (code == "207") { ++ // getphp 接口错误或返回为 null API error or return null ++ } else if (code == "208") { ++ // ajax 接口错误或返回为 null API error or return null ++ } else { ++ // 更多错误码参考开发文档 More error codes refer to the development document ++ // https://docs.geetest.com/sensebot/apirefer/errorcode/android ++ } ++ } ++ ++ if (Platform.isIOS) { ++ // iOS 平台 ++ if (code == "-1009") { ++ // 网络无法访问 Network inaccessible ++ } else if (code == "-1004") { ++ // 无法查找到 HOST Unable to find HOST ++ } else if (code == "-1002") { ++ // 非法的 URL Illegal URL ++ } else if (code == "-1001") { ++ // 网络超时 Network timeout ++ } else if (code == "-999") { ++ // 请求被意外中断, 一般由用户进行取消操作导致 The interrupted request was usually caused by the user cancelling the operation ++ } else if (code == "-21") { ++ // 使用了重复的 challenge Duplicate challenges are used ++ // 检查获取 challenge 是否进行了缓存 Check if the fetch challenge is cached ++ } else if (code == "-20") { ++ // 尝试过多, 重新引导用户触发验证即可 Try too many times, lead the user to request verification again ++ } else if (code == "-10") { ++ // 预判断时被封禁, 不会再进行图形验证 Banned during pre-judgment, and no more image captcha verification ++ } else if (code == "-2") { ++ // Dart 调用异常 Call exception ++ } else if (code == "-1") { ++ // Gt3RegisterData 参数不合法 Parameter is invalid ++ } else { ++ // 更多错误码参考开发文档 More error codes refer to the development document ++ // https://docs.geetest.com/sensebot/apirefer/errorcode/ios ++ } ++ } ++ complete(); ++ }, ++ ) ++ ..startCaptcha(registerData); ++ ++ return completer.future; ++ } ++} +diff --git a/lib/pages/login/geetest/geetest_webview_dialog.dart b/lib/pages/login/geetest/geetest_webview_dialog.dart +index 7a0461170..da032af1a 100644 +--- a/lib/pages/login/geetest/geetest_webview_dialog.dart ++++ b/lib/pages/login/geetest/geetest_webview_dialog.dart +@@ -1,3 +1,5 @@ ++import 'package:PiliPlus/pages/login/geetest/geetest_plugin.dart'; ++ + import 'dart:convert' show base64, jsonDecode, jsonEncode, utf8; + import 'dart:io' show Platform; + +@@ -22,6 +24,7 @@ class GeetestWebviewDialog extends StatefulWidget { + State createState() => _GeetestWebviewDialogState(); + + static Future geetest(String gt, String challenge) { ++ return GeetestPlugin.geetest(gt, challenge); + return showDialog( + context: Get.context!, + builder: (context) => GeetestWebviewDialog(gt, challenge), +diff --git a/pubspec.yaml b/pubspec.yaml +index 1ec95f9f1..e29e474e0 100644 +--- a/pubspec.yaml ++++ b/pubspec.yaml +@@ -34,6 +34,7 @@ dependencies: + sdk: flutter + flutter_localizations: + sdk: flutter ++ gt3_flutter_plugin: ^0.1.0 + + app_links: ^7.1.1 + archive: ^4.0.0 diff --git a/lib/scripts/patch.ps1 b/lib/scripts/patch.ps1 index a680cacb0..97b5e2d21 100644 --- a/lib/scripts/patch.ps1 +++ b/lib/scripts/patch.ps1 @@ -37,11 +37,17 @@ $ModalBarrierPatch = "lib/scripts/modal_barrier.patch" # https://github.com/flutter/flutter/issues/182466 $MouseCursorPatch = "lib/scripts/mouse_cursor.patch" +$GeetestIOSPatch = "lib/scripts/geetest_ios.patch" + if ($platform.ToLower() -eq "ios") { git apply $BottomSheetIOSPiliPlusPatch if ($LASTEXITCODE -eq 0) { Write-Host "$BottomSheetIOSPiliPlusPatch applied" } + git apply $GeetestIOSPatch + if ($LASTEXITCODE -eq 0) { + Write-Host "$GeetestIOSPatch applied" + } } Set-Location $env:FLUTTER_ROOT diff --git a/lib/utils/request_utils.dart b/lib/utils/request_utils.dart index a8b623ad3..9deb098a4 100644 --- a/lib/utils/request_utils.dart +++ b/lib/utils/request_utils.dart @@ -1,6 +1,5 @@ import 'dart:async'; import 'dart:convert'; -import 'dart:io'; import 'dart:math'; import 'package:PiliPlus/common/widgets/dialog/dialog.dart'; @@ -43,7 +42,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart' show LengthLimitingTextInputFormatter; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; -import 'package:gt3_flutter_plugin/gt3_flutter_plugin.dart'; abstract final class RequestUtils { static Future syncHistoryStatus() async { @@ -574,118 +572,17 @@ abstract final class RequestUtils { } } - if (PlatformUtils.isDesktop) { - final json = await showDialog>( - context: Get.context!, - builder: (context) => GeetestWebviewDialog(gt!, challenge!), - ); - if (json != null) { - captchaData - ..validate = json['geetest_validate'] - ..seccode = json['geetest_seccode'] - ..geetest = GeetestData( - challenge: json['geetest_challenge'], - gt: gt!, - ); - gaiaVgateValidate(); - } - return; + final json = await GeetestWebviewDialog.geetest(gt!, challenge!); + if (json is Map) { + captchaData + ..validate = json['geetest_validate'] + ..seccode = json['geetest_seccode'] + ..geetest = GeetestData( + challenge: json['geetest_challenge'], + gt: gt, + ); + gaiaVgateValidate(); } - - final registerData = Gt3RegisterData( - challenge: challenge, - gt: gt, - success: true, - ); - - Gt3FlutterPlugin() - ..addEventHandler( - onClose: (Map message) { - SmartDialog.showToast('关闭验证'); - }, - onResult: (Map message) { - if (kDebugMode) debugPrint("Captcha result: $message"); - String code = message["code"]; - if (code == "1") { - // 发送 message["result"] 中的数据向 B 端的业务服务接口进行查询 - SmartDialog.showToast('验证成功'); - final result = message['result']; - captchaData - ..validate = result?['geetest_validate'] - ..seccode = result?['geetest_seccode'] - ..geetest = GeetestData( - challenge: result?['geetest_challenge'], - gt: gt!, - ); - gaiaVgateValidate(); - } else { - // 终端用户完成验证失败,自动重试 If the verification fails, it will be automatically retried. - if (kDebugMode) debugPrint("Captcha result code : $code"); - } - }, - onError: (Map message) { - SmartDialog.showToast("Captcha onError: $message"); - String code = message["code"]; - // 处理验证中返回的错误 Handling errors returned in verification - if (Platform.isAndroid) { - // Android 平台 - if (code == "-2") { - // Dart 调用异常 Call exception - } else if (code == "-1") { - // Gt3RegisterData 参数不合法 Parameter is invalid - } else if (code == "201") { - // 网络无法访问 Network inaccessible - } else if (code == "202") { - // Json 解析错误 Analysis error - } else if (code == "204") { - // WebView 加载超时,请检查是否混淆极验 SDK Load timed out - } else if (code == "204_1") { - // WebView 加载前端页面错误,请查看日志 Error loading front-end page, please check the log - } else if (code == "204_2") { - // WebView 加载 SSLError - } else if (code == "206") { - // gettype 接口错误或返回为 null API error or return null - } else if (code == "207") { - // getphp 接口错误或返回为 null API error or return null - } else if (code == "208") { - // ajax 接口错误或返回为 null API error or return null - } else { - // 更多错误码参考开发文档 More error codes refer to the development document - // https://docs.geetest.com/sensebot/apirefer/errorcode/android - } - } - - if (Platform.isIOS) { - // iOS 平台 - if (code == "-1009") { - // 网络无法访问 Network inaccessible - } else if (code == "-1004") { - // 无法查找到 HOST Unable to find HOST - } else if (code == "-1002") { - // 非法的 URL Illegal URL - } else if (code == "-1001") { - // 网络超时 Network timeout - } else if (code == "-999") { - // 请求被意外中断, 一般由用户进行取消操作导致 The interrupted request was usually caused by the user cancelling the operation - } else if (code == "-21") { - // 使用了重复的 challenge Duplicate challenges are used - // 检查获取 challenge 是否进行了缓存 Check if the fetch challenge is cached - } else if (code == "-20") { - // 尝试过多, 重新引导用户触发验证即可 Try too many times, lead the user to request verification again - } else if (code == "-10") { - // 预判断时被封禁, 不会再进行图形验证 Banned during pre-judgment, and no more image captcha verification - } else if (code == "-2") { - // Dart 调用异常 Call exception - } else if (code == "-1") { - // Gt3RegisterData 参数不合法 Parameter is invalid - } else { - // 更多错误码参考开发文档 More error codes refer to the development document - // https://docs.geetest.com/sensebot/apirefer/errorcode/ios - } - } - }, - ) - ..startCaptcha(registerData); } static Future showUserRealName(String mid) async { diff --git a/pubspec.lock b/pubspec.lock index b2cab1209..2405dc4f1 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -796,14 +796,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.2" - gt3_flutter_plugin: - dependency: "direct main" - description: - name: gt3_flutter_plugin - sha256: "9cf4070f3f1811b7aa7a1daebdec5886dbda8e64f932a713dab21d8128d7dad2" - url: "https://pub.dev" - source: hosted - version: "0.1.1" gtk: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 7d58974d8..1ec95f9f1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -112,7 +112,6 @@ dependencies: git: url: https://github.com/bggRGjQaUbCoE/getx.git ref: version_4.7.2 - gt3_flutter_plugin: ^0.1.0 hive_ce: ^2.19.3 html: ^0.15.4 http2: ^2.3.1