From e2a488cdf86a64f7313ac2e18adefeec80865f5e Mon Sep 17 00:00:00 2001 From: roxy Date: Wed, 24 Jun 2026 11:35:43 +0800 Subject: [PATCH 1/4] iPhone only --- ios/Runner.xcodeproj/project.pbxproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index d03fab7..e670fa1 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -510,7 +510,7 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = 1; VALIDATE_PRODUCT = YES; }; name = Profile; @@ -647,7 +647,7 @@ MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = 1; }; name = Debug; }; @@ -701,7 +701,7 @@ SUPPORTED_PLATFORMS = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = 1; VALIDATE_PRODUCT = YES; }; name = Release; From 3a6010001db48390b9049a5f1386a2ebac5be5df Mon Sep 17 00:00:00 2001 From: roxy Date: Wed, 24 Jun 2026 11:58:20 +0800 Subject: [PATCH 2/4] iOS 1.0.0+101 --- ios/Runner.xcodeproj/project.pbxproj | 12 ++++++------ ios/Runner/Info.plist | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index e670fa1..b7bf204 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -524,7 +524,7 @@ CODE_SIGN_ENTITLEMENTS = Runner/RunnerRelease.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1631; + CURRENT_PROJECT_VERSION = 101; DEVELOPMENT_TEAM = S9YG87C297; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -533,7 +533,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.6.3; + MARKETING_VERSION = 1.0.0; PRODUCT_BUNDLE_IDENTIFIER = com.org.yumiparty; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -715,7 +715,7 @@ CODE_SIGN_ENTITLEMENTS = Runner/RunnerDebug.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1631; + CURRENT_PROJECT_VERSION = 101; DEVELOPMENT_TEAM = S9YG87C297; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -724,7 +724,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.6.3; + MARKETING_VERSION = 1.0.0; PRODUCT_BUNDLE_IDENTIFIER = com.org.yumiparty; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -744,7 +744,7 @@ CODE_SIGN_ENTITLEMENTS = Runner/RunnerRelease.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1631; + CURRENT_PROJECT_VERSION = 101; DEVELOPMENT_TEAM = S9YG87C297; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -753,7 +753,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.6.3; + MARKETING_VERSION = 1.0.0; PRODUCT_BUNDLE_IDENTIFIER = com.org.yumiparty; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 76689b7..8fab214 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -57,7 +57,7 @@ CFBundleVersion - 100 + 101 LSRequiresIPhoneOS NSCameraUsageDescription From bae5ee44af6c6932ccc2c82e569d83fd89c7ae33 Mon Sep 17 00:00:00 2001 From: roxy Date: Fri, 26 Jun 2026 16:40:25 +0800 Subject: [PATCH 3/4] =?UTF-8?q?iOS=E9=9A=90=E8=97=8F=E5=85=85=E5=80=BC?= =?UTF-8?q?=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/Runner.xcodeproj/project.pbxproj | 6 +- ios/Runner/Info.plist | 2 +- lib/modules/user/me_page2.dart | 25 ++++++++ .../wallet/recharge/recharge_page.dart | 58 +++++++----------- sc_images/index/sc_icon_cp_entry.png | Bin 0 -> 6340 bytes 需求进度.md | 22 +++++++ 6 files changed, 72 insertions(+), 41 deletions(-) create mode 100644 sc_images/index/sc_icon_cp_entry.png diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index b7bf204..0b12671 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -524,7 +524,7 @@ CODE_SIGN_ENTITLEMENTS = Runner/RunnerRelease.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 101; + CURRENT_PROJECT_VERSION = 102; DEVELOPMENT_TEAM = S9YG87C297; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -715,7 +715,7 @@ CODE_SIGN_ENTITLEMENTS = Runner/RunnerDebug.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 101; + CURRENT_PROJECT_VERSION = 102; DEVELOPMENT_TEAM = S9YG87C297; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -744,7 +744,7 @@ CODE_SIGN_ENTITLEMENTS = Runner/RunnerRelease.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 101; + CURRENT_PROJECT_VERSION = 102; DEVELOPMENT_TEAM = S9YG87C297; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 8fab214..ff3b0e0 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -57,7 +57,7 @@ CFBundleVersion - 101 + 102 LSRequiresIPhoneOS NSCameraUsageDescription diff --git a/lib/modules/user/me_page2.dart b/lib/modules/user/me_page2.dart index a9b42e2..795d265 100644 --- a/lib/modules/user/me_page2.dart +++ b/lib/modules/user/me_page2.dart @@ -37,6 +37,8 @@ class MePage2 extends StatefulWidget { class _MePage2State extends State with WidgetsBindingObserver { static const Duration _counterStaleDuration = Duration(seconds: 30); + static const String _cpActivityUrl = + 'https://h5.global-interaction.com/activity/cp-space/yumi.html'; static const String _inviteActivityUrl = 'https://h5.haiyihy.com/app-invite/index.html'; static const double _inviteActivityHorizontalScale = 750 / 662; @@ -299,6 +301,21 @@ class _MePage2State extends State with WidgetsBindingObserver { ); } + void _openCpActivity() { + final cpActivityUrl = _cpActivityUrl.trim(); + if (cpActivityUrl.isEmpty) { + if (kDebugMode) { + debugPrint('[MePage2] cp activity url is empty'); + } + return; + } + + SCNavigatorUtils.push( + context, + "${SCMainRoute.webViewPage}?url=${Uri.encodeComponent(cpActivityUrl)}&showTitle=false", + ); + } + String _appendToken(String url) { final token = AccountStorage().getToken(); if (token.isEmpty) return url; @@ -480,6 +497,14 @@ class _MePage2State extends State with WidgetsBindingObserver { iconPath: 'sc_images/index/sc_icon_bag.png', onTap: () => SCNavigatorUtils.push(context, StoreRoute.bags), ), + SizedBox(width: 10.w), + _buildEntryItem( + title: 'cp', + iconPath: 'sc_images/index/sc_icon_cp_entry.png', + iconWidth: 47, + iconHeight: 50, + onTap: _openCpActivity, + ), ], ); } diff --git a/lib/modules/wallet/recharge/recharge_page.dart b/lib/modules/wallet/recharge/recharge_page.dart index eaa3c30..1eb18a3 100644 --- a/lib/modules/wallet/recharge/recharge_page.dart +++ b/lib/modules/wallet/recharge/recharge_page.dart @@ -37,11 +37,6 @@ class _RechargePageState extends State { context, listen: false, ).initializePaymentProcessor(context); - } else if (Platform.isIOS) { - Provider.of( - context, - listen: false, - ).initializePaymentProcessor(context); } } @@ -60,7 +55,7 @@ class _RechargePageState extends State { .getRechargePageScaffoldBackgroundColor(), resizeToAvoidBottomInset: false, appBar: SocialChatStandardAppBar( - title: SCAppLocalizations.of(context)!.recharge, + title: SCAppLocalizations.of(context)!.wallet, actions: [ GestureDetector( onTap: _showRecordDialog, @@ -83,38 +78,27 @@ class _RechargePageState extends State { _buildWalletSection(), SizedBox(height: 36.w), Expanded( - child: Padding( - padding: EdgeInsets.fromLTRB(12.w, 8.w, 12.w, 0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _buildMethodSection(), - SizedBox(height: 14.w), - Expanded(child: _buildNativeProductList()), - if (Platform.isIOS) ...[ - SizedBox(height: 12.w), - _buildFooterButton( - title: - SCAppLocalizations.of( - context, - )!.restorePurchases, - onTap: () { - Provider.of( - context, - listen: false, - ).recoverTransactions(); - }, + child: + Platform.isIOS + ? const SizedBox.shrink() + : Padding( + padding: EdgeInsets.fromLTRB(12.w, 8.w, 12.w, 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildMethodSection(), + SizedBox(height: 14.w), + Expanded(child: _buildNativeProductList()), + SizedBox(height: 12.w), + _buildFooterButton( + title: + SCAppLocalizations.of(context)!.recharge, + onTap: _processNativePurchase, + ), + SizedBox(height: 14.w), + ], + ), ), - ], - SizedBox(height: 12.w), - _buildFooterButton( - title: SCAppLocalizations.of(context)!.recharge, - onTap: _processNativePurchase, - ), - SizedBox(height: 14.w), - ], - ), - ), ), ], ), diff --git a/sc_images/index/sc_icon_cp_entry.png b/sc_images/index/sc_icon_cp_entry.png new file mode 100644 index 0000000000000000000000000000000000000000..9b2c19d72845b8a1ca60795ce35fe21fba394f95 GIT binary patch literal 6340 zcmV;#7(3^QP)E?0USbo6Bu+v?OcD|T z*_sIyXjle%;kGQ(p)-`ZmwD#t&2;Xxoo709nd#6%VSuts*-L;V5D3|K$5|XFcI16u zB-@fK$y&ZSlC0Pce2yZ0+xwmOyyyJS|D5wF#*#c$Q4~})3@FIY=y!Zm!(kMSCi)#Y z8M{`Eo>P=r*U7Q?e&n}atKqq4?&AkPe|^q9@hx&`{80S-_22R9BJzYqK8>Q8KCVWO zY2pIL1XiO1MlQH^vnF;!KHfoYANnU6J@hG#c$3ZGW?-6v|Q*HkYS!@}>XJ zlk2Of%1I;?RS?tTXowFJxjs6+I(G%*<3$xY{XO%{*jSplmNjt=Gkb}Z=!C-44_0H# zGD~~02Sxv;rHNd-q^_E}`a=1gNl|GMX*O%@x>;ry87348&5WzWbQ>QhqNupA@z2aN zW6IR((^7WEPecd4POGusbC-Fx#v)o+zia`%sQ@0IpJ$)^F8_CP6(M~secEhNl9IT+ zIvGuZnUl@ERL?7Hjl9SH7vj0 zgr0xqUUEA3Fwou3@$N9CH>~82)wvwpbCgNH44f9M;cNiXnMWfo1Dxy6>s)8P~* z#|9$HNYzct*!!iO3r7yHsz6UxQ8~xMxjgsh^UPIb%!J}AbiI;w8m;D%p6nnyZNYRXUplhhm2 zaGdKPO%rBva*B_4pXA?m_lhrManci@&fdiR-(STql?&HFV%*=9IX)3Tuhpg|?c{5l zAco(LRvTnl~YBxSezNwEu_b9G0g^r$1?(Vm+ zBVA9${CO0uxSwRJmMblG_O*vemdX5Na{*NaDVU8@yxlPJHI$hfoR|Z*-)Qp+Gg_Y$ zH01Not2J!iP$U7u!mhIuv<|A+8!obSshRm{I$Vl{a~FE3sLEoHWacGJ(R8Vwm5bBK zPB*ddOfO$G2C>#IrZUmV?TeF8gH!zO<8EGVQm&cDH_?RImOSmS`Rd%L%C(y#+k*0Z z9=Ll8^$YT-sVG7*g+&~lBlP?B!L6%KK||L?c|!$C`^a4`n$zL(ij_ZFw*=HEys`I_m5yS zY6RwzC|kCcl!6M{8b9a9|L`)^*|2^46291bj?xxN=A)bQo>OL&Of< zUIV2!Z6&>OEhbZt*28Zy(B4Txf}T&$cJabKJDYCI(X2rkDuWD**@yG+|C_$u0x-;fTq1~^X~IM;n8e3FcCQ=Wz!iY(mm z*iV?h_IBEiz02!1IT*^F1KwI=V3?_?)xxuYxr?PxRa z?K($h`8>Y+=tc|~<$U(a@A;3P|10lY2+`!xGcKkxnV5**lt56lRFt2?o=f9gZ9L1$ zW%Ic2q1$=o)uTN9qwTacHSp8le8jsKL!=buvZOKvLvjjzVJ#D?o~9v{rY;|@roAL4 zTDWn;7X1C^xMX*5?&KA!b9IaljdS#pAXIS1@U;fvHj&*ztA+oaSxD}Z?F@LrTpf1u zqaW_ToTla2uFv`HbH8Ixw~h(nD#*2p#e~*kB+;y6-Qq=j|E?uW6i43M-4#`P-Xw$ua6_2=$SpN#khy7~NNTs4del z;S6!>+NC`5{rfPOvhnnu!(^EvF{=`-dxRQmnEfpdyc&Jf1V_d~xca)-^zHRH>@E1l zC&1&N@ejLMC#y76oy%2Og(z)_u*%31IQlzSS!yDwAjEq|M%b|721@eHv|Q@qwOtL^ zr;I2fcvur*lL}8rlCkH-U$eU0MpJV;M}w2xW5}j9&qu(N!SVJ{Ixcpxal>kg%8MD3 zsM~htFnJ4B;B>h0yFD0fHgdA`_*`NV_6hM{jUbb#)a|5hVKEs=D&1|p>^j)N_S-U1 za#H!dn3C5Yj0Gv3*nDxOg{SWO7P;kFT<)E~sn@b*~{6=FmAVvJ; zp+#x@;_1!!T?4%O#btcn0oG@x({}kX^$$NuMXJiY>_lET*3XsWXQ?i>P_;Ny96VyX z4vboPu;O9x@+C%kM=*@_@ZlvdIzb<8glbDPUyzqbaju!Jj=`u;6fUU3S|Z4oZRX05 z7nek8O@5Y@-~Zrdvc?Y4-gJlufB3)ntA}pJHPVh}Vw~>Y9wx#u3ZV*Ko2I7t`|b0X z8ttLG;XFonJLaS?&apn$?AX9WZyQ+^dC=1?P^ROAF9A!26_Y?xu0-12juD)Fo!C#d z(BC^s*z3mS389Y!r6{EZui(GSBZ%bnMWON5c`D1+tfR00DvQ%S{Ouj(QHRy6yRi&g zcnI^9O9b+8VgGydv~=Nf4B{Sh3EnDEJdSSSC^zJoB=k>l;-H;f?Sj1%gII?B+)!62 zp45dw9mHnwPNCkT&86RA5TXNyr|&*(VAqf_i}wqx`A$j?k;*}C}zTrMGY2?QqXSQ5i@PJ{@H zW9!2TIl1Ws10g0olVa0BjOIkLvlWu`L58~f`JzQkK+#|0f)OytPZQ{LDWq8RygR6; z&_9SXoQSD;khR;^l5HABV>3&z@kgc{>TwEJ7Y)0n$V^X>C65IZMKY%e zcL4kOi`azfCMB4tUAdg(f?BML@8bBe%LF8FX$(fbvtuM|X5*#>Hhhy_+!HQb z6K+AEF-AoRPPZS&WSDMGY-N>c8k}qhlb)W1b9@p^Ho`>}yxDEx=uiag^yrgP$jh>! zamxUSNfyehMcdjKe;9Cwq9NDq@?uNYlb0+4iS&`rEeo?TC7G!zO`(44D#pYKPwsEz z`5*p`+#eL7+zi;o!AJW@_KtF)sh`K5{e(%s!lc(P+V@4xA(9nY)6E#OZIaVU+=yt0 za5R4ATMg0ukx>^(qIvt(o~T?parDXpF{7ZET}b3Pd7%TpXM*CK49aXeHq?~}OoRBSxLM(+yQlyidV$&@Pa1QrVwxF86 zjuyVX{zeuRB~g{BrD91fURjWfS3A&M>~Ya>zL!O1X*^cj!VSxEagW2nPe&=P(u=c9 zv9`8`502V-sy>6hmR5R4{ZxrbeD?7HOo|tWDz<2lm6F6FQe5(RebGq_OYW){p#ly$ttdV|Kh>Qf`IfaRIw>y{`7Q`ENvu2T% zZ`CcO`S=l%M9F7Px6|6^M0ch?z{&GnEM8c|vZ`_+M4xfF-$$Qc(zAj|EE1|6gFQU8 zu@oe^@?zH9T*=WtUF4`gh0;Mkx6Cs#>Kvh{s0@F%j~=I& z3~MS*apr>J914XV^k3}~6Kcn%X7NFzm#K)r5y|zsSeZ}kPissdL+Hfn6}8lDy&W|v zpZ=acK79KC&F7jKbULsmrSZu23VP*uY9hRH*vT<>A`cd6*|L5S);t5pFAVYG!S0w3 zM0C?Oq4H6KgDjgcx}}voS6sq(fAtl+M380K8getzXccq0p{^eNfiEPExM{b0S#$3W zdiU>U)yidfCWi^=1yK#UXbDtRVl+Y5r94j3v2Ijw!K( zd#Vhqou4ervxtyqoPT=pD?0nUJhCnw)o5XOT%|5&5iuscJ}R{E0n7#szkGZh z#fDLuo4YAU)9~Xx6Ktt9@a&`O2_z(Q@bhz$b`JAK;{@@vH7a~OQ#Wc=))psl=X`C{ zAyWm%UwrczBVKQGQa(j82eS>EL7_B9gU4JTNreH%d$H!`pcM$SUl}ApAn&;^J1I8@ z*s--n0#%4-pFhc0z4BCp2rWLKL{~(?pi}twN7hoA>Y}}^2b;;q>wEj9E>y_6zqpOA zu1*>oJ4NV8j&}R!q^ZIxW64OwG()OFn^4$+fpHv7t+LvFmMtrn?_>_2?xempS%S=@ z1Q#F8-EK}dv|ux9sk?16=Z>F};B^ISijm?~t0Y3Zn4hi^o*3r!Jy-a0Faf_VqHVEM zU8Fh@5gdN};7V$(UV1uuagUC0^s<{Rs~1zcpp?Om^PK+jEH9o5(l8XBRdiD0)q}X^ zV;Rb$x7V_^P=_i^&ll3t(d(qPG7FQK&AHQ!EEU-5b%4+9rb$rgl_M?|q$~W@rUI_m zhe?&>hb@sN{k5{J}D7)JtHH8$Zu!OjWKD)h+I^i#l{(iyx5%Gx<(y}rLO?pINJ!e~n z_|wS&JR_4b-c|}Ue!gm%h*qNGHm}vBT6V_k^7-Zon_oP!jZ9&nVV?uN-$BvBC4yEHLPvrGLjkTx)E?+}b9TZ=t3>G>cMoal z$$Zi{$b>f#E4Ip?R+pN*Gu|8+as{Zg2rbZCqNuP;gEz_FoxgwKprnUhY6`TR?opz({Mn`PYYBLK6S78+gy@?jH(hS? zP#|g7SodX)eRWQ9*!d(R=QA{JVcC*W{DWNr(|%5$came%3Z2Lzbaq4tnUfU1ALGz4 z{(zs32?yCW1C^W0INvZJ@SZ?+P7;~o7iEiXW+;%2)t1M=NCKb!@hvhfW4Hv-GR3D_ zCKEW<<(*Tni5Ff)c+1ZCp@+BJOs3jTqQ%UktMepBouFHSMtk=-xm7j1`|+3j>eGvo zQH=;`Dl>D1EQ8Pb--@SH%Mf1~0EhuJCYL%-cux!(&(kHqdQ>9+>7qtwH2#s)r z+41By%iaxs0;M~~e{joHd+uai3;Sju~%yS6Rks=bH(5;s~0 zR4OxcCvaI?%165!xv|2A&SYZ2(uJhtE#wz3zsEZ#`{oKC2Y;(% zFn5)QDY7QeCJ=Q{YBdi?FKI-`*p0Q>jLGtTdZLx9=sT`V)RiVIqC9wiDc!a zOIfdv+9ee-GhC6ez2W; zR%J_c_ES(%O~v9`9OF~$ld{N9cXv>i>SyuI#iVb1oY!Cf0~U$aJJwh5(*rIh11dA! z`I!cDlpbhPEIYrc1E?sm>}GkcmaCEuemQ98;K>7I3%n&uhnc?kb&T=hu}%gh zM@gw#j8bMf(lN#tr>}^$4-3>zvhRwAmH9!A z+a)MnJkF@gNtwlfRfyZ+uE3lg?6qF;^fAHtq@Bu4O@B_E-XDxLduuZccvs9PdubUp zQiS@XU5g}Gq)6}z2jPvgZjSbZIN3YJBAKiNP&O_pL91r6uq2fU*BB#`H|8VogmF2mkvrH&<_>x&H_YZnN^y#Q>wy z1>D^{9(%DOk{-^y@<2_7hQ(Qm#1!c;j`%s!HQjZe)fK${g^g?Iju|e8(Zfw2_vVKYhCi#E#c{QW31(pCuIw-WI}gV8dxq7_DD}R zA4)UAAPzL_311sWnbVq_S%R>7{Tm+N{BlNQ(|!Fd4x;JX>@BX5>8H+gprgk$GpiuPIu4eDq-&a%#G38u6uPrjn;D1>)ua@kMTbW>%iwlHCgNc0000 4 -> 1 -> 4` 这类来回闪动。 - 已按 2026-04-20 最新调整撤掉 `Wallet -> Recharge` 中新增的 MiFaPay 第三方支付 UI 与页面逻辑:当前充值页仅保留原生 `Google Pay / Apple Pay` 入口与商品列表,`Recharge methods` 区域也已收敛为单一原生支付卡片;此前接入的 MiFaPay 方法选择、底部弹窗、H5 收银台页以及对应页面级状态管理已从现有充值链路移除,避免继续对当前版本产生影响。 +- [x] 2026-06-26 App Review 收口:已调整 `Wallet -> Recharge` 页面,iOS 仅展示钱包余额,不再初始化/展示 Recharge methods、商品空态、恢复购买和充值按钮;顶部标题改为 Wallet,页面静态检查通过。 +- [x] 2026-06-26 iOS 提审版本号调整:Runner 的 `MARKETING_VERSION` 保持 `1.0.0`,`CFBundleVersion` / `CURRENT_PROJECT_VERSION` 已调整为 `102`,对应 App Store Connect 显示 `1.0.0 (102)`。 - 已按 2026-04-18 联调要求继续收口幸运礼物链路:项目默认 API host 已临时切到 `http://192.168.110.43:1100/` 方便直连测试环境;`/gift/give/lucky-gift` 请求体也已补齐为最新结构,除原有 `giftId/quantity/roomId/acceptUserIds/checkCombo` 外,会稳定携带 `gameId: null`、`accepts: []`、`dynamicContentId: null`、`songId: null` 这几组字段,便于和当前后端参数定义保持一致。 - 已继续补齐 `GAME_LUCKY_GIFT` 的 socket 播报与中奖动效:房间群消息收到该类型后,现在会统一落聊天室中奖消息、奖励弹层队列与发送者余额回写,不再只在 `3x+` 时才触发顶部奖励动画;同时全局飘窗已改为按服务端 `globalNews` 字段决定是否展示,避免再用前端本地倍率硬编码去猜。 - 已按最新 UI 口径重排幸运礼物中奖展示:顶部 `LuckGiftNomorAnimWidget` 不再叠加大头像、倍率和奖励框,只在“单个礼物倍率 `>= 10x`”或“单次中奖金币 `> 5000`”时负责播全屏 `luck_gift_reward_burst.svga`;原本的 `luck_gift_reward_frame.svga` 已改挂到房间礼物播报条最右侧,并在框内显示 `+formattedAwardAmount`,金额文案直接复用此前大头像下方那一份中奖金币额。 From a44bdd7287511964568098986c19e62293e53139 Mon Sep 17 00:00:00 2001 From: roxy Date: Thu, 2 Jul 2026 19:13:13 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=B5=84=E6=96=99?= =?UTF-8?q?=E5=8D=A1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/modules/room/online/room_online_page.dart | 3 +- .../room/rank/room_gift_rank_tab_page.dart | 59 +++++---- lib/services/audio/rtc_manager.dart | 10 +- lib/services/auth/user_profile_manager.dart | 78 +++++------ lib/ui_kit/widgets/room/empty_mai_select.dart | 6 +- .../widgets/room/room_user_info_card.dart | 123 +++++++++++++++--- 6 files changed, 165 insertions(+), 114 deletions(-) diff --git a/lib/modules/room/online/room_online_page.dart b/lib/modules/room/online/room_online_page.dart index 0c989b6..af9b51d 100644 --- a/lib/modules/room/online/room_online_page.dart +++ b/lib/modules/room/online/room_online_page.dart @@ -13,7 +13,6 @@ import '../../../ui_kit/components/sc_page_list.dart'; import '../../../ui_kit/components/sc_tts.dart'; import '../../../ui_kit/components/text/sc_text.dart'; import '../../../ui_kit/widgets/id/sc_special_id_badge.dart'; -import '../../../shared/tools/sc_lk_dialog_util.dart'; import '../../../ui_kit/widgets/badge/sc_user_badge_strip.dart'; import '../../../ui_kit/widgets/room/room_user_info_card.dart'; @@ -44,7 +43,7 @@ class _RoomOnlinePageState if (dialogContext == null) { return; } - showBottomInBottomDialog(dialogContext, RoomUserInfoCard(userId: userId)); + RoomUserInfoCard.showPreloaded(dialogContext, userId: userId); }); } diff --git a/lib/modules/room/rank/room_gift_rank_tab_page.dart b/lib/modules/room/rank/room_gift_rank_tab_page.dart index 36e9f2a..49a644c 100644 --- a/lib/modules/room/rank/room_gift_rank_tab_page.dart +++ b/lib/modules/room/rank/room_gift_rank_tab_page.dart @@ -1,11 +1,11 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:yumi/shared/business_logic/models/res/login_res.dart'; -import 'package:yumi/shared/data_sources/sources/local/user_manager.dart'; -import 'package:yumi/shared/data_sources/sources/repositories/sc_room_repository_imp.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:yumi/shared/business_logic/models/res/login_res.dart'; +import 'package:yumi/shared/data_sources/sources/local/user_manager.dart'; +import 'package:yumi/shared/data_sources/sources/repositories/sc_room_repository_imp.dart'; import 'package:yumi/main.dart'; import 'package:yumi/app_localizations.dart'; @@ -13,7 +13,6 @@ import 'package:yumi/ui_kit/components/sc_compontent.dart'; import 'package:yumi/ui_kit/components/sc_page_list.dart'; import 'package:yumi/ui_kit/components/text/sc_text.dart'; import 'package:yumi/ui_kit/components/sc_tts.dart'; -import 'package:yumi/shared/tools/sc_lk_dialog_util.dart'; import 'package:yumi/shared/business_logic/models/res/room_gift_rank_res.dart'; import 'package:yumi/ui_kit/widgets/id/sc_special_id_badge.dart'; import 'package:yumi/ui_kit/widgets/room/room_user_info_card.dart'; @@ -98,11 +97,11 @@ class _RoomGiftRankTabPageState // headdress: userInfo.userProfile?.getHeaddress()?.sourceUrl, ), onTap: () { - showBottomInBottomDialog( - navigatorKey.currentState!.context, - RoomUserInfoCard(userId: userProfile?.id), - ); SmartDialog.dismiss(tag: "showRoomGiftRankPage"); + RoomUserInfoCard.showPreloaded( + navigatorKey.currentState!.context, + userId: userProfile?.id, + ); }, ), SizedBox(width: 3.w), @@ -119,7 +118,7 @@ class _RoomGiftRankTabPageState needScroll: (userProfile?.userNickname?.characters.length ?? 0) > - 14, + 14, ), ], ), @@ -137,7 +136,7 @@ class _RoomGiftRankTabPageState animationHeight: 24.w, showTextBesideAnimated: true, animatedTextSpacing: 0, - showAnimatedGradientText: + showAnimatedGradientText: userProfile ?.shouldShowColoredSpecialIdText() ?? false, @@ -195,24 +194,24 @@ class _RoomGiftRankTabPageState SocialChatUserProfile? _mergeCurrentUserVip( SocialChatUserProfile? profile, ) { - if (profile == null || profile.vipLevelForColoredId > 0) { - return profile; - } - final currentProfile = AccountStorage().getCurrentUser()?.userProfile; - if (currentProfile == null || - currentProfile.vipLevelForColoredId <= 0 || - currentProfile.id != profile.id) { - return profile; - } - return profile.copyWith( - vipLevel: - currentProfile.vipLevel ?? - currentProfile.vipLevelForColoredId.toString(), - ); - } - - @override - empty() { + if (profile == null || profile.vipLevelForColoredId > 0) { + return profile; + } + final currentProfile = AccountStorage().getCurrentUser()?.userProfile; + if (currentProfile == null || + currentProfile.vipLevelForColoredId <= 0 || + currentProfile.id != profile.id) { + return profile; + } + return profile.copyWith( + vipLevel: + currentProfile.vipLevel ?? + currentProfile.vipLevelForColoredId.toString(), + ); + } + + @override + empty() { return mainEmpty( image: Image.asset( 'sc_images/general/sc_icon_loading.png', diff --git a/lib/services/audio/rtc_manager.dart b/lib/services/audio/rtc_manager.dart index a8450a6..c6272da 100644 --- a/lib/services/audio/rtc_manager.dart +++ b/lib/services/audio/rtc_manager.dart @@ -5197,10 +5197,7 @@ class RealTimeCommunicationManager extends ChangeNotifier { if (clickUser.id == AccountStorage().getCurrentUser()?.userProfile?.id) { ///是自己,直接打开资料卡 - showBottomInBottomDialog( - context!, - RoomUserInfoCard(userId: clickUser.id), - ); + RoomUserInfoCard.showPreloaded(context!, userId: clickUser.id); } else { showBottomInBottomDialog( context!, @@ -5441,10 +5438,7 @@ class RealTimeCommunicationManager extends ChangeNotifier { if (normalizedUserId.isEmpty) { return; } - showBottomInBottomDialog( - context!, - RoomUserInfoCard(userId: normalizedUserId), - ); + RoomUserInfoCard.showPreloaded(context!, userId: normalizedUserId); } addSoundVoiceChangeListener(OnSoundVoiceChange onSoundVoiceChange) { diff --git a/lib/services/auth/user_profile_manager.dart b/lib/services/auth/user_profile_manager.dart index d5adb4e..6b640ee 100644 --- a/lib/services/auth/user_profile_manager.dart +++ b/lib/services/auth/user_profile_manager.dart @@ -250,7 +250,7 @@ class SocialChatUserProfileManager extends ChangeNotifier { return sessionSerial; } - Future roomUserCard( + Future roomUserCard( String roomId, String userId, { int? sessionSerial, @@ -272,36 +272,31 @@ class SocialChatUserProfileManager extends ChangeNotifier { isUserCardLoading = false; notifyListeners(); } - return; + return null; } try { - RoomUserCardRes? card = await SCChatRoomRepository().roomUserCard( - normalizedRoomId, - normalizedUserId, + final card = await _loadHydratedRoomUserCard( + roomId: normalizedRoomId, + userId: normalizedUserId, ); - if (requestSerial != _userCardRequestSerial) { - return; + if (requestSerial != _userCardRequestSerial || + activeSessionSerial != _activeUserCardSessionSerial) { + return null; } userCardInfo = card; userCardLoadError = null; isUserCardLoading = false; - isUserCardRelationLoading = card.userProfile != null; + isUserCardRelationLoading = false; notifyListeners(); - unawaited( - _hydrateRoomUserCard( - card: card, - userId: normalizedUserId, - requestSerial: requestSerial, - sessionSerial: activeSessionSerial, - ), - ); + return card; } catch (error, stackTrace) { if (requestSerial != _userCardRequestSerial) { - return; + return null; } userCardInfo = null; userCardLoadError = error; + isUserCardRelationLoading = false; _debugProfileLoadFailure( scope: 'roomCard', userId: normalizedUserId, @@ -314,6 +309,23 @@ class SocialChatUserProfileManager extends ChangeNotifier { notifyListeners(); } } + return null; + } + + Future preloadRoomUserCardForOpen( + String roomId, + String userId, { + int? sessionSerial, + }) { + return roomUserCard(roomId, userId, sessionSerial: sessionSerial); + } + + Future _loadHydratedRoomUserCard({ + required String roomId, + required String userId, + }) async { + final card = await SCChatRoomRepository().roomUserCard(roomId, userId); + return _withCurrentVipLevelForCard(card, userId); } Future _hydrateUserInfoById({ @@ -340,38 +352,6 @@ class SocialChatUserProfileManager extends ChangeNotifier { } } - Future _hydrateRoomUserCard({ - required RoomUserCardRes? card, - required String userId, - required int requestSerial, - required int sessionSerial, - }) async { - try { - final hydratedCard = await _withCurrentVipLevelForCard(card, userId); - if (requestSerial != _userCardRequestSerial || - sessionSerial != _activeUserCardSessionSerial || - hydratedCard == null) { - return; - } - userCardInfo = hydratedCard; - userCardLoadError = null; - isUserCardRelationLoading = false; - notifyListeners(); - } catch (error, stackTrace) { - if (requestSerial == _userCardRequestSerial && - sessionSerial == _activeUserCardSessionSerial) { - isUserCardRelationLoading = false; - notifyListeners(); - } - _debugProfileLoadFailure( - scope: 'roomCardHydrate', - userId: userId, - error: error, - stackTrace: stackTrace, - ); - } - } - void clearRoomUserCard({int? sessionSerial}) { if (sessionSerial != null && sessionSerial != _activeUserCardSessionSerial) { diff --git a/lib/ui_kit/widgets/room/empty_mai_select.dart b/lib/ui_kit/widgets/room/empty_mai_select.dart index 1b192f4..f83ecfa 100644 --- a/lib/ui_kit/widgets/room/empty_mai_select.dart +++ b/lib/ui_kit/widgets/room/empty_mai_select.dart @@ -9,7 +9,6 @@ import 'package:yumi/ui_kit/widgets/room/room_user_info_card.dart'; import 'package:provider/provider.dart'; import 'package:yumi/app/constants/sc_room_msg_type.dart'; import 'package:yumi/app/constants/sc_screen.dart'; -import 'package:yumi/shared/tools/sc_lk_dialog_util.dart'; import 'package:yumi/shared/data_sources/sources/local/user_manager.dart'; import 'package:yumi/shared/business_logic/models/res/mic_res.dart'; import 'package:yumi/services/audio/rtc_manager.dart'; @@ -266,10 +265,7 @@ class EmptyMaiSelect extends StatelessWidget { context, () { Navigator.of(context).pop(); - showBottomInBottomDialog( - context, - RoomUserInfoCard(userId: clickUser?.id), - ); + RoomUserInfoCard.showPreloaded(context, userId: clickUser?.id); }, ), ); diff --git a/lib/ui_kit/widgets/room/room_user_info_card.dart b/lib/ui_kit/widgets/room/room_user_info_card.dart index dd04730..baecda2 100644 --- a/lib/ui_kit/widgets/room/room_user_info_card.dart +++ b/lib/ui_kit/widgets/room/room_user_info_card.dart @@ -48,8 +48,91 @@ import '../../../modules/chat/chat_route.dart'; class RoomUserInfoCard extends StatefulWidget { final String? userId; + final String? roomId; + final int? sessionSerial; + final bool preloaded; - const RoomUserInfoCard({super.key, this.userId}); + const RoomUserInfoCard({ + super.key, + this.userId, + this.roomId, + this.sessionSerial, + this.preloaded = false, + }); + + static int _openRequestSerial = 0; + + static Future showPreloaded( + BuildContext context, { + required String? userId, + }) async { + final normalizedUserId = (userId ?? '').trim(); + if (normalizedUserId.isEmpty) { + return; + } + final openSerial = ++_openRequestSerial; + final sourceRoomId = _resolveCurrentRoomId(context); + final dialogContext = navigatorKey.currentState?.context ?? context; + final userProvider = Provider.of( + dialogContext, + listen: false, + ); + final roomId = + sourceRoomId.isNotEmpty + ? sourceRoomId + : _resolveCurrentRoomId(dialogContext); + final sessionSerial = userProvider.beginRoomUserCardSession(); + SCLoadingManager.show(); + room_card.RoomUserCardRes? card; + try { + card = await userProvider.preloadRoomUserCardForOpen( + roomId, + normalizedUserId, + sessionSerial: sessionSerial, + ); + } finally { + if (openSerial == _openRequestSerial) { + SCLoadingManager.hide(); + } + } + if (openSerial != _openRequestSerial) { + return; + } + final latestDialogContext = navigatorKey.currentState?.context ?? context; + if (!latestDialogContext.mounted) { + userProvider.clearRoomUserCard(sessionSerial: sessionSerial); + return; + } + if (card == null) { + userProvider.clearRoomUserCard(sessionSerial: sessionSerial); + SCTts.show( + SCAppLocalizations.of(latestDialogContext)?.loadingFailedClickToRetry ?? + 'Loading failed, click to retry', + ); + return; + } + showBottomInBottomDialog( + latestDialogContext, + RoomUserInfoCard( + userId: normalizedUserId, + roomId: roomId, + sessionSerial: sessionSerial, + preloaded: true, + ), + ); + } + + static String _resolveCurrentRoomId(BuildContext context) { + try { + return Provider.of( + context, + listen: false, + ).currenRoom?.roomProfile?.roomProfile?.id ?? + ""; + } catch (_) { + return ""; + } + } @override State createState() => _RoomUserInfoCardState(); @@ -76,12 +159,16 @@ class _RoomUserInfoCardState extends State { context, listen: false, ); - WidgetsBinding.instance.addPostFrameCallback((_) { - if (!mounted) { - return; - } - _loadRoomUserCard(); - }); + roomId = widget.roomId?.trim() ?? ""; + _userCardSessionSerial = widget.sessionSerial; + if (!widget.preloaded) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted) { + return; + } + _loadRoomUserCard(); + }); + } SCAccountRepository().userIdentity(userId: widget.userId).then((v) { if (!mounted) { return; @@ -96,12 +183,7 @@ class _RoomUserInfoCardState extends State { context, listen: false, ); - roomId = - Provider.of( - context, - listen: false, - ).currenRoom?.roomProfile?.roomProfile?.id ?? - ""; + roomId = RoomUserInfoCard._resolveCurrentRoomId(context); final sessionSerial = userProvider?.beginRoomUserCardSession(); _userCardSessionSerial = sessionSerial; userProvider?.roomUserCard( @@ -244,12 +326,13 @@ class _RoomUserInfoCardState extends State { required bool relationLoading, }) { final defaultSheetHeight = screenHeight * _profileSheetHeightFactor; + final compactBadgeHeightDelta = 10.w; if (relationLoading) { - return defaultSheetHeight; + return defaultSheetHeight + compactBadgeHeightDelta; } final hasCpRelation = _hasCpRelation(profile); final hasCloseFriends = _closeFriendProfileData(profile).isNotEmpty; - var resolvedHeight = defaultSheetHeight; + var resolvedHeight = defaultSheetHeight + compactBadgeHeightDelta; if (!hasCpRelation) { resolvedHeight -= 126.w; } @@ -602,16 +685,16 @@ class _RoomUserInfoCardState extends State { ) { return SizedBox( width: double.infinity, - height: 20.w, + height: 30.w, child: Center( child: SCUserBadgeStrip( userId: userId, fallbackBadges: _roomCardFallbackBadges(ref, profile), displayScope: SCUserBadgeDisplayScope.short, - height: 20.w, - badgeHeight: 20.w, - longBadgeWidth: 44.w, - spacing: 5.w, + height: 30.w, + badgeHeight: 28.w, + longBadgeWidth: 62.w, + spacing: 6.w, maxBadges: 3, wrap: false, reserveSpace: false,