From c986d6a2e065e73b188b9f360fa3517f7332bc2c Mon Sep 17 00:00:00 2001 From: Jolie <> Date: Thu, 6 Nov 2025 22:04:44 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=96=E5=86=99=E9=A6=96=E9=A1=B5=E3=80=81?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8F=90=E4=BA=A4=E5=A4=B4=E5=83=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/images/btn_bg_icon.png | Bin 0 -> 1114 bytes assets/images/hi_icon.png | Bin 0 -> 2085 bytes assets/images/live_icon.png | Bin 0 -> 4957 bytes assets/images/online_icon.png | Bin 0 -> 718 bytes assets/images/send_message_icon.png | Bin 0 -> 4353 bytes assets/images/tab_change_icon.png | Bin 0 -> 419 bytes assets/images/verified_icon.png | Bin 0 -> 451 bytes ios/Podfile | 43 ++ ios/Podfile.lock | 65 +++ ios/Runner.xcodeproj/project.pbxproj | 18 + lib/controller/mine/user_info_controller.dart | 78 +++- lib/generated/assets.dart | 7 + lib/main.dart | 2 +- lib/pages/home/home_page.dart | 398 +++++++++++++++++- lib/pages/main/main_page.dart | 2 +- lib/pages/mine/login_controller.dart | 174 ++++++++ lib/pages/mine/user_info_page.dart | 18 +- pubspec.lock | 280 ++++++------ 18 files changed, 927 insertions(+), 158 deletions(-) create mode 100644 assets/images/btn_bg_icon.png create mode 100644 assets/images/hi_icon.png create mode 100644 assets/images/live_icon.png create mode 100644 assets/images/online_icon.png create mode 100644 assets/images/send_message_icon.png create mode 100644 assets/images/tab_change_icon.png create mode 100644 assets/images/verified_icon.png create mode 100644 ios/Podfile create mode 100644 ios/Podfile.lock create mode 100644 lib/pages/mine/login_controller.dart diff --git a/assets/images/btn_bg_icon.png b/assets/images/btn_bg_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..743e696d94a66e3e0bba6c8d9f37ea80f94febb3 GIT binary patch literal 1114 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 P00000NkvXXu0mjf&6)mL literal 0 HcmV?d00001 diff --git a/assets/images/live_icon.png b/assets/images/live_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9b470b8c89cad39698aba1fdec0c27ce278aa57b GIT binary patch literal 4957 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 buO9yoepaT80zmBI00000NkvXXu0mjf^4p(@ literal 0 HcmV?d00001 diff --git a/assets/images/online_icon.png b/assets/images/online_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f44d3e8370a97b7439a61792c22d60e525ea28 GIT binary patch literal 718 zcmV;<0x|uGP)Px#1am@3R0s$N2z&@+hyVZrcu7P-RA_Pyn`8v(nF6Kd+`k2vLnS_R|oN zBBBdDPenxY8_@%g&Gbg7nenL^WJC-Qe?b@10e3tA04Lmnwl!AHbB|4KxLOGD-A7l} z05zNQ66^oLFMv*LU)ES*jaAOfw-BOE{UB*TFXw^lJK=^C{xUNAvBy`+$T4+dMGeHn z-|=W?eQXj&q9#}av9K9))?*}0u;COlKz`dC;teqqLWn@G^c(bP<1nZAX1qV=G&6A8 zr1ygg-cdQX_-?e%)WsMr326zaKdNky=Ea407x!;N;GiCBhW=eDhQzx z!zV##pk$cI-AcG0;YEf|inm$;4hiq>Q}PNh+TLpqa7c7XCjba8P9?!;t3P4|-Uem` zt`b(h66lq)DT-hZlnghy(*M#o38&KFGzlRpvj^%~)jR=X;0Sb^_-OZ>v715CFk*XC z0sxmV+T&|lMFZfpm`t60j5@1O(rLtKX|*QPDpTe``@&`E*tCkq$;mhA@8v=%l45is zCCD{$g^VQ;p6j?yPBZ9v&UwZa7v}uxklE2K30!@`_v}R*rf^_HP`XEB_>0z z$alhx&DrEISA)!3|Ft5YO|HxebZHM`#xJu1-AgHRVeDOI9Ry8Nq4!av3!lkIHM#JJ zkyp%I=*1cDy$5o5Gib7XN?}{eI?Y5`+2c{(ORem6uI{*Lx07*qoM6N<$f^xM# A*8l(j literal 0 HcmV?d00001 diff --git a/assets/images/send_message_icon.png b/assets/images/send_message_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7820c28da21ee3254cc7a7f6dfaafd9fee3b847d GIT binary patch literal 4353 zcmV+c5&rIpP)Px#1am@3R0s$N2z&@+hyVZ(t4TybRCt{2U2AX@*OmTyG#b4ThE#Spl@yX@Bq1aC zoyre12nh=b1cn$4ro483WNnuzC$YCyPHZDNhJy8avs+GS(9tDiDZoW z&kXY(BIr+bj$xmv-ly^R$~ibfZU8{DBcl-!f-~B%q1D|8paO&@qLCNKh$(Ng7Kkak z4xXsZH;s`rEHN9}+>IdQgc^|;G3j$gOuc9F{c#{o2msAr>l0L$m<{c7Lm+Zh&0%iQ zhd)2^0EB~k$uD-ofgga_DG5D*69*=}7W|Az@8^#~_X*cHs=v@NC*Bvjrg6VwO!WPs z@o_3+QjS5Gue6X4 ziC4bwvkPY;F$uU6!ttLTcrdrfNXZai+$)cg5B0O~*5PLSJ$7M_x>h1rk1vXpr!q)3!|+ z=y~@$=y~ruIQ`;AY%Q>;wkt2NU~7Q|>Z{yI;=m>hSIvWS7vT*jy1{|o)Qf*UaHRJ79^YHeod8+k){4KPDzt!roV0lBSw>1VGHM zv6awL*f}16wKPOjy__Fu-j!=KIjTS5#C&0U=!^aGM)Y5*fD6|baPj&AuhL^sC23o75t$z`BC;d2Bm5DNIy7>9C)mZ>Ibo4HvqmL)= zeu?DV|4b$>T?-#%U1~Gq&DUvCeiQ>KC&pLcoCr`Uwmg(?OqwWjwu~IjRi-QYM6B7VNTt1xq#D@dbS(=NWj=m*ob-r&`CP0A8z1rj~wVCmjjFeZd zdJU;?EnMsIVPY&G%l!tT%`302H^W*Qe~z65~o_x{e%eV3d5cGbqv^xIjC zxQsQ!|J^2+A^+O4R5BbMWm#}OeM4jSLN+}ORDC? zrCtvjUdzShJ`XPSdUPe(+xFkN#`D7!Z z#QdkvAE?R)sl9WgB9B^?|KhWU!E0)@k0hU{)-|GQ0Rg~WmrpTS3rKL( zPA`tMc6?S7cU?ZT$$gha>G;Jzu|@0%TatPZ0y!8~7pXx^ z4QYAAo{N1${|msFAMtY(?lZ>QG zOexLJi#uP@-@;9^X+ zWm!?`s>g|m6-ge$uqvcxG>SSya8xj5D8FP_-|4!5m4Em~v7AytI`6LeDwo!2x2y zgYrTPe);lKc=xkM_@#`L0C3{dnN=BIS&^KW+V*XviDqhU{54!>q2wB+HJhZZeJJOR$4Yjj>)kAT#_;}RrSeHstJAS zwoMtTq?Fp0YB)DEuN!If-ha*Dj)4?kBQR1TCRwPhjn4LUjt9_tC1j3ROHFw7tq{p~ z)zd`nzZ?o!F4}BLib_wYDnIk$M#X1mZzxr`9C}%kx2L=)FHFZBSA0U`+QUf9OMM=U zI%R*e9iUdaTJ9owZn+-n>gadS(;eA-d%JwF6`K_M;MP(Ts_WBGU7v=@u>d~#&<9sg zY8D0C?%bCK*BF6oBylP|VZ>A;Ww=TlTMH~=)i*7a7g~6=POvHqA8AyPo^2^$)aj4f zj~NMyC55+oB2eQ}^j`7fwNeZEy8P(tZCYTuWY}aG;Y`=|!6pXZgilVjkPR4##A6<=LC=pb8I3m8}I99F--a$#H&Y0T+gX zQkDSEs}|JaYZwVzl17VasliAPN21Zw<3mrkegL(t#02NKx^$D1uSil6&NW7h@`1}M zC@SGZLhjsW!hen?CSfkF#N4(iLqW=0_m)LTxwXI|E{607d3)N6cRqVW2XO$naD5(k zrhI%-ZH+p=@!X( z>)tXNK7W91n=){8doH#W=%*G8PkV7bxFXluhqyiEsmA~D_3-A!xPkJ66B8?j7dF(jxc5ST%6BF8`xZ3T<@feC9^ml6iFa|pV80-wdH4;eJMrA@)qyVX{+26TBIo0JzM)6ke?anz~ zCK2FwqYt54KmZ~42YrnW-c%D=MRDdi!WLS7w{E0DrY?lZYz z0^ktN^RrVo35#KEfk{k;l!S>RF#%E;YlG4fiAIwx`Kq3Ybg|;WR%hrRpCr ztP#+p1X})(?l7I+o96&!XEJg!BoQ2G0)jRsrOr1pb!!5@Md(m)}Svw&s@a z=3yOM3^BwB^D_asXQlCfA;Ad9{FtZruiGI#f0~h#Ar6?I31EJP+UaSMN=rb+!A=OL zAm?{CFq@NMb@1pfD_D?9N&-jA?`cv38sXOs9d0`a84`~+x4J~spcyRy(B^Ig zAt$87l(8N(ah2yp_j;&5qH#ZU9`>1>foCG3XA;?*wb~nbCXtL$|C!<6tI_^c=NR^x z>U~E4Ud8Xl0m3!4e4Xxq4h-jkHM9l^%804io)J^$ncy5`B|ISo7$&BGhE}&70oXxM v5uA*j5mV9^BPIwq2Lj@8Q;WkG8KwAtw#2G^-Z&8b00000NkvXXu0mjf``=K~ literal 0 HcmV?d00001 diff --git a/assets/images/tab_change_icon.png b/assets/images/tab_change_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e7992611ebebfa568cdcbf541e30157a19908ef7 GIT binary patch literal 419 zcmV;U0bKrxP)Px#1am@3R0s$N2z&@+hyVZqO-V#SR9J=Om(i7iFc3xGgJWGn9ny~?%f_c>4! z=D5@zR{m1mM>~%U+#4UIJ5c2orIf4`7+e?4w4)>}lXhU0a`vtd2Kc)qtd?$|QZA+O zUy8jPx#1am@3R0s$N2z&@+hyVZqZAnByR7i=<|PzH zxq8(-$P*5GlK%?#aZ1Nq+9&I*e8tBhBpSp_Sdu3cxM^(|QI^w;D)0h?fd t0ljwnmrxjY|1mkhz3pxp357AW`Y-hsp`p8M6{`RM002ovPDHLkV1gE&!dn0U literal 0 HcmV?d00001 diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 0000000..620e46e --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,43 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '13.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 0000000..726ebcb --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,65 @@ +PODS: + - AgoraInfra_iOS (1.2.13.1) + - Flutter (1.0.0) + - flutter_native_splash (2.4.3): + - Flutter + - HyphenateChat (4.15.0): + - AgoraInfra_iOS (~> 1.2.13) + - im_flutter_sdk_ios (4.14.0): + - Flutter + - HyphenateChat (= 4.15.0) + - image_picker_ios (0.0.1): + - Flutter + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - permission_handler_apple (9.3.0): + - Flutter + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS + +DEPENDENCIES: + - Flutter (from `Flutter`) + - flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`) + - im_flutter_sdk_ios (from `.symlinks/plugins/im_flutter_sdk_ios/ios`) + - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) + - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) + +SPEC REPOS: + trunk: + - AgoraInfra_iOS + - HyphenateChat + +EXTERNAL SOURCES: + Flutter: + :path: Flutter + flutter_native_splash: + :path: ".symlinks/plugins/flutter_native_splash/ios" + im_flutter_sdk_ios: + :path: ".symlinks/plugins/im_flutter_sdk_ios/ios" + image_picker_ios: + :path: ".symlinks/plugins/image_picker_ios/ios" + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/darwin" + permission_handler_apple: + :path: ".symlinks/plugins/permission_handler_apple/ios" + shared_preferences_foundation: + :path: ".symlinks/plugins/shared_preferences_foundation/darwin" + +SPEC CHECKSUMS: + AgoraInfra_iOS: 3691b2b277a1712a35ae96de25af319de0d73d08 + Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 + flutter_native_splash: df59bb2e1421aa0282cb2e95618af4dcb0c56c29 + HyphenateChat: 4523c7fb2075771c49a2c492b31544d6cc82ff50 + im_flutter_sdk_ios: 2348d34baa17e98d8c490d92023410956c8afee1 + image_picker_ios: 4f2f91b01abdb52842a8e277617df877e40f905b + path_provider_foundation: 0b743cbb62d8e47eab856f09262bb8c1ddcfe6ba + permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 + shared_preferences_foundation: 5086985c1d43c5ba4d5e69a4e8083a389e2909e6 + +PODFILE CHECKSUM: 3c63482e143d1b91d2d2560aee9fb04ecc74ac7e + +COCOAPODS: 1.16.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index f67270f..d47b4b5 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -199,6 +199,7 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, A36064B7643972D96D7D5F55 /* [CP] Embed Pods Frameworks */, + 60F9142B6626BDFC64679D81 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -330,6 +331,23 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; + 60F9142B6626BDFC64679D81 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; diff --git a/lib/controller/mine/user_info_controller.dart b/lib/controller/mine/user_info_controller.dart index db9c586..1b5b651 100644 --- a/lib/controller/mine/user_info_controller.dart +++ b/lib/controller/mine/user_info_controller.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:dating_touchme_app/oss/oss_manager.dart'; import 'package:flustars/flustars.dart'; import 'package:get/get.dart'; +import 'package:permission_handler/permission_handler.dart'; import 'package:get_storage/get_storage.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:image_picker/image_picker.dart'; @@ -16,6 +17,8 @@ class UserInfoController extends GetxController { final education = ''.obs; final invitationCode = ''.obs; final avatarUrl = ''.obs; + // 本地选择的头像文件路径(提交时先上传) + final avatarLocalPath = ''.obs; // 加载状态 final isSubmitting = false.obs; @@ -56,12 +59,23 @@ class UserInfoController extends GetxController { // 选择头像 - 业务逻辑处理 Future handleCameraCapture() async { try { - // 请求相机权限并拍照 + // 请求相机权限 + final ok = await _ensurePermission( + Permission.camera, + denyToast: '相机权限被拒绝,请在设置中允许访问相机', + ); + if (!ok) return; + + // 请求麦克风权限(部分设备拍照/录像会一并请求建议预授权) + await _ensurePermission(Permission.microphone, denyToast: '麦克风权限被拒绝'); + + // 权限通过后拍照 final ImagePicker picker = ImagePicker(); final XFile? photo = await picker.pickImage(source: ImageSource.camera); if (photo != null) { - await processSelectedImage(File(photo.path)); + avatarLocalPath.value = photo.path; + SmartDialog.showToast('已选择照片'); } } catch (e) { print('拍照失败: $e'); @@ -79,12 +93,22 @@ class UserInfoController extends GetxController { Future handleGallerySelection() async { try { + // 请求相册/照片权限 + // final ok = await _ensurePermission( + // Permission.photos, + // // Android 上 photos 等价于 storage/mediaLibrary,permission_handler 会映射 + // denyToast: '相册权限被拒绝,请在设置中允许访问相册', + + // ); + // if (!ok) return; + // 从相册选择图片 final ImagePicker picker = ImagePicker(); final XFile? image = await picker.pickImage(source: ImageSource.gallery); if (image != null) { - await processSelectedImage(File(image.path)); + avatarLocalPath.value = image.path; + // SmartDialog.showToast('已选择图片'); } } catch (e) { print('选择图片失败: $e'); @@ -97,6 +121,27 @@ class UserInfoController extends GetxController { } } + // 通用权限申请 + Future _ensurePermission(Permission permission, {String? denyToast}) async { + var status = await permission.status; + if (status.isGranted) return true; + + if (status.isDenied || status.isRestricted || status.isLimited) { + status = await permission.request(); + if (status.isGranted) return true; + if (denyToast != null) SmartDialog.showToast(denyToast); + return false; + } + + if (status.isPermanentlyDenied) { + if (denyToast != null) SmartDialog.showToast('$denyToast,前往系统设置开启'); + // 延迟弹设置,避免与弹窗冲突 + Future.delayed(const Duration(milliseconds: 300), openAppSettings); + return false; + } + return false; + } + @override void onInit() { super.onInit(); @@ -108,17 +153,17 @@ class UserInfoController extends GetxController { Future processSelectedImage(File imageFile) async { try { // 显示加载提示 - SmartDialog.showLoading(msg: '正在处理头像...'); + SmartDialog.showLoading(msg: '提交信息中...'); String objectName = '${DateUtil.getNowDateMs()}.${imageFile.path.split('.').last}'; String imageUrl = await OSSManager.instance.uploadFile(imageFile.readAsBytesSync(), objectName); print('上传成功,图片URL: $imageUrl'); avatarUrl.value = imageUrl; SmartDialog.dismiss(); - SmartDialog.showToast('头像设置成功'); + // SmartDialog.showToast('头像设置成功'); } catch (e) { SmartDialog.dismiss(); print('处理图片失败: $e'); - SmartDialog.showToast('处理图片失败'); + SmartDialog.showToast('提交失败,请重试'); } } @@ -130,6 +175,12 @@ class UserInfoController extends GetxController { // 验证表单 bool _validateForm() { + + if (avatarUrl.value.isEmpty && avatarLocalPath.value.isEmpty) { + SmartDialog.showToast('请先选择头像'); + return false; + } + // 验证昵称 if (nickname.value.isEmpty) { SmartDialog.showToast('请输入昵称'); @@ -148,6 +199,12 @@ class UserInfoController extends GetxController { return false; } + // 验证头像(必须选择) + if (avatarUrl.value.isEmpty && avatarLocalPath.value.isEmpty) { + SmartDialog.showToast('请先选择头像'); + return false; + } + return true; } @@ -190,8 +247,16 @@ class UserInfoController extends GetxController { isSubmitting.value = true; try { + // 若还未上传远程头像,但已选择本地头像,则先上传 + if (avatarUrl.value.isEmpty && avatarLocalPath.value.isNotEmpty) { + await processSelectedImage(File(avatarLocalPath.value)); + } + // 构建请求参数 final params = _buildSubmitParams(); + if (avatarUrl.value.isNotEmpty) { + params['avatarUrl'] = avatarUrl.value; + } // 打印提交的信息 print('提交用户信息参数: $params'); @@ -209,6 +274,7 @@ class UserInfoController extends GetxController { 'nickname': nickname.value, 'birthday': birthday.value, 'education': education.value, + 'avatarUrl': avatarUrl.value, }); await storage.write('userInfo', currentUserInfo); } diff --git a/lib/generated/assets.dart b/lib/generated/assets.dart index ddf36c3..b10cf6c 100644 --- a/lib/generated/assets.dart +++ b/lib/generated/assets.dart @@ -18,5 +18,12 @@ class Assets { static const String imagesMineNol = 'assets/images/mine_nol.png'; static const String imagesMinePre = 'assets/images/mine_pre.png'; static const String imagesWomenIcon = 'assets/images/women_icon.png'; + static const String imagesBtnBgIcon = 'assets/images/btn_bg_icon.png'; + static const String imagesHiIcon = 'assets/images/hi_icon.png'; + static const String imagesLiveIcon = 'assets/images/live_icon.png'; + static const String imagesOnlineIcon = 'assets/images/online_icon.png'; + static const String imagesSendMessageIcon = 'assets/images/send_message_icon.png'; + static const String imagesTabChangeIcon = 'assets/images/tab_change_icon.png'; + static const String imagesVerifiedIcon = 'assets/images/verified_icon.png'; } diff --git a/lib/main.dart b/lib/main.dart index 36f4a85..ab1b26e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -75,7 +75,7 @@ class MyApp extends StatelessWidget { // 如果token不为空,显示主页;如果token为空,显示登录页面 if (token != null && token.isNotEmpty) { - return MainPage(); + return UserInfoPage(); } else { return LoginPage(); } diff --git a/lib/pages/home/home_page.dart b/lib/pages/home/home_page.dart index a80b5e0..271f166 100644 --- a/lib/pages/home/home_page.dart +++ b/lib/pages/home/home_page.dart @@ -1,3 +1,4 @@ +import 'package:dating_touchme_app/generated/assets.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -8,16 +9,407 @@ class HomePage extends StatefulWidget { State createState() => _HomePageState(); } -class _HomePageState extends State with AutomaticKeepAliveClientMixin{ +class _HomePageState extends State with AutomaticKeepAliveClientMixin { + int selectedTabIndex = 0; // 0: 推荐 1: 同城 + + // 简单的示例数据结构 + final List<_FeedItem> recommendFeed = [ + _FeedItem(type: _FeedType.withImages), + _FeedItem(type: _FeedType.plain), + _FeedItem(type: _FeedType.live), + _FeedItem(type: _FeedType.withImages), + ]; + + final List<_FeedItem> nearbyFeed = [ + _FeedItem(type: _FeedType.plain), + _FeedItem(type: _FeedType.withImages), + _FeedItem(type: _FeedType.live), + ]; @override Widget build(BuildContext context) { super.build(context); - return Container( - color: Colors.white, + final List<_FeedItem> dataSource = + selectedTabIndex == 0 ? recommendFeed : nearbyFeed; + + return Scaffold( + backgroundColor: Colors.white, + appBar: _buildAppBar(), + body: ListView.separated( + physics: const BouncingScrollPhysics(), + itemBuilder: (context, index) { + final item = dataSource[index]; + switch (item.type) { + case _FeedType.withImages: + return ImagesCard(); + case _FeedType.plain: + return PlainCard(); + case _FeedType.live: + return LiveCard(); + } + }, + separatorBuilder: (context, index) => const SizedBox(height: 12), + itemCount: dataSource.length, + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 12), + ), + ); + } + + PreferredSizeWidget _buildAppBar() { + return AppBar( + backgroundColor: Colors.white, + elevation: 0, + centerTitle: false, + toolbarHeight: 56, + titleSpacing: 16, + title: Row( + children: [ + _buildTabButton(title: '推荐', index: 0), + const SizedBox(width: 16), + _buildTabButton(title: '同城', index: 1), + const Spacer(), + Image.asset( + Assets.imagesOnlineIcon, + width: 20, + height: 20, + ), + ], + ), + bottom: PreferredSize( + preferredSize: const Size.fromHeight(8), + child: const SizedBox(height: 8), + ), ); } + Widget _buildTabButton({required String title, required int index}) { + final bool selected = selectedTabIndex == index; + return GestureDetector( + onTap: () { + if (selectedTabIndex != index) { + setState(() { + selectedTabIndex = index; + }); + } + }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: TextStyle( + fontSize: 22, + fontWeight: FontWeight.w700, + color: selected ? Colors.black : const Color(0xFF999999), + ), + ), + const SizedBox(height: 4), + AnimatedContainer( + duration: const Duration(milliseconds: 200), + height: 4, + width: selected ? 28 : 0, + decoration: BoxDecoration( + color: const Color(0xFF6C63FF), + borderRadius: BorderRadius.circular(2), + ), + ), + ], + ), + ); + } + + // 下面将卡片组件拆分为独立Widget,保持HomePage更简洁 + @override bool get wantKeepAlive => true; } + +enum _FeedType { withImages, plain, live } + +class _FeedItem { + final _FeedType type; + const _FeedItem({required this.type}); +} + +// 通用头部组件:头像/昵称/在线/认证/Hi/直播中徽标 +class _CardHeader extends StatelessWidget { + final bool showHi; + // 是否在头像上显示直播态(紫色描边 + 头像角标) + final bool liveOverlayOnAvatar; + const _CardHeader({this.showHi = false, this.liveOverlayOnAvatar = false}); + + @override + Widget build(BuildContext context) { + return Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // 头像 + 在线小圆点 + Stack( + children: [ + // 头像 + 可选紫色描边 + Container( + padding: liveOverlayOnAvatar ? const EdgeInsets.all(2) : EdgeInsets.zero, + decoration: liveOverlayOnAvatar + ? BoxDecoration( + borderRadius: BorderRadius.circular(32), + border: Border.all(color: const Color(0xFFB58BFF), width: 2), + ) + : null, + child: ClipRRect( + borderRadius: BorderRadius.circular(30), + child: Image.asset( + Assets.imagesAvatarsExample, + width: 60, + height: 60, + fit: BoxFit.cover, + ), + ), + ), + Positioned( + left: 6, + bottom: 6, + child: Container( + width: 12, + height: 12, + decoration: BoxDecoration( + color: const Color(0xFF2ED573), + shape: BoxShape.circle, + boxShadow: const [ + BoxShadow(color: Color(0x332ED573), blurRadius: 4, offset: Offset(0, 2)), + ], + ), + ), + ), + if (liveOverlayOnAvatar) + Positioned( + left: -6, + bottom: -6, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), + decoration: BoxDecoration( + color: const Color(0xFF7A5CFF), + borderRadius: BorderRadius.circular(16), + boxShadow: const [ + BoxShadow(color: Color(0x337A5CFF), blurRadius: 6, offset: Offset(0, 3)), + ], + ), + child: const Text( + '直播中', + style: TextStyle(color: Colors.white, fontSize: 12, fontWeight: FontWeight.w600), + ), + ), + ), + ], + ), + const SizedBox(width: 10), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + const Text( + '林园园', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w700, + color: Color(0xFF333333), + ), + ), + const SizedBox(width: 6), + // 在线徽标 + Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 2), + decoration: BoxDecoration( + color: const Color(0xFFEFFBF3), + borderRadius: BorderRadius.circular(12), + ), + child: const Text( + '在线', + style: TextStyle(fontSize: 12, color: Color(0xFF2ED573)), + ), + ), + const SizedBox(width: 6), + // 实名徽标 + Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 2), + decoration: BoxDecoration( + color: const Color(0xFFF3E9FF), + borderRadius: BorderRadius.circular(12), + ), + child: Row( + children: [ + Image.asset(Assets.imagesVerifiedIcon, width: 12, height: 12), + const SizedBox(width: 4), + const Text( + '实名', + style: TextStyle(fontSize: 12, color: Color(0xFF6C63FF)), + ), + ], + ), + ), + ], + ), + const SizedBox(height: 4), + const Text( + '23岁 · 白云区', + style: TextStyle(fontSize: 16, color: Color(0xFF666666)), + ), + ], + ), + ), + if (showHi) + Image.asset(Assets.imagesHiIcon, width: 64, height: 32), + ], + ); + } +} + +class PlainCard extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12), + boxShadow: const [ + BoxShadow( + color: Color(0x14000000), + blurRadius: 8, + offset: Offset(0, 4), + ), + ], + ), + padding: const EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: const [ + _CardHeader(), + SizedBox(height: 8), + Text( + '我想找一个有缘的异性,快来联系我吧快来……', + style: TextStyle(fontSize: 13, color: Color(0xFF666666)), + ), + ], + ), + ); + } +} + +class ImagesCard extends StatelessWidget { + const ImagesCard(); + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + boxShadow: const [ + BoxShadow( + color: Color(0x14000000), + blurRadius: 12, + offset: Offset(0, 6), + ), + ], + ), + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const _CardHeader(showHi: true), + const SizedBox(height: 10), + const Text( + '我想找一个有缘的异性,快来联系我吧快来……', + style: TextStyle(fontSize: 16, color: Color(0xFF666666)), + ), + const SizedBox(height: 16), + Row( + children: const [ + _BorderedImage(), + SizedBox(width: 12), + _BorderedImage(), + SizedBox(width: 12), + _BorderedImage(), + ], + ), + ], + ), + ); + } +} + +class LiveCard extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12), + boxShadow: const [ + BoxShadow( + color: Color(0x14000000), + blurRadius: 8, + offset: Offset(0, 4), + ), + ], + ), + padding: const EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const _CardHeader(liveOverlayOnAvatar: true), + const SizedBox(height: 8), + const Text( + '正在直播,快来互动~', + style: TextStyle(fontSize: 13, color: Color(0xFF666666)), + ), + const SizedBox(height: 10), + Align( + alignment: Alignment.centerLeft, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 8), + decoration: BoxDecoration( + gradient: const LinearGradient( + colors: [Color(0xFF2D7CFF), Color(0xFF7A5CFF)], + ), + borderRadius: BorderRadius.circular(18), + ), + child: const Text( + '进入直播间', + style: TextStyle(color: Colors.white, fontSize: 14, fontWeight: FontWeight.w600), + ), + ), + ), + ], + ), + ); + } +} + +// 占位组件已被带描边版本替代,保留空实现会触发未使用告警,故移除 + +// 带蓝色描边的图片占位 +class _BorderedImage extends StatelessWidget { + const _BorderedImage(); + + @override + Widget build(BuildContext context) { + return Expanded( + child: AspectRatio( + aspectRatio: 1.05, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(14), + border: Border.all(color: const Color(0xFF5D7BFF), width: 2), + ), + clipBehavior: Clip.antiAlias, + child: Image.asset( + Assets.imagesDiscoverPre, + fit: BoxFit.cover, + ), + ), + ), + ); + } +} diff --git a/lib/pages/main/main_page.dart b/lib/pages/main/main_page.dart index 38d14d4..5e5e6cc 100644 --- a/lib/pages/main/main_page.dart +++ b/lib/pages/main/main_page.dart @@ -46,7 +46,7 @@ class _MainPageState extends State { userController.getHxUserToken(); // 检查token并调用获取婚姻信息详情的方法 - checkTokenAndFetchMarriageInfo(); + // checkTokenAndFetchMarriageInfo(); } // 检查token并获取婚姻信息详情 diff --git a/lib/pages/mine/login_controller.dart b/lib/pages/mine/login_controller.dart new file mode 100644 index 0000000..c192281 --- /dev/null +++ b/lib/pages/mine/login_controller.dart @@ -0,0 +1,174 @@ +import 'dart:async'; +import 'package:dating_touchme_app/pages/main/main_page.dart'; +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:dating_touchme_app/network/user_api.dart'; +import 'package:dating_touchme_app/pages/mine/user_info_page.dart'; + + +class LoginController extends GetxController { + // 手机号输入 + final phoneNumber = ''.obs; + // 验证码输入 + final verificationCode = ''.obs; + // 是否正在发送验证码 + final isSendingCode = false.obs; + // 倒计时秒数 + final countdownSeconds = 0.obs; + // 是否正在登录中 + final isLoggingIn = false.obs; + + // 从GetX依赖注入中获取UserApi实例 + late UserApi _userApi; + // GetStorage实例,用于存储token等信息 + final storage = GetStorage(); + + @override + void onInit() { + super.onInit(); + // 从全局依赖中获取UserApi + _userApi = Get.find(); + } + + // 获取验证码 + Future getVerificationCode() async { + // 验证手机号格式 + if (phoneNumber.value.isEmpty || phoneNumber.value.length != 11) { + SmartDialog.showToast('请输入正确的手机号'); + return; + } + + isSendingCode.value = true; + + try { + // 构建请求参数 + final params = { + 'purpose': 1, // 认证 + 'verifiableAccount': phoneNumber.value, + 'verifiableAccountType': 1, // 手机 + }; + + // 调用UserApi中的验证码接口 + final response = await _userApi.getVerificationCode(params); + + // 处理响应 + if (response.data.isSuccess) { + // 生产环境移除打印,可考虑使用正式的日志框架 + // print('验证码发送成功'); + // 开始倒计时 + startCountdown(); + } else { + SmartDialog.showToast(response.data.message); + } + } catch (e) { + SmartDialog.showToast('网络请求失败,请重试'); + } finally { + isSendingCode.value = false; + } + } + + // 开始倒计时 + void startCountdown() { + countdownSeconds.value = 60; + Timer.periodic(const Duration(seconds: 1), (timer) { + countdownSeconds.value--; + if (countdownSeconds.value <= 0) { + timer.cancel(); + } + }); + } + + // 清除错误信息 - 由于使用SmartDialog,此方法不再需要 + // void clearErrorMessage() {} + + + // 登录方法 + Future login() async { + // 验证输入 + if (phoneNumber.value.isEmpty || phoneNumber.value.length != 11) { + SmartDialog.showToast('请输入正确的手机号'); + return; + } + + if (verificationCode.value.isEmpty) { + SmartDialog.showToast('请输入验证码'); + return; + } + + isLoggingIn.value = true; + + try { + // 构建登录请求参数 + final params = { + 'account': phoneNumber.value, + 'accountType': 2, // 手机号类型 + 'captcha': verificationCode.value, + }; + + // 调用登录接口 + final response = await _userApi.login(params); + + // 处理响应 + if (response.data.isSuccess) { + // 保存token和用户信息 + if (response.data.data != null) { + final loginData = response.data.data!; + await storage.write('token', loginData.token); + await storage.write('userId', loginData.userId); + // 保存用户信息 + await storage.write('userInfo', loginData.toJson()); + + // 登录成功后获取用户基础信息 + await _getBaseUserInfo(loginData.userId); + } + } else { + SmartDialog.showToast(response.data.message); + } + } catch (e) { + SmartDialog.showToast('网络请求失败,请检查网络连接'); + } finally { + isLoggingIn.value = false; + } + } + + // 获取用户基础信息 + Future _getBaseUserInfo(String userId) async { + try { + final response = await _userApi.getBaseUserInfo(userId); + + if (response.data.isSuccess && response.data.data != null) { + // 成功获取基础信息后,调用获取婚姻信息详情接口 + await _getMarriageInformationDetail(); + } else { + SmartDialog.showToast(response.data.message); + } + } catch (e) { + // 获取用户信息失败不影响登录流程 + SmartDialog.showToast('获取用户信息失败'); + } + } + + // 获取用户婚姻信息详情 + Future _getMarriageInformationDetail() async { + try { + final response = await _userApi.getMarriageInformationDetail(); + if (response.data.isSuccess) { + // 检查data是否为null或者是空对象 + if(response.data.data == null){ + //跳转到完善信息 + SmartDialog.showToast('转到完善信息'); + // 导航到完善信息页面 + Get.offAll(() => UserInfoPage()); + }else{ + Get.offAll(MainPage()); + } + } else { + // 获取婚姻信息失败不影响登录流程 + } + } catch (e) { + // 获取婚姻信息失败不影响登录流程 + print('获取婚姻信息异常: $e'); + } + } +} \ No newline at end of file diff --git a/lib/pages/mine/user_info_page.dart b/lib/pages/mine/user_info_page.dart index 2b64714..2466885 100644 --- a/lib/pages/mine/user_info_page.dart +++ b/lib/pages/mine/user_info_page.dart @@ -270,18 +270,22 @@ class UserInfoPage extends StatelessWidget { color: Colors.grey, ), child: ClipOval( - // 根据avatarUrl显示头像,如果为空则显示默认图片 - child: controller.avatarUrl.value.isNotEmpty + child: controller.avatarLocalPath.value.isNotEmpty ? Image.file( - File(controller.avatarUrl.value), + File(controller.avatarLocalPath.value), fit: BoxFit.cover, width: 85, height: 85, ) - : Image.asset( - Assets.imagesAvatarsExample, - fit: BoxFit.cover, - ), + : (controller.avatarUrl.value.startsWith('http') + ? Image.network( + controller.avatarUrl.value, + fit: BoxFit.cover, + ) + : Image.asset( + Assets.imagesAvatarsExample, + fit: BoxFit.cover, + )), ), ), Positioned( diff --git a/pubspec.lock b/pubspec.lock index eb07778..9d3da77 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -6,7 +6,7 @@ packages: description: name: _fe_analyzer_shared sha256: f0bb5d1648339c8308cc0b9838d8456b3cfe5c91f9dc1a735b4d003269e5da9a - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "88.0.0" analyzer: @@ -14,7 +14,7 @@ packages: description: name: analyzer sha256: "0b7b9c329d2879f8f05d6c05b32ee9ec025f39b077864bdb5ac9a7b63418a98f" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "8.1.1" ansicolor: @@ -22,7 +22,7 @@ packages: description: name: ansicolor sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.3" archive: @@ -30,7 +30,7 @@ packages: description: name: archive sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.0.7" args: @@ -38,7 +38,7 @@ packages: description: name: args sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.7.0" async: @@ -46,7 +46,7 @@ packages: description: name: async sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.13.0" boolean_selector: @@ -54,7 +54,7 @@ packages: description: name: boolean_selector sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.2" build: @@ -62,7 +62,7 @@ packages: description: name: build sha256: dfb67ccc9a78c642193e0c2d94cb9e48c2c818b3178a86097d644acdcde6a8d9 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.0.2" build_config: @@ -70,7 +70,7 @@ packages: description: name: build_config sha256: "4f64382b97504dc2fcdf487d5aae33418e08b4703fc21249e4db6d804a4d0187" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.0" build_daemon: @@ -78,7 +78,7 @@ packages: description: name: build_daemon sha256: "409002f1adeea601018715d613115cfaf0e31f512cb80ae4534c79867ae2363d" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.1.0" build_runner: @@ -86,7 +86,7 @@ packages: description: name: build_runner sha256: a9461b8e586bf018dd4afd2e13b49b08c6a844a4b226c8d1d10f3a723cdd78c3 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.10.1" built_collection: @@ -94,7 +94,7 @@ packages: description: name: built_collection sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.1.1" built_value: @@ -102,7 +102,7 @@ packages: description: name: built_value sha256: a30f0a0e38671e89a492c44d005b5545b830a961575bbd8336d42869ff71066d - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "8.12.0" characters: @@ -110,7 +110,7 @@ packages: description: name: characters sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.0" checked_yaml: @@ -118,7 +118,7 @@ packages: description: name: checked_yaml sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.4" clock: @@ -126,7 +126,7 @@ packages: description: name: clock sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.2" code_builder: @@ -134,7 +134,7 @@ packages: description: name: code_builder sha256: "11654819532ba94c34de52ff5feb52bd81cba1de00ef2ed622fd50295f9d4243" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.11.0" collection: @@ -142,7 +142,7 @@ packages: description: name: collection sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.19.1" common_utils: @@ -150,7 +150,7 @@ packages: description: name: common_utils sha256: c26884339b13ff99b0739e56f4b02090c84054ed9dd3a045435cd24e7b99c2c1 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.0" convert: @@ -158,7 +158,7 @@ packages: description: name: convert sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.2" cross_file: @@ -166,7 +166,7 @@ packages: description: name: cross_file sha256: "942a4791cd385a68ccb3b32c71c427aba508a1bb949b86dff2adbe4049f16239" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.3.5" crypto: @@ -174,7 +174,7 @@ packages: description: name: crypto sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.7" csslib: @@ -182,7 +182,7 @@ packages: description: name: csslib sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.2" cupertino_icons: @@ -190,7 +190,7 @@ packages: description: name: cupertino_icons sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.8" dart_style: @@ -198,7 +198,7 @@ packages: description: name: dart_style sha256: c87dfe3d56f183ffe9106a18aebc6db431fc7c98c31a54b952a77f3d54a85697 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.2" decimal: @@ -206,7 +206,7 @@ packages: description: name: decimal sha256: fc706a5618b81e5b367b01dd62621def37abc096f2b46a9bd9068b64c1fa36d0 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.2.4" dio: @@ -214,7 +214,7 @@ packages: description: name: dio sha256: d90ee57923d1828ac14e492ca49440f65477f4bb1263575900be731a3dac66a9 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.9.0" dio_web_adapter: @@ -222,7 +222,7 @@ packages: description: name: dio_web_adapter sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.1" easy_localization: @@ -230,7 +230,7 @@ packages: description: name: easy_localization sha256: "2ccdf9db8fe4d9c5a75c122e6275674508fd0f0d49c827354967b8afcc56bbed" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.8" easy_logger: @@ -238,7 +238,7 @@ packages: description: name: easy_logger sha256: c764a6e024846f33405a2342caf91c62e357c24b02c04dbc712ef232bf30ffb7 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.0.2" event_bus: @@ -246,7 +246,7 @@ packages: description: name: event_bus sha256: "1a55e97923769c286d295240048fc180e7b0768902c3c2e869fe059aafa15304" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.1" fake_async: @@ -254,7 +254,7 @@ packages: description: name: fake_async sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.3.3" ffi: @@ -262,7 +262,7 @@ packages: description: name: ffi sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.4" file: @@ -270,7 +270,7 @@ packages: description: name: file sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "7.0.1" file_selector_linux: @@ -278,7 +278,7 @@ packages: description: name: file_selector_linux sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.9.3+2" file_selector_macos: @@ -286,7 +286,7 @@ packages: description: name: file_selector_macos sha256: "88707a3bec4b988aaed3b4df5d7441ee4e987f20b286cddca5d6a8270cab23f2" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.9.4+5" file_selector_platform_interface: @@ -294,7 +294,7 @@ packages: description: name: file_selector_platform_interface sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.6.2" file_selector_windows: @@ -302,7 +302,7 @@ packages: description: name: file_selector_windows sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.9.3+4" fixnum: @@ -310,7 +310,7 @@ packages: description: name: fixnum sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.1" flustars: @@ -318,7 +318,7 @@ packages: description: name: flustars sha256: "7019ab8d68c0d4759ee122644d91a165d450b0492717f9e7e9d0ce277dcf664b" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.1" flutter: @@ -331,7 +331,7 @@ packages: description: name: flutter_lints sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.0.0" flutter_localizations: @@ -344,7 +344,7 @@ packages: description: name: flutter_native_splash sha256: "4fb9f4113350d3a80841ce05ebf1976a36de622af7d19aca0ca9a9911c7ff002" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.7" flutter_oss_aliyun: @@ -352,7 +352,7 @@ packages: description: name: flutter_oss_aliyun sha256: "8280c1e8dfb792dec6449d1e6052e1d3492b3b3a1dfee456cc41d3f31b4cbc26" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.4.2" flutter_plugin_android_lifecycle: @@ -360,7 +360,7 @@ packages: description: name: flutter_plugin_android_lifecycle sha256: "306f0596590e077338312f38837f595c04f28d6cdeeac392d3d74df2f0003687" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.32" flutter_screenutil: @@ -368,7 +368,7 @@ packages: description: name: flutter_screenutil sha256: "8239210dd68bee6b0577aa4a090890342d04a136ce1c81f98ee513fc0ce891de" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.9.3" flutter_smart_dialog: @@ -376,7 +376,7 @@ packages: description: name: flutter_smart_dialog sha256: "0852df132cb03fd8fc5144eb404c31eb7eb50c22aecb1cc2504f2f598090d756" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.9.8+9" flutter_test: @@ -394,7 +394,7 @@ packages: description: name: frontend_server_client sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.0.0" get: @@ -402,7 +402,7 @@ packages: description: name: get sha256: c79eeb4339f1f3deffd9ec912f8a923834bec55f7b49c9e882b8fef2c139d425 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.7.2" get_storage: @@ -410,7 +410,7 @@ packages: description: name: get_storage sha256: "39db1fffe779d0c22b3a744376e86febe4ade43bf65e06eab5af707dc84185a2" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.1" glob: @@ -418,7 +418,7 @@ packages: description: name: glob sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.3" graphs: @@ -426,7 +426,7 @@ packages: description: name: graphs sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.3.2" hotreloader: @@ -434,7 +434,7 @@ packages: description: name: hotreloader sha256: bc167a1163807b03bada490bfe2df25b0d744df359227880220a5cbd04e5734b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.3.0" html: @@ -442,7 +442,7 @@ packages: description: name: html sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.15.6" http: @@ -450,7 +450,7 @@ packages: description: name: http sha256: bb2ce4590bc2667c96f318d68cac1b5a7987ec819351d32b1c987239a815e007 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.5.0" http_multi_server: @@ -458,7 +458,7 @@ packages: description: name: http_multi_server sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.2.2" http_parser: @@ -466,7 +466,7 @@ packages: description: name: http_parser sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.1.2" im_flutter_sdk: @@ -474,7 +474,7 @@ packages: description: name: im_flutter_sdk sha256: "952bd7a4846d9645adf6bf67c781573aba2825e12bbedfa7bb9f8b234bb1410b" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.15.1" im_flutter_sdk_android: @@ -482,7 +482,7 @@ packages: description: name: im_flutter_sdk_android sha256: d809f8091b24bb70f55c8a1a040f7e0a27aef4756ac71549ce62e460f2151de6 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.15.1" im_flutter_sdk_interface: @@ -490,7 +490,7 @@ packages: description: name: im_flutter_sdk_interface sha256: "82aef6f78bc7e4afc26768631262535b641cc885220981cc9deb871abf14efa8" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.15.1" im_flutter_sdk_ios: @@ -498,7 +498,7 @@ packages: description: name: im_flutter_sdk_ios sha256: "5455ecd4e5877dd289051ca280ffb435d8f7f477a46f32bbb1bfc903dc03952a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.15.1" image: @@ -506,7 +506,7 @@ packages: description: name: image sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.5.4" image_picker: @@ -514,7 +514,7 @@ packages: description: name: image_picker sha256: "736eb56a911cf24d1859315ad09ddec0b66104bc41a7f8c5b96b4e2620cf5041" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.0" image_picker_android: @@ -522,7 +522,7 @@ packages: description: name: image_picker_android sha256: ca2a3b04d34e76157e9ae680ef16014fb4c2d20484e78417eaed6139330056f6 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.8.13+7" image_picker_for_web: @@ -530,7 +530,7 @@ packages: description: name: image_picker_for_web sha256: "40c2a6a0da15556dc0f8e38a3246064a971a9f512386c3339b89f76db87269b6" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.0" image_picker_ios: @@ -538,7 +538,7 @@ packages: description: name: image_picker_ios sha256: e675c22790bcc24e9abd455deead2b7a88de4b79f7327a281812f14de1a56f58 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.8.13+1" image_picker_linux: @@ -546,7 +546,7 @@ packages: description: name: image_picker_linux sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.2" image_picker_macos: @@ -554,7 +554,7 @@ packages: description: name: image_picker_macos sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.2+1" image_picker_platform_interface: @@ -562,7 +562,7 @@ packages: description: name: image_picker_platform_interface sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.11.1" image_picker_windows: @@ -570,7 +570,7 @@ packages: description: name: image_picker_windows sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.2" intl: @@ -578,7 +578,7 @@ packages: description: name: intl sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.20.2" io: @@ -586,7 +586,7 @@ packages: description: name: io sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.5" json_annotation: @@ -594,7 +594,7 @@ packages: description: name: json_annotation sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.9.0" json_serializable: @@ -602,7 +602,7 @@ packages: description: name: json_serializable sha256: "33a040668b31b320aafa4822b7b1e177e163fc3c1e835c6750319d4ab23aa6fe" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.11.1" leak_tracker: @@ -610,7 +610,7 @@ packages: description: name: leak_tracker sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "11.0.2" leak_tracker_flutter_testing: @@ -618,7 +618,7 @@ packages: description: name: leak_tracker_flutter_testing sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.10" leak_tracker_testing: @@ -626,7 +626,7 @@ packages: description: name: leak_tracker_testing sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.2" lean_builder: @@ -634,7 +634,7 @@ packages: description: name: lean_builder sha256: ef5cd5f907157eb7aa87d1704504b5a6386d2cbff88a3c2b3344477bab323ee9 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.1.2" lints: @@ -642,7 +642,7 @@ packages: description: name: lints sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.1.1" logging: @@ -650,7 +650,7 @@ packages: description: name: logging sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.3.0" matcher: @@ -658,7 +658,7 @@ packages: description: name: matcher sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.12.17" material_color_utilities: @@ -666,7 +666,7 @@ packages: description: name: material_color_utilities sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.11.1" meta: @@ -674,7 +674,7 @@ packages: description: name: meta sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.16.0" mime: @@ -682,7 +682,7 @@ packages: description: name: mime sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.6" package_config: @@ -690,7 +690,7 @@ packages: description: name: package_config sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.0" path: @@ -698,7 +698,7 @@ packages: description: name: path sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.9.1" path_provider: @@ -706,7 +706,7 @@ packages: description: name: path_provider sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.5" path_provider_android: @@ -714,7 +714,7 @@ packages: description: name: path_provider_android sha256: e122c5ea805bb6773bb12ce667611265980940145be920cd09a4b0ec0285cb16 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.20" path_provider_foundation: @@ -722,7 +722,7 @@ packages: description: name: path_provider_foundation sha256: efaec349ddfc181528345c56f8eda9d6cccd71c177511b132c6a0ddaefaa2738 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.3" path_provider_linux: @@ -730,7 +730,7 @@ packages: description: name: path_provider_linux sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.1" path_provider_platform_interface: @@ -738,7 +738,7 @@ packages: description: name: path_provider_platform_interface sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.2" path_provider_windows: @@ -746,7 +746,7 @@ packages: description: name: path_provider_windows sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.3.0" permission_handler: @@ -754,7 +754,7 @@ packages: description: name: permission_handler sha256: bc917da36261b00137bbc8896bf1482169cd76f866282368948f032c8c1caae1 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "12.0.1" permission_handler_android: @@ -762,7 +762,7 @@ packages: description: name: permission_handler_android sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "13.0.1" permission_handler_apple: @@ -770,7 +770,7 @@ packages: description: name: permission_handler_apple sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "9.4.7" permission_handler_html: @@ -778,7 +778,7 @@ packages: description: name: permission_handler_html sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.1.3+5" permission_handler_platform_interface: @@ -786,7 +786,7 @@ packages: description: name: permission_handler_platform_interface sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.3.0" permission_handler_windows: @@ -794,7 +794,7 @@ packages: description: name: permission_handler_windows sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.1" petitparser: @@ -802,7 +802,7 @@ packages: description: name: petitparser sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "7.0.1" platform: @@ -810,7 +810,7 @@ packages: description: name: platform sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.6" plugin_platform_interface: @@ -818,7 +818,7 @@ packages: description: name: plugin_platform_interface sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.8" pool: @@ -826,7 +826,7 @@ packages: description: name: pool sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.5.2" posix: @@ -834,7 +834,7 @@ packages: description: name: posix sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.0.3" protobuf: @@ -842,7 +842,7 @@ packages: description: name: protobuf sha256: "826d6a306be26f29e5cd9faeb0c97aad5897270341dab6dbd7b8acd675937006" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.0.0" pub_semver: @@ -850,7 +850,7 @@ packages: description: name: pub_semver sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.0" pubspec_parse: @@ -858,7 +858,7 @@ packages: description: name: pubspec_parse sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.5.0" rational: @@ -866,7 +866,7 @@ packages: description: name: rational sha256: cb808fb6f1a839e6fc5f7d8cb3b0a10e1db48b3be102de73938c627f0b636336 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.3" retrofit: @@ -874,7 +874,7 @@ packages: description: name: retrofit sha256: "7d78824afa6eeeaf6ac58220910ee7a97597b39e93360d4bda230b7c6df45089" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.9.0" retrofit_generator: @@ -882,7 +882,7 @@ packages: description: name: retrofit_generator sha256: "47998fb9f214935e4eb00741aebc636ffcb62cb8ae73b474ac88127ce2744428" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "10.1.2" shared_preferences: @@ -890,7 +890,7 @@ packages: description: name: shared_preferences sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.5.3" shared_preferences_android: @@ -898,7 +898,7 @@ packages: description: name: shared_preferences_android sha256: "34266009473bf71d748912da4bf62d439185226c03e01e2d9687bc65bbfcb713" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.15" shared_preferences_foundation: @@ -906,7 +906,7 @@ packages: description: name: shared_preferences_foundation sha256: "1c33a907142607c40a7542768ec9badfd16293bac51da3a4482623d15845f88b" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.5.5" shared_preferences_linux: @@ -914,7 +914,7 @@ packages: description: name: shared_preferences_linux sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.1" shared_preferences_platform_interface: @@ -922,7 +922,7 @@ packages: description: name: shared_preferences_platform_interface sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.1" shared_preferences_web: @@ -930,7 +930,7 @@ packages: description: name: shared_preferences_web sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.3" shared_preferences_windows: @@ -938,7 +938,7 @@ packages: description: name: shared_preferences_windows sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.1" shelf: @@ -946,7 +946,7 @@ packages: description: name: shelf sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.2" shelf_web_socket: @@ -954,7 +954,7 @@ packages: description: name: shelf_web_socket sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.0" sky_engine: @@ -967,7 +967,7 @@ packages: description: name: source_gen sha256: "9098ab86015c4f1d8af6486b547b11100e73b193e1899015033cb3e14ad20243" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.0.2" source_helper: @@ -975,7 +975,7 @@ packages: description: name: source_helper sha256: "6a3c6cc82073a8797f8c4dc4572146114a39652851c157db37e964d9c7038723" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.3.8" source_span: @@ -983,7 +983,7 @@ packages: description: name: source_span sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.10.1" sp_util: @@ -991,7 +991,7 @@ packages: description: name: sp_util sha256: "9da43dce5de79c17a787d0626bf01538d63090ca32521200d22a232171c495dc" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.3" stack_trace: @@ -999,7 +999,7 @@ packages: description: name: stack_trace sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.12.1" stream_channel: @@ -1007,7 +1007,7 @@ packages: description: name: stream_channel sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.4" stream_transform: @@ -1015,7 +1015,7 @@ packages: description: name: stream_transform sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.1" string_scanner: @@ -1023,7 +1023,7 @@ packages: description: name: string_scanner sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.1" synchronized: @@ -1031,7 +1031,7 @@ packages: description: name: synchronized sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.4.0" term_glyph: @@ -1039,7 +1039,7 @@ packages: description: name: term_glyph sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.2" test_api: @@ -1047,7 +1047,7 @@ packages: description: name: test_api sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.7.6" typed_data: @@ -1055,7 +1055,7 @@ packages: description: name: typed_data sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.0" universal_io: @@ -1063,7 +1063,7 @@ packages: description: name: universal_io sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.2" vector_math: @@ -1071,7 +1071,7 @@ packages: description: name: vector_math sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.0" vm_service: @@ -1079,7 +1079,7 @@ packages: description: name: vm_service sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "15.0.2" watcher: @@ -1087,7 +1087,7 @@ packages: description: name: watcher sha256: "592ab6e2892f67760543fb712ff0177f4ec76c031f02f5b4ff8d3fc5eb9fb61a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.4" web: @@ -1095,7 +1095,7 @@ packages: description: name: web sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.1" web_socket: @@ -1103,7 +1103,7 @@ packages: description: name: web_socket sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.1" web_socket_channel: @@ -1111,7 +1111,7 @@ packages: description: name: web_socket_channel sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.3" xdg_directories: @@ -1119,7 +1119,7 @@ packages: description: name: xdg_directories sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.0" xml: @@ -1127,7 +1127,7 @@ packages: description: name: xml sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.6.1" xxh3: @@ -1135,7 +1135,7 @@ packages: description: name: xxh3 sha256: "399a0438f5d426785723c99da6b16e136f4953fb1e9db0bf270bd41dd4619916" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.0" yaml: @@ -1143,7 +1143,7 @@ packages: description: name: yaml sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.3" sdks: