From 61f54ab51d8c2a96651dd9bd4144f40b3f46534f Mon Sep 17 00:00:00 2001 From: CYH <13923927013@163.com> Date: Thu, 28 Mar 2024 18:05:55 +0800 Subject: [PATCH] =?UTF-8?q?2.0.3=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- circle_app/android/app/build.gradle | 4 +- circle_app/assets/images/base/vip_fun_10.png | Bin 0 -> 15528 bytes circle_app/assets/images/base/vip_fun_11.png | Bin 0 -> 16793 bytes circle_app/assets/images/base/vip_fun_12.png | Bin 0 -> 18577 bytes circle_app/assets/images/base/vip_fun_13.png | Bin 0 -> 13595 bytes circle_app/assets/images/base/vip_fun_14.png | Bin 0 -> 16385 bytes circle_app/ios/Podfile | 1 + circle_app/ios/Podfile.lock | 2 +- ..._uikit_chat_history_message_list_item.dart | 4 - circle_app/lib/app/chat/view.dart | 4 + .../chat/widget/chat_circle_share_dialog.dart | 3 +- .../lib/app/chat/widget/welcome_dialog.dart | 301 ++++++++++ circle_app/lib/app/circle/logic.dart | 28 +- circle_app/lib/app/circle/view.dart | 52 +- .../lib/app/circle/widgets/discover.dart | 26 +- .../app/circle/widgets/info_list_view.dart | 11 +- .../lib/app/circle/widgets/like_view.dart | 6 - .../lib/app/circle/widgets/new_people.dart | 2 + .../lib/app/circle/widgets/vicinity.dart | 28 +- circle_app/lib/app/circle_list/view.dart | 7 +- circle_app/lib/app/friendslist/logic.dart | 85 ++- circle_app/lib/app/friendslist/view.dart | 381 +++++++++---- circle_app/lib/app/home/logic.dart | 7 + circle_app/lib/app/minefragment/view.dart | 4 +- .../tim_uikit_conversation.dart | 2 - .../app/msg/recommend_circle_friend_item.dart | 2 - circle_app/lib/app/msg/view.dart | 2 - circle_app/lib/app/my_circle/view.dart | 2 - circle_app/lib/app/offaccount/view.dart | 30 +- circle_app/lib/app/setup/view.dart | 2 + circle_app/lib/app/swiper/view.dart | 13 + circle_app/lib/app/userinfo/view.dart | 15 +- circle_app/lib/app/visitorlist/logic.dart | 96 +++- circle_app/lib/app/visitorlist/view.dart | 538 ++++++++++-------- .../widget/visitors_follow_item.dart | 155 +++++ .../lib/common/Widgets/circle_share.dart | 4 - .../lib/common/Widgets/open_vip_tip/view.dart | 40 +- .../common/Widgets/today_people_dialog.dart | 2 - circle_app/lib/common/const.dart | 2 +- circle_app/lib/main.dart | 90 ++- circle_app/lib/network/api.dart | 19 + circle_app/lib/util/eventBus.dart | 5 + circle_app/lib/util/util.dart | 35 +- circle_app/pubspec.yaml | 2 +- 44 files changed, 1445 insertions(+), 567 deletions(-) create mode 100644 circle_app/assets/images/base/vip_fun_10.png create mode 100644 circle_app/assets/images/base/vip_fun_11.png create mode 100644 circle_app/assets/images/base/vip_fun_12.png create mode 100644 circle_app/assets/images/base/vip_fun_13.png create mode 100644 circle_app/assets/images/base/vip_fun_14.png create mode 100644 circle_app/lib/app/chat/widget/welcome_dialog.dart create mode 100644 circle_app/lib/app/visitorlist/widget/visitors_follow_item.dart diff --git a/circle_app/android/app/build.gradle b/circle_app/android/app/build.gradle index 5941416..94612e7 100644 --- a/circle_app/android/app/build.gradle +++ b/circle_app/android/app/build.gradle @@ -71,8 +71,8 @@ android { // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. minSdkVersion 21 targetSdkVersion flutter.targetSdkVersion - versionCode 53 - versionName "2.0.3" + versionCode 54 + versionName "2.0.4" manifestPlaceholders = [ vivo_APPID: "105669716", vivo_APPKEY:"84f750207787376b310ca5b0d5969122", diff --git a/circle_app/assets/images/base/vip_fun_10.png b/circle_app/assets/images/base/vip_fun_10.png new file mode 100644 index 0000000000000000000000000000000000000000..b1528f50bf2535cd497d5dfea3a374681838043f GIT binary patch literal 15528 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 M07*qoM6N<$f<-LV!vFvP literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/base/vip_fun_12.png b/circle_app/assets/images/base/vip_fun_12.png new file mode 100644 index 0000000000000000000000000000000000000000..435f3687056cd2f5722d51862a277fc787ba3755 GIT binary patch literal 18577 zcmV)`Kz_f8P)PyA07*naRCr$PeFuD0$F=u=ZrP%a3Pl1@MH4DuiouOy8{;0wsZQd2>3Q~Z;=HfC z^#1Z{ocP&!DKGhwFU2YDjtj;Zj0?tKKoX(}i6S9DfKb=&-ZEd#ExT7jpj~NK+LiA0 z4{N2pckaxY^Ph9(%qa}+l~4-2!0WuTFvr6IPcM4BUZmv&5h#!#&ST(HI9NWwCo}NL zfRGQcOa`t2LNSNlr*905e!swh9)LFkP#D;G9sD>0KgYqEIh4~t+8!Cu0_alHkP&FW zkofIVEsyaz_QKdJCO7f9AD)p71^M^CN{>Ei;}r!pYV z3V=gRF?B6bOeaBt4-8!h9p&Kvp+kQ<9sYAAjP_jaHSU2_%iD8R_|^yzJ_KNm4^plI z9U5ro<6iwKK+2y70(zlz{!P{0B!E3HK>l+nV_pAVBn* z2I!HstfemJkpZ63E>Q#cF@U`kg8bl8#+1|@)6jc9u7I?KZ;>YA%0dRLgm>ir|;M@P5ub?Qx9RX!Ik| z?;LYLI>33Jg3uQj*q3~e(_IxV(JT~Q`)QET1GVXI{)WE^LjCzt=06eLlc{mnm;zD_ z4?F+}Uu9qu?Zea5n1=DuOUrwm^n;Te`d2HM|2Jc0@NhEsgXUMUTvjr??aA@aTo@CRhb>8>d|wfK;{B^0Rb9Q;ua zJU?8(*!k2NL8P}S3#7d~v|I#!4`7aIAxh~5Emiqv*!{NWjswSZ=%1@(zKz3fbQBs$ zIUw!g&1n*HKkJ3}hZMHp0%#PtCIPQBLlp&tpnNGE-k+q}VQxwRshWqb0Ps*IIFcSnZ*!jIhw|M_$PaY8QYaO8DsFvDhm1}r5BEa;`jw1z#I4~3G?dgp+RKBb z64)(2d z)zhIqQ-*)Oi?MGdh2EbOK&s_klL5~k0pYq!Wf&ck9N`XX$P}P#d^)t(1cW|V$}&bh zG-K3(bchG%hrk~5L9TQ|9)`?Ub{%YigaivWbhm3GvA@n8p)^ush0N^>ku~z5azoe8m;Lc8}Bv2q#qQZtuGy= zfWc7#k|~LVr@fHp2i=3#vBAxwJPI#l1fd+1q2DuoiU z1M5e6&orVyBI}$E&x-`m5gPfcML$biMSAeo%B&~TP1|-hECG5jjUiCq~&b7`Z z0mqHuE|4`Z1m(4bkk^b<2>XZushS6$79ri?ro|e=9GpZ$vkVYh%9v;ENOUXVK(c)2 z9ugqj=Q^K`#FV=4uqi+;MLPJSBaxFl;Xtb4p-)JVf2q3GIhVsnfdY~lhH-y6^E{f! z*C!N62YB$kD%hVHnBe-)C2|_wwl75iJGlx2zdMm37zqOs1?7og?@&=@Y$T`+PK0s4+E$Tub;Y&{`Bs^Xy^`yfByhKIWx zoJde$wInv74wQ-c#ka7Y_2L~#WY<((6N zS2>Usk3qX_xD-eb1==~VE}nVw;szwD3Lb>|EWmDb_eBYsez)1UP{2B0dOd`5H!Wp_ zJ@IHXZa~`00}p1y`$IPaYCNXJZ6nbXpp35V2!5%O`5ubLyW#?*y*#kq1J6s8i`%_i z3Zx1Js2WBP>WWI{p<|k1UBd>_4&IUHhi{hvHp4x19m-tL6j0ta`Wel1(4Ca;!>xro z6ly!4u?}mGG^4e0J)7J;oc5xbxl6WBnSZJg`knyxmEm+^{5)%sTi3usAuvUSaP};u zlg*HtPD1GFg3#Iqv8M;?ug~4UkTqhIr}>#M7q@ zKtW*Of@lgP#=w{nFAPDgrHEoA}P&*_b?c%+~9tdwS zu%e+Ncx*l=0ihm9+jl_PTMgmdSwQym0T2&^!o&wBRn8DHByKEzH|}x#!nvX5889O0 zV~Hn2^)ntZ0T#xhE%AauXfvimtE_-pQ3iPYfT8xe*Ci;>5=5YMDa$$+D}{yxq#CY# zj{#qGt#nRuOArq1gZ%tUKpk|v0UcVN6)?C1i4I2hNsjI= zh?`!4SiR5OtC(WKQprrtHiZl``P$wG89)&Lvb@oAl4Shj8R=kTfJn;#db+_h4XmRB zT<2h#4yX#CD28-0+8lJ&Ep(|Wv=z&tuelcRl5`sU$w8YQQ#TlN>J}g`EM@FOEJKS~ zB31LiL+S8-vBzE2jPoDVAAzuO6WH0ahABEs(6BTx!A3>{vKv6tOz;%s1JkBKpF9c3 z&o@lj$jJsEUwZ!3UZATB>_QuG_AJ<$7O+#N0s2QTCLmhsURXKogB5PPpHD4^U!VqZ1MP3=@_7?;IF+7Y=7I70>*aV zp~5+-PYCn-fn`gO>-hB)R2B1Cv0&w73cL0aR6^ zkHWe&fM_lX?qyJ*hXJb>G0)Cu=n)l=C`6(cq2CD*?;h7761ooM>1V*}>j(CWv$ZHy zfq31u5U;ob7|k=BKmf|dm%;bd0v>WBvW+0t2gg~KP__utjW?M4H}^6^({-pnJCE)6 zuVHHjRUx7Rl2tikAHXul?~28sJo_xP{rgQx)c+vWJPZO$&w#XMHN^P~lEh6%gjTg1 z%Ij|cbTDkVAel%B8xZODU=Z@Hw?Zs0ccqf4W)K~^1ZbtvRJe!=NY%Xe2WjyAWAC`N z)JX_!+XD5iw*U`mwtd}rj7`0wLMoX9&$_i>+4)I!RwF}iX+~({%g|4r1U#f>+EZ`4 zL{OI%cy780QblEwECQn|8e_5G4GJX6l$r(}qEy4<)yNR4szPY%YvAN8>hL)TPc!H6 zR8+uw?KOrcLvl)O2Hx9);HFog964f2rv7|NqDmCuzx5V~GiN2~I7Sv+lrW_pM|?N4 zlHlduJSdQ=c;HbFyni=dP2PG(2fF|KXYej7TqV5Ei0DT0oH(Dh{*iNZKk+2g z#>RocMCxfy4l>^VKCtxkk>%PXd>fg=Eug2glx4SGdTuV$zZ$N7fo2h?d(q04?SgTaSxs^-BUI-h+O%BfQWpCM@)(r>&G{)Oc(n1G-TeoqDSJ`ppJ z$mAVB=nn$KyT)HpFb4H(3)-H15}Z5-2G|#gnVHDG^G=A_IYVb?3biZ0K9F{3f7q;8;YKQ6rZyrH_YqoTb49TJsKUcT)tX^2rXL5(oYT4hf4yf zng{MngZGi~XY!_%`W((Z@q}U0HsXgI2bZK0<=uWee6vf2U?P@*hC1Nom%-ZFjlGJ~ z$<&-6%XP=_6nCg@W@xN=OZd+up#*SpfZebjD5R*^LC+5R@qvKOciu+l+uOsQ8cwEQ zvW$rz`6vV*1qY7b%QS_DzEZ)wKZprPH9XiLLYk??yyB)du^B|PJo5yCO-*2SNQ5;c zVr*Y=G4j^mWNgx7x^x{{?SAMlZM0T?>uJ+^;W!<2>XCN#lL6k;58xE!Cu~>`Vd27< zy%R`%ZF%wusO0?W@E$iXt0>4^z8pC#t{Q^$jfp}@eX|G=8nlKo=9wKekZO2vK?Xeg z$6vBX2Bqx+PW|yQ%QW22ms=2!f71r|r_stE%SK;7aLZ<>yLKCfiExzcKxb0+-yG5? z90_a31P(Nl#vV$CwDbyi*VtCXXnB*N>+nHbcr9{PW=cMDjDp95qI>TJ6X_r~mT^b> z{?xdSl1g?Vw6KhM5A^TxfT~>$5B!$|&*#QlQWF6(PHlV+y~mDPD|6)ZpQMqupa4a8 zeJ~~~7K4P&=bwdoq;Al>b(~Z^3f$9mFrU{{waEFkH)!smC_I9U5trg+i}B^TbCGd# zjHYYO(e$Uspmucj;}O%ykyT!fyj82g$E|k@*;XYeP=8*|Jf9sDNH6d@?=;Lf0q}{b zu};LVmuh!6nx1$ZdN5*`p~xcJz)bfWjj5wyRv16pry-+i3Zo7?L_!JT(P&LzLU=+rR*5{^Cb7=o?m z`$|4?ClW9=>VD9@r2#G@H$LVFs=#CKNIZGHjYm=c5kgB+{HUrY;@s=ToR+-lNLpZT@i?!ND zHXB5^qE%O6!kl?gs&xz(8js=F8{5JL2Ajw_=MW_crMKJxZ)SE(MvF`FE%iOn*^Zj0 zA2%7lpM(ovnf^9;1@}p zqr2WgOWh$eBWl=!&Y^2MW?iuig$u|LG=3RRssG2T-$i51UNB0=?@-D}oJ^j-05g_E z>*mAIb*dRhx4r^hiFirSP;^zp#IkY}EnOMc{tr&oxY=p2KP zH{J{lB4q4+{I^gkLuwzBGK1{*VbOa(5cN!|ih}CbHlypp`HRktB#(^cH{Ss%%Dq<9 zF9i?^1hD(%=Mf^)c%Kwp3>gz9p!~Y)Aw{{jQG0uF;Q41F^sxO5bsZU#Cu9DNWW9{l z6)Bd{B=^0h!9hR2hYXk{c33?;R!G=jfVP!ZMA0 zQW!{8y!TT+_zk&*t9r@^EJ3o&!as;F1s_Vx>S z?UffGkvFwvK(-Ax3l>#k)@-t%4adMRF#TvTXlOWu12uacYoxisQPmJuUw<>QvL{4E zd;-$`S6@K;>1Kxs+}wVtp%7Ny`^iDQG@^P@3g1K_=piVdEMuNu^#M{fSDut0yl4D5 zsS0R2(~R0pFPcDdC`M$#n!REbCeK*_%2_ekMa+EibQ8Akcmt9Vd1|dxoKnV#Sh{2d zrc5Nyh{OQt%-Pd;XV-RUdf&dPs*07%uSU_7sZqU~4rY(;eH+dDYc1(%jfA{~R25ge z_x~A7d-qpCG?Fb^#w`Jm1PRwJTZO!w+@W@L(C5y#wPM@Ox1ehF z{>73=nu;Y0E3jbZJURmzv>l>JbKQQ_?|eIa9AGaBWPqr+=@w+=Pl}2rgT5?*G32T?EM1j#({4eVF+4c)~b@z5C1SH2xNJ1^0Uxr1~=SB~t z`hz&UbGxy>a$Y2*OINQ$-jr$M9!LPr>(G`}F#l0wkF=Ku)(a4xWI$T{r#QJ=Bp@{r z)9iX10>vL$M>$ME`rD#)T3sX)P)@%y^+Wtd__)yDs# zi9FMO0h_9J7(g-)QO(#+Rnu_oq9vF=r5F*{*-Q6<7KE0Q$5HdfR){2}9dREdrOU5d z>jKFnUzY~$_Dbg8VgRX{hyDiuN^%lov|9WbVx(InAT`z>#G!Y07(g=k&x-q@{lL=e zHy}H2VpOZIu}5kG)GX6cp$tXs-f zV5Xst4Gv>NN*_Cn{X4dsK(ea^lHZ}Gq2ih~D3~%WD(N=T^EtxrBR%>4GUoX&8%RHt zAU-(W3=KqdT76G79YxLdH!O){?gq?kTPiBAT7yZ2(KAg~D1cwQ{VHU;N_lu@8CDd} z!SZRdqhjV*8G=Ck*73vG)mU%2np!PTvJ_3jr>|U#3{Q07;>H1Q{Q(@>v&%Z5wzIJ^ zXqt+ZH{OQKD5Z3)<4C3Z&7>&Wf0QxL|72$TQSomCh#!b%BbrJBji#?;{%*T)4sUOM z(FBrlnHwAO2%lTA1hYy?qq5r3lf9~f-&XGc0jh5_ILEZCT--Uo(gazYFICs@)S)Ug zwzoQy5gTtw_jvHpvMZ4m=iEN|nWc)7b?&+Q`{9@k@$aVy6_#l;IPEJ1VoV^HAl==54 zyXdQ%o(J^1P z+Y)5_^{b{j_QMkJL8S58xabH%nBRU9*HD$PF^0a zx#lKlE|4r!4sVbkFK7EXpQ1xK%Exg5G17J4-TfAt8jnF>mfB_2jwGYO%Bxl*Gb=i$ zRbu0oU=My)SB0Ri_O0W`IYL~+%|&ytuAmrd6lXevfk^_x=9Uw9vAMyNMs%4~#Egmd z2qHdPQh|xyw5VW2&zxyFh21;18~Y(={acMx-FXYKa6yG@XmD%-LQtl%D$b{71C5>I z%r(f#pu{}KPc-1&-8+mh2UD`xbznIbl~!Wb%#x_3k_-XAI8lrJofj_3w?IZ?VA4Yml3h3_e|P!B?-tcnM2%Y^sY?r{txn$SQnfR{EsA1E9!$Z~o+{>T<#U`~Ou$t}T zp-=lD|9m`peLHzUQB}P0&KqcLI}bYZaV9yHJszyT?nZc`w0cpyB$ZxiJB8o29EHzT z7i|>SDdQNhA-4$E=S)JTARAI;Fovgg+q4iiwVlSxt<8qy6s*0F6SXSmcwfOZtj{Tm zNrmj}?!uo>iFz*;zI3YITk4lw~%$5h27d4cyp`7Ep9!EgHD`Bq?@OC*}e znnSfX)IchYL-KIbGvK=ASEF#^l$d0P!gc)gOarQW+D&lwNvmSA4l!uH?8W+=Nw_*A zAL&el+V3sY8xhPX_4Z8LX>92@gAPpzpBF_!Cd_>iwYe}Y3!k4j3%(ebo+N4Ai3aSd zdDrq4j6@2P94wnxiup6=#zccu1xU30rc}lOgucb9dFVgAknbOF;S>D{MGV+uPMfU$&hrGA;6CDF+v@TJm5gNKN}VP zY~%FJ2|(qY0RZ}!zouR^Z7KkCCe6iyL@@(4+!=VW+pRa}W=1oA!m`pf9GBV`>V3#lR8 ze$9=@&CHHM0gF6Hs@M^w8xNg7j%GCo+0LtABFgaw6ILX3G@lRl=Kug807*naR4WkB zR`W(l%PjYzb4-!F_{Y2%D3<(CVt^6lwm#HYj~)B=7$F}S^U;vt`;o8b&m_4}|S`5~|Sl*wi_fi^T73v!V zq<2I}%UmFtChy)*0DpSzCDTG@akHI!P83C~DPN8$xdk!r69^owx{814Xu@GN05S&j zN#WFwlk8+b5y9n%`F02*+X6UW_TztN79m$K0}5lgXxzunoWz^8dq8JJCcw=Wbe+TR z^WvUsZl#FOSehLd_tF_8hjx%v^WaGlV&Qo7vm0opC5U+A;9l%+Y=9(6mWpFlh~*sf zr_RKRxusF(iR-%uF{RJOU|^0CiDLOYTw0wCAZ@cIOd67+~&=} ztzI*Xd~mzp#iJ(hY^m9WrgLW;ZcXNWM8_|*;F&$!;W3i6nCDQo zB1w5BZd$Yyg+^5G@ZUGw{wDMDE|4xUJH$4R?R*U#0kh(_ec3>olAVjYD^@{`vpM*3 z28ejGGJ)o?UE9#s+kH_C6OA`NBMTo~e05Bo5y{N#iR_yTq)SkjR_jA&oAJ_tJ$;g* zn2gR1H<_CkF2S?}T&!S0d!b9Yuv%wvW?^#^AZmqH1l7-9)O-sm=@dW6e9^LsU~9nP)&6=lJO2 ztB{|TTEz`%QK&xCh)s31R+b=Z;;f@8%6RnQij~Or#W#|7jIoD9-DhNM2%ZoiPIJ$Z z2A*b$YTbCG7KhKBHgon`);qeJoI@#W{4-0g9kvB;q?zpD9j_W0S;Jm?mOBMi&{#U9 z7*|i9d)Wiyk?wD@zR!wVyWk$k4l+YVimlEzJbvI^!yCc0+*#&3&YQ|na}WW?`p#nhxQ^!)iNAvDvg9BY~{qMxMgN( z+^vygl{c&$;Ja8254vBh>i!eQd3PihCEEI5t zntvt@^3TS5@{?GI_xpw#9BOYhO1Bs$2S;oXg@J#(q!QE8vXVx{JJ^06e>t|_I4unK z)dCXjn^qP~#cfkdl1`GwGAE;Tua*4dGpw5TUY7yi*72T>E82-Lg8wuH|FVCF5d>#k zeG9E(PUZxBc*er0Qv^r*?xEaA=J{XNSE0G5JMy@7@JfFm^X<1Qu5u;OP>2hvgCwID zJ-4%3&KITuwOwxXW7MRijeAvF3x0q6fN9|}@{XA9HFQyiRRYq|oJpg)%2Pj|Kh=OO zXHFRBL*dYNBhd;o7J@I%TZ&1(aaR^A>bV~5#!Sd)2c|KrT3^$+udX{7#rl0uS$}?g zY(E;h+r!@wkSL~yd_akDADp`wxw3CmtYDOMWq(&Iesy%885-eCerF|DS(ZB)?VCAR6TduG3(8;D{~}OLPtU^rGvk{u zKbjs=-`bTBesZ)1ZAvhln$;P=PWkS>FuM}D9FgrK}6 zKv?BEuR5vK*F+pi6dbw72N8chU60q!pEL~*1DL#So>YuAc|{}2th6Bh^~`a+e!h7? zMT4Ae@0dIT*XK>`mlNFDJZU;$6sGP^gCTO<7=4T)V>$FUWXLyLg~q1;Mu0Fb3yt-i zV`3c23d10tKLhdfX-H>UC^0zH>BUe=7hJ>=v=4dcShXRYD3OU>CepZ(1AbA&gEPyJ zA7iq{q4J)QEw!f|zi2!Ng)#zJRWG(TyG|M{rLLK%7hyps4wJL z`~9O;I3Kd|=k@DQw&cMVic66zdmK`dL1<}#|FJ(oywDChTsGDLO7J2}&@1yYi~d}ch*#A ztfI`$ux~?alO!nbzYF^8IgUchCc$25ZN^{EHJbH=`YBXon7ARg2=6VJo=^{QvdjJC zp`4nBJp zcvco5Qu>y0dyK1c;4|gS^M4Iq*~@#^h!CFzkXjLHLjt`71iFCZC&2da2RnAcRAnU5 zbo;T**cOUR&By|W&Y`cq7W}GJ7cmb>qyK2ykCVZkJ_$q&U|Q*h?<<;zxqkA+i~mL4 zeXHXf9&0&jMe#;LJ?Q-uPQEB38=sz1V$^5qbCD33oYL6F24zgPu@#QFr*pLQG_aBq2BR}`!x`(zz@TXc7{mz^AWWJB@6}g9 z$St_+ic9SD(=+wh+tcPqE@?Wo(nZC@?k$*s>oX^U7<{;w5p>wvi03Xe!z+-*(UDW! zI2`7-+OXoOL42$E0D`*nh&v+v(gYFzbMhQazodkSj`c{L z+}U#h|9$qDaVTu;YaD)b)JmS@!M6(MgWfs#?!`2~a76*{?M0}e0f7Stpq)KyfQhmw znd+ilUM8XjTQx(?@5#U+2#{vYM&`{Mq8m(#-9_OO0R%o>!TkT-2S~d)FUSH~Qr`=l zLGSLug_mA}($oZIWf1LuxES6{8=E8@f-FPur@>cJ0$*t<otQ)d)2BTz*$rJ4Yy_tHBm{n|}yJ{~&CmIdf>a;LL><|$@!*Jauv$6**N>WZXa&EgF(gd?s?pV3V>$?}2 zQ^r_*A0W{$`*`RagOHcH8HE^vXHKE@<(Hv!bbyJbqh@6K9D5>5b(1nPkT!b`yhTOu z&m_MyqfE!JC*2Pbzq)V&f9-5Btz_YdRFebA%6Dt_M0_fz7(GJ(E16CnIe#3lcbzv> zx=3~-+Rss1V;vvKDZ-sulMx)Y3Q4e_l*S5zCr={K*odBndMK@}U=r2R=wq6QfQ*=m zR6Tzh@^9V%@1!ZirfV_)(K?82En}Xrajp*qs(IiMAH4SkQ_>ThA=G{Wr=EQVdLUqd z#~hvsCdVe3CRdV?w`vvAXU&G-rAiC^bfP%SSdXsZpU>9gsM2e$(EW02Q)Rx-x>Zw5w5Oh>Qx48R`_%9x!h?No4SWRE|X3qmAa4A;oMtqL8pUj zW6^S$^_-Q`z#;g2D7^g+$VTbR)Rs(MqX2X8(MsmK-zH}tAXV|+b(!$Jl6tX840(yt6=tr=CH`OeIfnT~l#< z%Vu;nHX55;V~QfjH|C1Xft)#WP*7G5e@+4P5wa%He(CA17X07#W=lG7^W4f>u?Y$b zyy^HqxijD!%sK|3L)Y-#^9^WJ0+vF>BKv$RXYLm!Ov7q_ZcI{cID$$b#_BwebNi~% zO2!@QvhibUeq7g(URZ>gH*OeGp|;`lF<#GFQullSf%!{WmYtuiuX0<(c{+pgi~wO> zs(6Caz|Pgz;l%d0F5^(iP<-Vo5-Tn}K~JRSXWAs^ZXV zo6&jZ%td=%Ln?^^O0K#Fc~fVPm=qdl!a`ifH(HOPUNt32|D#~4;P?5gBHWRdH=u=$ z)Wkn_x8M(k@xtEwMbtV9CS2^z!2ixE4u2mH#)-8J0TRwN)}#K-*P(|)@f{+H!n1QH zVBxy;5QkCqFxGy>>waTT3jUo%O#Y^`&5M9k!vi;R2v0EzM^E~Tq4WG%?AiDN1hO7E zJqajURgy6O%BzuIG-FgjWbcjkhkEe+_7mtGAP|sN0g{#9oG=}WBAjHvqSfJW^)8$^xZkiE^}nW;%)^|r#Yv-&ll#uo zz31^r=c#brSLaGbyf#^s@uLZ|!uuuq{)869m)nk`TaTP+*%FPu@8lZ(D|a^LO8!v? zk#i1?)>h;A!P@Yi)!sajPAFf=p9zK6^l_v2+z{B0A@KkTBQ5V*@9F}*gRKCKK zfp2C_Gb9v2=Yb1H(Vzv4db52zG^`r3_oNlz-n0Uv%6T$fT^((BXWJI2N~lk_jP%HP zdARDj4M-)IGzk*bi~4B=^L)NPoi9@DOop|1}lPYtRdUXo z(XeXR+dFC?Rq^1L)8P51KoYMQG9>(A;}hY0athvap!4q;(@-Y)hv-L_c&O3*JooxWbaazM>T9c{B4;1F`GY9~ zB=W5bAb8&*=KIM&lp9dBqZ@be?kQe)_AwwgSr2Dv#e3q-jp*#@vYa*}ZeL!>gIiXv zf!}cdNzRM*OaCv}ibn%2@E9J|&NHU4Hq<9l)r{Z;zMVD&tL2QO+ZQ=0-PPNT7k6w! zi1J>L+_koFq%lm$%Eld6u1k?ROooG3rwVmJB}+RQ6OigS_XeT_;C-h-1ILd7XYqp4+2?dTY~2ovqll}<9iD95 z=gm+01RJ{>4x#E;UD*5GvI7|f2o_D7ja75YlB(FirIuT=4y(|fOoQjcC5-j4*4fWo zQXXO z(WEOTI2?6qos&zTs}%is)L)de>YP0X=es-bmz~=TYieXTmM4d%;_hYFU}9!YQZI52 z+G_&vnNsHY)uq68Ss>N&_FNrlwaI*@q-YwRso9A$UF{cb$Vr9B^!jkqf=U!+<|Z_Q z&v2ASGAz{VA$%cl3TL<)F^fBL5|L?p7L)N)e-X0&=IENNr!N$-+tk^Lmk#VjS1R+1Qc5)WS79 zqO@WU4}ww))8E!e>G-@f0e&lIUb6L@`V-PLY;HV^sxwW--Zkv;?exN@OiKQAe5!0^ z(k^ID+7j>uh*$vTVT@V6P6Jc_vZ|f^NDUACmk-|0C95f%4mB@?dhweByV0QpFD{5| z2`Q=-l9OzlQ^omcEaP{QrxTav5v3OE;pJclRI)qJzK2lgn zKv%KjTr=J}(}aMo7}<&<*#Yfdnj^3yc>iwxQcU!vC)tv4*9ffkr$iH3-PVF zIT+=}(f2l!P@ai^uA#R5JYG6=6hU2q$od9SMykC>j*c>A8Fv=V!9pXUOln+a+>!RU zAD)j~%H-Ww4UBSJ`*>&>2eum3{*w6eK*X^?2ma7hhsHpskr>3>^<^>(76rvvrf?Ks@k4pNaN zK`^7o4IjX8jD*nv8+buo!_2fyysvN$X85uYN@91j0Vo&b(BD(ed@n{r)u<#=WUr(= zCqTG0Sr2F<3I#*Arr`N=jo5bKv=QR%oa(;Q-q(?mJO`)7LT>H?kE+u3Sb42|Ufj)eQxrma74!Xn5b0F{inGjAG}XAT_g8x^yS;!R}o4xsm{ z#Vn2T7esZ%B$24aWVhh;AGK*&Qn96@1zS7LqFL#Mhmq5VBhkI#-|v8d70PY=9E{J%4P9avN=Nb!1s$SM!x=Dbvtdz0Sv5X^T ziA0U>OPTz&Slbv9kaqEod@p>p04B!z!eqIhEOIpMdxM>*3U;Di z?L|$n+fY$R!r1DKGhwK0MR%^`_UDUO$mUXm!e$;jTg9WlkUB)-FuZTGW`b16h;-=7 z`NrR^PS_J?t8X?)jGvCZj8pZXe0q^s2J0KgpTd=B`XP(}Lf|Epc%JM>xi`c3x4@Hb zS@u#JKoOqgCk5!MN|}GqbEE!zJR~4dBQ-qmfFIr;r+U(Tn`bCemDHj=N;h8ZZNnk8 z*Wfu>FxU5pjEWpQ8tmgpCQrYZ=3qyahCXt@dYi?uW>E)g3c?wXY%6_aYK*6>@56G_ zQ4k`m7TWjNVd?#I^jP5SgOkX>B4w3mZ%1mNC7YIb(y_{ug=OAMLyb$b5?PKF_z?Yk zMjGP4$19lsH$z$MhYTbWOrb3@^UwJag-KT1V<1EIOL>HTuBkh>qU7V&ka^~Fs9cFKAb*=9^n4v1# zf1}_+lGN!;z--BfD?J%l>B&S6lMGO$y6SeR`KJI;4a(s~%sVd{9vSGKVF9U%cgz#u zf0qI2skmRd9MOm{ls=38QTEdlS_ntAAWrEDnsxdd!Wmt~Xs|$rSd&a>7#%n zz^TZIxpz3I1<;^}a70(o$U``$g^VPSRQ{5lGxsspVJ5dz&tFQ*wzBOwyr#p|!>s+5 zZH+M1Li7K+HIroAAhnDP8x(>;zxx@(bisoeq6hPs2lFK#rZU;s3z9=D89L~v4cM`y zvPH*p{GS%V^EJi{xjv+8SU{pTR`Jv6B69ZvY|dDdO3_l(mPBTyAd+Ihd1yGMhj4<< zY@nfuE9m4p+PH>hPV2n6?Wa#P31&qmv$oO2u^@e|h;~IHfk0_#eNzMpKE^Op@FEui zrZ5TgHv&+eQKr$9O7_p>bJ2~K+VQ*3Qd`_ncO6B&60qp(0T2l9_lZCjUWhKE=h5V6 zFaaJb+=3*DElq3{&irZr8?VdT;Il-2DLRy!7BSz(!SBBO9dQ8?y`q{29?XRIhsmB) za<~MG_wz%YfFbK3@g6{mwnxbxJE453oOvFK#}I}(j~Bgr7w2g{s4oGy#$5yBF*R-* ziK2j2nq`w8@@>(CNJP_*xB-GIh``zf%=2!%-XB*W zQK#sjHXYs{r(XHYc#+g?Cz&abZiJ5qzfj725682gaR-tmnI85+{`+K3m=aGSx^1Nf z1w00bl>e+`o(JOHJB0+e=;wn8)S%jxNYIUdb3GBaiEq z5Fk+x_wrz=2=-30ho;Asnr>ssOo1K^e0e4FlCyQ(uY>`KdRoPUcMD*D8Q3*H?qhKq zbSZEV1uWjvb?^^VFz@4uB2hwtWbK#klOa8ljCG0nCjfbFos)BibnaExx z97wx3mwiwk0@!`-`BEaM(rvpx1W%%bc zjD2fF{BuVPNJPF`-Zfc==S2ZRr7M{d&rsv>4VF5$mm##Flx4(}z+^b|8c`roM-TDf z{1Dhi0Yb40rr}JT`|Ln_A|3h(4!*vec@K^xg+?4mrX?>pAHdT-c;*F@xY+YZPK5ie z;ZeYABy|iO`r8raog)n*>iMVu$yD=ti!}%@ixB6zl4*EMG~S;kbxwnJNQ8dlP%;3; zgMOn1BwI2uSIvvZJdWEo2t=c$&N+!bsz7q=nI7{&u5_(=;}#D?8aP?!f>8GA;2#fT_-@+eD}z7)k5gr3NzU63Olu=id@)@#QBO z#5>$QQ{4G(Of_iv&uv)*dEIa_|HP9hNdqK%Q2Ti35fSozW@c+QGeJBjJJs7F0EuQY z$3d%%kMvlR4oKvi=Y{ey06z~W-x+DDxbI6^3UJ{55agdH+IKEi0wf)f>;csB;N3dd zZy1C$H#jiXX&qbln<+K*9v%GNM212PhiXX+BpMV22TEYSlp(Kh!`6p0&8hn=g@-Fp zcBtT=OjJ-_JgAe@K%xOs*m@e2?`1&#dpDs!=0QqZ)2oH}ZC6XRU z_FySH5rgnuK*(}cy?C-f^0j4I<=O@4--vg%pG1u|Wq?EkIKV?!sK5_0Am89-bWIdX zjBdMT22}NRfInCs$Gmfi9#u*KiHK3hxwjX=zmwqkAsybjCh|nH$jG#BnzltKP`?y{ z{IjKu^^DA$tZxizDUq>;R?1b z0`%{vibXCOVvH#u(SRvn5Rg8jLH~FI&+A!ElA`_9pAear*NCT}$l zYyj9N7=-nHNSOgQOd}zjXQ^;xefymb{Hl_9Qqr6qD{;mRkccpJm>U8nX$XB@g8YxP zYPxD)tSmF|{bb4}W(q<1sQ~#0EkN@c#?<(uy&J}`7bIm*F*p+Nn0Hqu(-RTVrX(c|c}3#3cTU=0s0(7_%MfV%*e zCV*v_wm!1^jcu!+d2DL_UxVJmz&dnj&k0};l`-#uRA>4`^xp;2AXKg6b>41FT_r(U zt%G01fW>K$b4l@2h|Mq}#SRiN_kG%=^j5NwS_J4usFQ=eBY?fhp}kqgd@m=w11bIj z7f3NoU=`=-3OfCM_{$Y&cZm=__E6~RU{!WTeZ2d%W#DoX^$~SR+8XnL}U9z|uL8&H#@HQHm&nBd-!VRWwr7bZ8_#Db6Rz z!8-wLXJD`RAU{{a*x6x{Vq8D&0x8bZznga#3J}W#2!#O37(hRZIQT3EmY)gPLu#RI zXeZ95&!*{}KGUa5gN{@%^P=23wh#>orO7`9(4J9$dD936cJpkLzv9K3prRm1E0ac@&L#HFJxe8 z3@oR=QNv72r8RPpHpV&`aF&Cg2H0r^evX5kf>D)0I2(l8=0{qP0igyQ3EezS&vz0$ cz2WBnKQXsWd%E$tlmGw#07*qoM6N<$f=~LLIsgCw literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/base/vip_fun_13.png b/circle_app/assets/images/base/vip_fun_13.png new file mode 100644 index 0000000000000000000000000000000000000000..a66df0d7dffda296e9491eccb51927671234abcc GIT binary patch literal 13595 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 literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/base/vip_fun_14.png b/circle_app/assets/images/base/vip_fun_14.png new file mode 100644 index 0000000000000000000000000000000000000000..d55ccb623f14de66fa11dda28f283663b25ddd11 GIT binary patch literal 16385 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 P00000NkvXXu0mjfiyM { void dispose() { // TODO: implement dispose sub.cancel(); + sub1.cancel(); super.dispose(); } @@ -139,6 +140,9 @@ class _ChatPageState extends State { sendMessageRes.data?.customElem?.extension; //自定义extension } }); + sub1 = EventBusManager.on().listen((event) async { + _timuiKitChatController.refreshCurrentHistoryList(); + }); } Widget renderCustomStickerPanel( diff --git a/circle_app/lib/app/chat/widget/chat_circle_share_dialog.dart b/circle_app/lib/app/chat/widget/chat_circle_share_dialog.dart index dbd212e..9243c1f 100644 --- a/circle_app/lib/app/chat/widget/chat_circle_share_dialog.dart +++ b/circle_app/lib/app/chat/widget/chat_circle_share_dialog.dart @@ -161,8 +161,7 @@ class _ChatCircleShareDialogState extends State { imageUrl: bean.image, width: 40.sp, height: 40.sp, - memCacheHeight: 40, - memCacheWidth: 40, + fit: BoxFit.cover), ), ), diff --git a/circle_app/lib/app/chat/widget/welcome_dialog.dart b/circle_app/lib/app/chat/widget/welcome_dialog.dart new file mode 100644 index 0000000..435f7e0 --- /dev/null +++ b/circle_app/lib/app/chat/widget/welcome_dialog.dart @@ -0,0 +1,301 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:gradient_borders/box_borders/gradient_box_border.dart'; + +import '../../../common/Widgets/base_tip_widget.dart'; +import '../../../common/colors/app_color.dart'; +import '../../../network/api.dart'; +import '../../../network/dio_manager.dart'; +import '../../../util/util.dart'; + +class WelcomeDialog extends StatefulWidget { + Function callBack; + String userId; + + WelcomeDialog({super.key,required this.userId,required this.callBack}); + @override + _WelcomeDialogState createState() => new _WelcomeDialogState(); + +} + +class _WelcomeDialogState extends State { + // TODO: add state variables and methods + List giftList = []; + String giftId = ''; + String withStr = ''; + int selectedIndex = -1; + + TextEditingController descController = TextEditingController(); + + String tipStr = ''; + @override + void initState() { + // TODO: implement initState + super.initState(); + loadGiftData(); + } + + void loadGiftData() async { + var result = await DioManager.instance.get(url: Api.giftList); + if (result['code'] == 200) { + giftList = result['data']; + + // for (int i= 0; i< giftList.length; i++) { + // var info = giftList[i]; + // if (info['name'] == '浪漫告白') { + // selectedIndex = i ; + // giftId = info['id'].toString(); + // tipStr = info['topHours'] != null ? info['topHours'].toString() : ''; + // } + // } + + setState(() {}); + } + } + + @override + Widget build(BuildContext context) { + // TODO: add widget build method + return GestureDetector( + onTap: () { + FocusManager.instance.primaryFocus?.unfocus(); + }, + child: Scaffold( + backgroundColor: Colors.transparent, + resizeToAvoidBottomInset: false, + body: Center( + child: Container( + constraints: BoxConstraints( + maxHeight: 345.sp + ), + margin: EdgeInsets.only(left: 10.sp,right: 10.sp), + padding: EdgeInsets.only(left: 10.sp,right: 10.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.sp), + gradient: LinearGradient(colors: [Color(0xFF4C3E5F),Color(0xFF324140)]), + border: GradientBoxBorder( + gradient: + AppColor.mainVerLinearGradient, + width: 1.sp, + ), + ), + child: Column( + children: [ + Container( + margin: EdgeInsets.only(top: 18.sp), + child: Text( + '❤️赠送礼物更容易获得对方的好感❤️', + style: TextStyle(color: Colors.white, fontSize: 15.sp), + ), + ), + Container( + height: tipStr.isNotEmpty ? 145.sp : 122.sp, + margin: EdgeInsets.only(top: 12.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.sp), + gradient: LinearGradient( + colors: [Color(0xFF132B40), Color(0xFF251240)])), + child: Column( + children: [ + if (tipStr.isNotEmpty) + Padding( + padding: EdgeInsets.only(top:6.sp), + child: Text( + '礼物送出后,获得$tipStr小时的消息置顶', + style: TextStyle( + color: AppColor.mainColor, + fontSize: 12.sp, + fontWeight: FontWeight.w500), + ), + ), + giftGridWidget(), + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 10.sp), + decoration: BoxDecoration( + color: Color(0xFF260C3E), + borderRadius: BorderRadius.circular(10.sp), + border: GradientBoxBorder( + gradient: + AppColor.mainVerLinearGradient, + width: 1.sp, + ), + ), + child: TextField( + controller: + descController, + maxLength: 20, + style: TextStyle( + color: Colors.white, + fontSize: 16.sp), + decoration: InputDecoration( + hintText: '输入欢迎内容,TA回复后就可以继续聊天啦', + hintStyle: TextStyle( + color: Colors.white70, + fontSize: 14.sp), + border: InputBorder.none, + counterText: '', + contentPadding: + EdgeInsets.only( + left: 14.sp)), + ), + ), + // Container( + // height: 102.sp, + // margin: EdgeInsets.only(top: 12.sp,), + // decoration: BoxDecoration( + // borderRadius: BorderRadius.circular(10.sp), + // gradient: LinearGradient( + // colors: [Color(0xFF132B40), Color(0xFF251240)])), + // child: giftGridWidget(), + // ), + Container( + margin: EdgeInsets.only(top: 25.sp,), + padding: EdgeInsets.only(left: 15.sp, right: 15.sp), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + Get.back(); + }, + child: Container( + height: 42.sp, + width: 136.sp, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(21.sp), + color: Color(0x26FFFFFF) + ), + alignment: Alignment.center, + child: Text( + '放弃', + style: TextStyle( + color: Colors.white, + fontSize: 16.sp, + fontWeight: FontWeight.w600), + ), + ), + ), + GestureDetector( + onTap: () async { + if (descController.text.isEmpty) { + showOKToast('请输入欢迎内容,TA回复后就可以继续聊天啦'); + } else { + Map params = {'userId':widget.userId,'msg':descController.text}; + if (selectedIndex >= 0) { + params['giftId'] = giftId; + } + + var result = await DioManager.instance.post(url: Api.sayHelloV2,params: params); + if (result['code'] == 200) { + showOKToast('已成功欢迎,TA回复后就可以在消息列表继续聊天啦~'); + widget.callBack(); + Get.back(); + } else if (result['code'] == 31201) { + showOKToast(result['msg']); + showRechargeScreenDialog(); + } + } + }, + child: Container( + height: 42.sp, + width: 136.sp, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(21.sp), + gradient: AppColor.mainVerLinearGradient + ), + child: Text( + '欢迎', + style: TextStyle( + color: Colors.white, + fontSize: 16.sp, + fontWeight: FontWeight.w600), + ), + ), + ), + ], + ), + ) + ], + ), + ), + ), + ), + ); + } + + + giftGridWidget() { + return Container( + width: Get.width, + height: 120.sp, + padding: + EdgeInsets.only(left: 5.sp, right: 5.sp, top: 10.sp, bottom: 10.sp), + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: giftList.length, + itemBuilder: (context, index) { + // Replace the placeholders with the actual item widgets + return giftItemWidget(giftList[index], index); + }, + ), + ); + } + + giftItemWidget(Map info, int index) { + bool isSelected = giftId.contains(info['id'].toString()); + double price = info['price']; + + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + if (selectedIndex == index) { + selectedIndex = -1; + tipStr = ''; + giftId = ''; + } else { + selectedIndex = index; + giftId = info['id'].toString(); + tipStr = info['topHours'] != null ? info['topHours'].toString() : ''; + } + + setState(() {}); + }, + child: Container( + height: 120.sp, + width: 75.sp, + child: Stack( + fit: StackFit.expand, + children: [ + isSelected ? Image.asset(getMsgImage('gift_bg')) : Container(), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.network( + info['icon'], + width: 60.sp, + height: 60.sp, + ), + + Text(info['name'], + style: TextStyle( + color: Colors.white, + fontSize: 12.sp, + fontWeight: FontWeight.w500)), + Text('${price.toInt()}小票', + style: TextStyle( + color: Colors.white, + fontSize: 12.sp, + fontWeight: FontWeight.w500)) + ], + ) + ], + ), + ), + ); + } +} diff --git a/circle_app/lib/app/circle/logic.dart b/circle_app/lib/app/circle/logic.dart index 8722bb9..a4e6c88 100644 --- a/circle_app/lib/app/circle/logic.dart +++ b/circle_app/lib/app/circle/logic.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; +import 'package:circle_app/app/chat/widget/welcome_dialog.dart'; import 'package:circle_app/app/likelist/logic.dart'; import 'package:circle_app/app/minefragment/logic.dart'; import 'package:circle_app/main.dart'; @@ -54,6 +55,8 @@ class CircleLogic extends GetxController { bool isNewPeopleMore = true; + bool isNewPeopleRed = false; + int flush = 0; bool isMore = true; int myVip = -1; @@ -336,6 +339,8 @@ class CircleLogic extends GetxController { int offset = 0; int deep = 0; + int chargeFreeNum = 0; + int chargeType = 0; List vicinityList = []; int pageIndex = 1; @@ -381,7 +386,8 @@ class CircleLogic extends GetxController { offset = bean.data.offset; deep = bean.data.deep; } catch (Exception) {} - + chargeFreeNum = bean.data.chargeFreeNum; + chargeType = bean.data.chargeType; myVip = bean.data.isVip ? 1 : 0; if (vicinityPage == 1) { cityName = bean.data.city; @@ -689,17 +695,19 @@ class CircleLogic extends GetxController { } void snedHelloData(int id,int index) async { - var data = await DioManager.instance.post(url: Api.sayHello + id.toString(),); - if (data['code'] == 200) { - + Get.bottomSheet(WelcomeDialog(userId: id.toString(),callBack:() { newPeopleList.removeAt(index); - update(); if (newPeopleList.length < 5) { onLoading(); } - showOKToast('已成功欢迎,TA回复后就可以在消息列表继续聊天啦~'); - } + }),isScrollControlled: true,); + // var data = await DioManager.instance.post(url: Api.sayHello + id.toString(),); + // if (data['code'] == 200) { + // + + // showOKToast('已成功欢迎,TA回复后就可以在消息列表继续聊天啦~'); + // } } void snedHelloMoreData() async { var data = await DioManager.instance.post(url: Api.sayHelloMore,); @@ -719,6 +727,8 @@ class VicinityBean { int offset; bool isVip; int deep; + int chargeFreeNum; + int chargeType; List users; VicinityBean( @@ -726,6 +736,8 @@ class VicinityBean { required this.users, required this.isVip, required this.offset, + required this.chargeFreeNum, + required this.chargeType, required this.deep}); factory VicinityBean.fromJson(Map json) { @@ -736,6 +748,8 @@ class VicinityBean { users: lists, isVip: json['isVip'] ?? false, city: json['city'], + chargeType: json['chargeType'], + chargeFreeNum: json['chargeFreeNum'], offset: json['offset'], deep: json['deep']); } diff --git a/circle_app/lib/app/circle/view.dart b/circle_app/lib/app/circle/view.dart index c20557f..86b6d44 100644 --- a/circle_app/lib/app/circle/view.dart +++ b/circle_app/lib/app/circle/view.dart @@ -77,6 +77,10 @@ class _CirclePageState extends State // 比如根据当前选中的标签执行其他操作 // int currentIndex = .toString()); logic.isShowCircle = _tabController.index == 0; + if (_tabController.indexIsChanging != 0) { + logic.isNewPeopleRed = false; + } + logic.update(); } @@ -110,11 +114,6 @@ class _CirclePageState extends State margin: EdgeInsets.only(top: 45.sp), child: TabBarView( controller: _tabController, - // controller: _pageController, - // onPageChanged: (index) { - // _tabController.animateTo(index); - // print("index=" + index.toString()); - // }, children: [ NewPeople(), // circleList(controller), @@ -123,25 +122,6 @@ class _CirclePageState extends State ], ), ), - // _tabController.index == 0 - // ? Positioned( - // bottom: 36.sp, - // right: 10.sp, - // child: GestureDetector( - // onTap: () async { - // List numbers = []; - // numbers.add(MyConfigData( - // logic.getCircleIndex().id.toString(), - // logic.getCircleIndex().title!, - // false)); - // var data = await Get.toNamed(AppRoutes.Call_out, - // arguments: {'numbers': numbers}); - // }, - // child: Image.asset( - // getCircleImage('send_msg'), - // width: 60.sp, - // ))) - // : Center() ], )), ); @@ -696,8 +676,8 @@ class _CirclePageState extends State //padding: EdgeInsets.symmetric(horizontal: 10.sp), height: 27.sp, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, + child: Stack( + alignment: Alignment.center, children: [ TabBar( isScrollable: true, @@ -782,6 +762,18 @@ class _CirclePageState extends State // ); }, ), + if (logic.isNewPeopleRed) + Positioned( + left: 42.5.sp, + top: 0.sp, + child: Container( + height: 10.sp, + width: 10.sp, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.red, + ), + )) ], ), ), @@ -796,14 +788,6 @@ class _CirclePageState extends State }, child: Container( padding: EdgeInsets.only(left: 2.sp,right: 2.sp), - // height: 26.sp, - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(13.sp), - // border: GradientBoxBorder( - // gradient: AppColor.mainVerLinearGradient, - // width: 1.sp, - // ), - // ), child: Row( children: [ Image.asset( diff --git a/circle_app/lib/app/circle/widgets/discover.dart b/circle_app/lib/app/circle/widgets/discover.dart index d3dbfff..35a0823 100644 --- a/circle_app/lib/app/circle/widgets/discover.dart +++ b/circle_app/lib/app/circle/widgets/discover.dart @@ -305,6 +305,7 @@ class _DiscoverState extends State onPointerDown: getPointDownListenerInHorizontal(), onPointerUp: getPointUpListenerInHorizontal(), child: SmartRefresher( + footer: DiyLoadFooter(noDataText: '只展示一些精选过的圈友哦~',), onRefresh: refreshData, controller: refreshController, onLoading: _onLoading, @@ -379,18 +380,19 @@ class _DiscoverState extends State itemBuilder: (BuildContext context, int index) { return GestureDetector( onTap: () { - List imgList = []; - user.images!.forEach((element) { - imgList.add(element); - }); - - Get.toNamed(AppRoutes.Swiper, - arguments: { - 'imaglist': imgList, - 'index': index, - 'userId':user.userId.toString() - - }); + Get.toNamed(AppRoutes.UserInfoActivity,arguments: user.userId.toString()); + // List imgList = []; + // user.images!.forEach((element) { + // imgList.add(element); + // }); + // + // Get.toNamed(AppRoutes.Swiper, + // arguments: { + // 'imaglist': imgList, + // 'index': index, + // 'userId':user.userId.toString() + // + // }); }, child: CachedNetworkImage( imageUrl: user.images![index], diff --git a/circle_app/lib/app/circle/widgets/info_list_view.dart b/circle_app/lib/app/circle/widgets/info_list_view.dart index c8f54b9..84eea2f 100644 --- a/circle_app/lib/app/circle/widgets/info_list_view.dart +++ b/circle_app/lib/app/circle/widgets/info_list_view.dart @@ -497,8 +497,6 @@ class InfoListViewState extends State with AutomaticKeepAliveClien imageUrl:widget.bean.image, width: 40.sp, height: 40.sp, - memCacheHeight: 40, - memCacheWidth: 40, fit:BoxFit.cover ) , ) : Container(), @@ -1129,8 +1127,8 @@ class InfoListViewState extends State with AutomaticKeepAliveClien width: 40.sp, height: 40.sp, fit: BoxFit.cover, - memCacheHeight: 40, - memCacheWidth: 40, + // + // , ), ) ], @@ -1356,8 +1354,7 @@ class InfoListViewState extends State with AutomaticKeepAliveClien imageUrl:widget.bean.image, width: 40.sp, height: 40.sp, - memCacheHeight: 40, - memCacheWidth: 40, + fit:BoxFit.cover ), ), @@ -1475,8 +1472,6 @@ class InfoListViewState extends State with AutomaticKeepAliveClien width: (width - 1).sp, height: (width - 1).sp, fit: BoxFit.cover, - memCacheHeight: width.toInt() - 1, - memCacheWidth: width.toInt() - 1, ), ) ], diff --git a/circle_app/lib/app/circle/widgets/like_view.dart b/circle_app/lib/app/circle/widgets/like_view.dart index 0de878c..7cc25d7 100644 --- a/circle_app/lib/app/circle/widgets/like_view.dart +++ b/circle_app/lib/app/circle/widgets/like_view.dart @@ -1011,8 +1011,6 @@ class _LikeViewState extends State width: 40.sp, height: 40.sp, fit: BoxFit.cover, - memCacheHeight: 40, - memCacheWidth: 40, ), ) ], @@ -1329,8 +1327,6 @@ class _LikeViewState extends State imageUrl: bean['image'], width: 40.sp, height: 40.sp, - memCacheHeight: 40, - memCacheWidth: 40, fit: BoxFit.cover), ), ), @@ -1451,8 +1447,6 @@ class _LikeViewState extends State width: (width - 1).sp, height: (width - 1).sp, fit: BoxFit.cover, - memCacheHeight: width.toInt() - 1, - memCacheWidth: width.toInt() - 1, ), ) ], diff --git a/circle_app/lib/app/circle/widgets/new_people.dart b/circle_app/lib/app/circle/widgets/new_people.dart index afe3a04..6fd6428 100644 --- a/circle_app/lib/app/circle/widgets/new_people.dart +++ b/circle_app/lib/app/circle/widgets/new_people.dart @@ -60,6 +60,7 @@ class _NewPeopleState extends State { return GetBuilder(builder: (logic) { return logic.newPeopleList.isNotEmpty ? SmartRefresher( controller: logic.peopleRefreshController, + footer: DiyLoadFooter(noDataText: '只展示最近几天加入我们的圈友哦~',), onRefresh: logic.onRefresh, onLoading: logic.onLoading, enablePullUp: true, @@ -99,6 +100,7 @@ class _NewPeopleItemState extends State { Widget ListItem(VicinityItemBean item, int index) { return GestureDetector( onTap: () { + showOKToast('点击“👏欢迎”,对方回复您后就可以在消息列表进行聊天互动啦~'); // Get.toNamed(AppRoutes.UserInfoActivity, arguments: item.id.toString()); }, child: Container( diff --git a/circle_app/lib/app/circle/widgets/vicinity.dart b/circle_app/lib/app/circle/widgets/vicinity.dart index 0215d75..a173a41 100644 --- a/circle_app/lib/app/circle/widgets/vicinity.dart +++ b/circle_app/lib/app/circle/widgets/vicinity.dart @@ -83,17 +83,7 @@ class _VicinityState extends State with AutomaticKeepAliveClientMixin if (index == 0) { return bannerView(widget.logic); } else { - // if (widget.logic.myVip == 0 && index == widget.logic.vicinityList.length) { - // // return; - // return Stack( - // children: [ - // ListItem(widget.logic.vicinityList[index - 1], index - 1), - // showVipView() - // ], - // ); - // } else { return ListItem(widget.logic.vicinityList[index - 1], index - 1); - // } } }, ), @@ -272,16 +262,20 @@ class _VicinityState extends State with AutomaticKeepAliveClientMixin Widget ListItem(VicinityItemBean item, int index) { return GestureDetector( onTap: () { - if (index < 5) { + if (index < widget.logic.chargeFreeNum) { Get.toNamed(AppRoutes.UserInfoActivity, arguments: item.id.toString()); } else { - if (widget.logic - .myVip > 0) { - Get.toNamed(AppRoutes.UserInfoActivity, arguments: item.id.toString()); + if (widget.logic.chargeType == 1) { + if (widget.logic + .myVip > 0) { + Get.toNamed(AppRoutes.UserInfoActivity, arguments: item.id.toString()); + } else { + Get.bottomSheet(Scaffold(backgroundColor: Colors.transparent,body: Center( + child: showVipView(), + ),),isScrollControlled: true,backgroundColor: Colors.transparent,barrierColor: Colors.black.withOpacity(0.6)); + } } else { - Get.bottomSheet(Scaffold(backgroundColor: Colors.transparent,body: Center( - child: showVipView(), - ),),isScrollControlled: true,backgroundColor: Colors.transparent,barrierColor: Colors.black.withOpacity(0.6)); + Get.toNamed(AppRoutes.UserInfoActivity, arguments: item.id.toString()); } } diff --git a/circle_app/lib/app/circle_list/view.dart b/circle_app/lib/app/circle_list/view.dart index 5957480..d426553 100644 --- a/circle_app/lib/app/circle_list/view.dart +++ b/circle_app/lib/app/circle_list/view.dart @@ -144,6 +144,7 @@ class _CircleListPageState extends State with RouteAware { ), )), RefreshIndicator( + onRefresh: () async { logic.relaodData(); }, @@ -151,7 +152,7 @@ class _CircleListPageState extends State with RouteAware { controller: logic.rightCtr, itemBuilder: (context, index) { if (index == logic.circle.lists.length) { - return loaddingWidget(logic.isMore); + return loaddingWidget(logic.isMore,tip: '更多特色圈子正在赶来的路上~'); } return circleInfoItem(logic.circle.lists[index], index); }, @@ -278,8 +279,6 @@ class _CircleListPageState extends State with RouteAware { imageUrl: bean.image, width: 40.sp, height: 40.sp, - memCacheHeight: 40, - memCacheWidth: 40, fit: BoxFit.cover), ), ), @@ -442,8 +441,6 @@ class _CircleListPageState extends State with RouteAware { width: (width - 1).sp, height: (width - 1).sp, fit: BoxFit.cover, - memCacheHeight: width.toInt() - 1, - memCacheWidth: width.toInt() - 1, ), ) ], diff --git a/circle_app/lib/app/friendslist/logic.dart b/circle_app/lib/app/friendslist/logic.dart index 57557b7..338321f 100644 --- a/circle_app/lib/app/friendslist/logic.dart +++ b/circle_app/lib/app/friendslist/logic.dart @@ -1,34 +1,85 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import '../../network/api.dart'; import '../../network/dio_manager.dart'; +import '../../util/SharedPreferencesHelper.dart'; +import '../../util/eventBus.dart'; import '../../util/util.dart'; import 'state.dart'; class FriendslistLogic extends GetxController { final RefreshController refreshController = RefreshController(); + final RefreshController eachRefreshController = RefreshController(); final FriendslistState state = FriendslistState(); - + StreamSubscription? subscription; int page = 1; int isVip = 0; bool isLoad = true; + + int eachPage = 1; + + bool isEachLoad = true; + List lists = []; + List eachlists = []; + + int sameCityCount = 0; + int wantMeetCount = 0; + String tip = ''; + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + subscription?.cancel(); + } + @override void onInit() async { super.onInit(); - - + loadTotal(Get.arguments + 1); + SharedPreferencesHelper.getInstance().then((sharedPreferences) { + isVip = sharedPreferences.getInt(SharedPreferencesHelper.VIP); + }); + subscription = EventBusManager.on().listen((event) { + isVip = event.vip; + update(); + }); initList(); + initEachList(); } void dispose() { refreshController.dispose(); + eachRefreshController.dispose(); super.dispose(); } + + loadTotal(int type) async { + var data = await DioManager.instance + .get(url: Api.getFollowTotal+type.toString()); + if (data['code'] == 200) { + sameCityCount = data['data']['sameCityCount']; + wantMeetCount = data['data']['wantMeetCount']; + if (sameCityCount > 0 && wantMeetCount > 0) { + tip = '${sameCityCount}人和你同城,${wantMeetCount}人是你想认识的圈友'; + } else if (sameCityCount > 0) { + tip = '${sameCityCount}人和你同城'; + } else if (wantMeetCount > 0) { + tip = '${wantMeetCount}人是你想认识的圈友'; + } else { + tip = ''; + } + update(); + } + } + initList() async { if (page == 1) { lists.clear(); @@ -48,6 +99,34 @@ class FriendslistLogic extends GetxController { } } + sendCallMyFollowData() async { + var data = await DioManager.instance + .post(url: Api.callMyFollow); + if (data['code'] == 200) { + showOKToast('召唤喜欢操作成功'); + } + } + + initEachList() async { + if (eachPage == 1) { + eachlists.clear(); + } + var data = await DioManager.instance + .get(url: Api.mutualUsers, params: {'page': eachPage}); + var bean = BaseResponse.fromJson(data, (data) => User.fromJson(data)); + if (bean.isSuccess()) { + eachlists.addAll(bean.data.lists); + } + isEachLoad = false; + update(); + if (eachPage == 1) { + eachRefreshController.refreshCompleted(); + } else { + eachRefreshController.loadComplete(); + } + } + + setLike(int index) async { var data = await DioManager.instance.post( url: "${Api.setLike + lists[index].id.toString()}/follow", diff --git a/circle_app/lib/app/friendslist/view.dart b/circle_app/lib/app/friendslist/view.dart index ab70073..1a25ba5 100644 --- a/circle_app/lib/app/friendslist/view.dart +++ b/circle_app/lib/app/friendslist/view.dart @@ -1,43 +1,49 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:circle_app/app/likelist/view.dart'; +import 'package:circle_app/common/colors/app_color.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; +import '../../common/Widgets/base_tip_widget.dart'; import '../../components/my_app_bar.dart'; import '../../router/app_routers.dart'; import '../../util/util.dart'; import 'logic.dart'; -class FriendslistPage extends StatefulWidget { +class FriendslistPage extends StatefulWidget { FriendslistPage({Key? key}) : super(key: key); @override State createState() => _FriendslistPageState(); } -class _FriendslistPageState extends State with SingleTickerProviderStateMixin,AutomaticKeepAliveClientMixin { +class _FriendslistPageState extends State + with SingleTickerProviderStateMixin, AutomaticKeepAliveClientMixin { final logic = Get.find(); final state = Get.find().state; late TabController _tabController; - @override bool get wantKeepAlive => true; @override void initState() { // TODO: implement initState super.initState(); - _tabController = TabController(length: 2, vsync: this, initialIndex: Get.arguments); + _tabController = + TabController(length: 3, vsync: this, initialIndex: Get.arguments); + _tabController.addListener(() { + if (_tabController.indexIsChanging) { + logic.loadTotal(_tabController.index + 1); + } + }); } - @override Widget build(BuildContext context) { - return GetBuilder(builder: (logic) { return Container( decoration: BoxDecoration( @@ -48,7 +54,7 @@ class _FriendslistPageState extends State with SingleTickerProv ), child: Scaffold( backgroundColor: Colors.transparent, - appBar: MyAppBar( + appBar: MyAppBar( diyTitleWdiget: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -66,13 +72,21 @@ class _FriendslistPageState extends State with SingleTickerProv labelColor: const Color(0xFF00FFF4), unselectedLabelColor: const Color(0xB3FFFFFF), indicatorSize: TabBarIndicatorSize.label, - indicatorPadding: EdgeInsets.only(left: 30.sp, right: 30.sp), + indicatorPadding: EdgeInsets.only(left: 20.sp, right: 20.sp,bottom: 8.sp), tabs: [ + Tab( + child: Text( + '互相喜欢', + style: TextStyle( + fontSize: 15.sp, + ), + ), + ), Tab( child: Text( '我喜欢的', style: TextStyle( - fontSize: 20.sp, + fontSize: 15.sp, ), ), ), @@ -80,15 +94,14 @@ class _FriendslistPageState extends State with SingleTickerProv child: Text( '喜欢我的', style: TextStyle( - fontSize: 20.sp, + fontSize: 15.sp, ), ), ), - ], labelStyle: TextStyle( color: const Color(0xFF00FFF4), - fontSize: 18.sp, + fontSize: 15.sp, shadows: [ Shadow( color: const Color(0xFFF657FF).withOpacity(0.5), @@ -100,7 +113,7 @@ class _FriendslistPageState extends State with SingleTickerProv ), unselectedLabelStyle: TextStyle( // color: const Color(0xB3FFFFFF), - fontSize: 18.sp, + fontSize: 15.sp, shadows: [ Shadow( // color: const Color(0xFFF657FF), @@ -109,134 +122,241 @@ class _FriendslistPageState extends State with SingleTickerProv ), ], ), - onTap: (index) { - - }, + onTap: (index) {}, ), ], ), - + actionWdiget: GestureDetector( + onTap: () { + if (logic.isVip == 2) { + if (logic.lists.isEmpty) { + showOKToast('您还没有喜欢的人哦,可以前往感兴趣的圈子寻找喜欢的人'); + } else { + logic.sendCallMyFollowData(); + } + } else { + showOKToast('成为年会员后可以一键召唤喜欢的人哦~'); + showOepnVipDialog(); + } + }, + child: Container( + height: 20.sp, + alignment: Alignment.center, + padding: EdgeInsets.only(left: 4.sp, right: 4.sp), + decoration: BoxDecoration( + gradient: AppColor.mainVerLinearGradient, + borderRadius: BorderRadius.circular(10.sp)), + child: Text( + '召唤喜欢', + style: TextStyle(color: Colors.black, fontSize: 10.sp), + ), + ), + ), + ), + body: Column( + children: [ + if (logic.tip.isNotEmpty) + Container( + margin: EdgeInsets.only(bottom: 5.sp,), + child: RichText( + text: TextSpan( + children: [ + if (logic.sameCityCount > 0) + TextSpan( + text: '${logic.sameCityCount}', + style: TextStyle( + color: AppColor.mainColor, fontSize: 14.0), + ), + if (logic.sameCityCount > 0) + TextSpan( + text: '人和你同城', + style: TextStyle( + color: Colors.white, fontSize: 14.0), + ), + if (logic.sameCityCount > 0 && + logic.wantMeetCount > 0) + TextSpan( + text: ',', + style: TextStyle( + color: Colors.white, fontSize: 14.0), + ), + if (logic.wantMeetCount > 0) + TextSpan( + text: '${logic.wantMeetCount}', + style: TextStyle( + color: AppColor.mainColor, + fontSize: 14.0, + fontWeight: FontWeight.bold), + ), + if (logic.wantMeetCount > 0) + TextSpan( + text: '人是你想认识的类型', + style: TextStyle( + color: Colors.white, fontSize: 14.0), + ), + ], + ), + ), + ), + Expanded( + child: TabBarView( + children: [eachtherLiveWidget(), myLiveWidget(), LikelistPage()], + controller: _tabController, + ), + ), + ], ), - body: TabBarView(children: [myLiveWidget(),LikelistPage()],controller: _tabController,), ), ); }); } + Widget eachtherLiveWidget() { + return SafeArea( + child: logic.isEachLoad + ? loaddingWidget(true) + : logic.eachlists.isEmpty + ? noResultWidget() + : SmartRefresher( + controller: logic.eachRefreshController, + onRefresh: _onEachRefresh, + onLoading: _onEachLoading, + enablePullUp: true, + child: ListView.builder( + padding: EdgeInsets.all(10.sp), + itemCount: logic.eachlists.length, + itemBuilder: (context, index) { + return ListItem(logic.eachlists[index], index); + }, + ), + ), + ); + } + Widget myLiveWidget() { return SafeArea( - child: logic.isLoad ? loaddingWidget(true) : logic.lists.isEmpty ? noResultWidget() : SmartRefresher( - controller: logic.refreshController, - onRefresh: _onRefresh, - onLoading: _onLoading, - enablePullUp: true, - child: ListView.builder( - padding: EdgeInsets.all(10.sp), - itemCount: logic.lists.length, - itemBuilder: (context, index) { - return ListItem(logic.lists[index],index); - }, + child: logic.isLoad + ? loaddingWidget(true) + : logic.lists.isEmpty + ? noResultWidget() + : SmartRefresher( + controller: logic.refreshController, + onRefresh: _onRefresh, + onLoading: _onLoading, + enablePullUp: true, + child: ListView.builder( + padding: EdgeInsets.all(10.sp), + itemCount: logic.lists.length, + itemBuilder: (context, index) { + return ListItem(logic.lists[index], index); + }, + ), + ), + ); + } + + Widget ListItem(UserInfo item, int index) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Get.toNamed(AppRoutes.UserInfoActivity, arguments: item.id.toString()); + }, + child: Container( + margin: const EdgeInsets.only(bottom: 21), + child: Row( + children: [ + Stack( + children: [ + ClipOval( + child: GestureDetector( + onTap: () { + var imgList = []; + imgList.add(item.avatar); + Get.toNamed(AppRoutes.Swiper, + arguments: {'imaglist': imgList, 'index': 0}); + }, + child: CachedNetworkImage( + fit: BoxFit.cover, + imageUrl: item.avatarThumb, + width: 53.sp, + height: 53.sp, + ), + ), + ), + Positioned( + right: 0, + left: 0, + bottom: 0, + child: item.vip > 0 + ? Image( + image: AssetImage( + getBaseImage(item.vip == 1 ? "vip" : 'year_vip')), + width: 44.sp, + height: 18.sp, + ) + : Container(), + ) + ], + ), + SizedBox(width: 10.sp), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + item.nickname, + style: const TextStyle( + color: Colors.white70, + fontSize: 14, + fontWeight: FontWeight.bold), + ), + SizedBox(width: 4.sp), + // SizedBox(height: 8.sp), + _buildInfoRow(item), + // Placeholder image + ], + ), + SizedBox(height: 8.sp), + SizedBox( + width: 200.sp, + child: Text( + item.signature, + overflow: TextOverflow.ellipsis, // 超出部分使用省略号表示 + maxLines: 1, + style: TextStyle( + fontSize: 12.sp, color: const Color(0xFFB7BECC)), + ), + ), + ], + ), + // Pla + const Spacer(), + GestureDetector( + onTap: () { + logic.setLike(index); + }, + child: Container( + width: 75, + height: 28, + decoration: BoxDecoration( + color: const Color(0xFFFF4D7C), + borderRadius: BorderRadius.circular(14), + ), + child: Center( + child: Text(item.isLike ? "取消喜欢" : "喜欢", + style: TextStyle(fontSize: 14.sp, color: Colors.white)), + ), + ), + ), + ], ), ), ); } - Widget ListItem(UserInfo item,int index) { - return GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: (){ - Get.toNamed(AppRoutes.UserInfoActivity, arguments: item.id.toString()); - }, - child: Container( - margin: const EdgeInsets.only(bottom: 21), - child: Row( - children: [ - Stack(children: [ - ClipOval( - child: GestureDetector( - onTap: () { - var imgList = []; - imgList.add(item.avatar); - Get.toNamed(AppRoutes.Swiper, arguments: { - 'imaglist': imgList, - 'index': 0 - }); - }, - child: CachedNetworkImage( - fit: BoxFit.cover, - imageUrl: item.avatarThumb, - width: 53.sp, - height: 53.sp, - ), - ), - ), - Positioned( - right: 0, - left: 0, - bottom: 0, - - child: item.vip>0 ? - Image( - image: AssetImage(getBaseImage(item.vip == 1 ? "vip" : 'year_vip')), - width: 44.sp, - height: 18.sp, - ):Container(),) - ],), - SizedBox(width: 10.sp), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Text( - item.nickname, - style: const TextStyle(color :Colors.white70,fontSize: 14, fontWeight: FontWeight.bold), - ), - SizedBox(width: 4.sp), - // SizedBox(height: 8.sp), - _buildInfoRow(item), - // Placeholder image - ], - ), - - SizedBox(height: 8.sp), - SizedBox( - width: 200.sp, - child: Text( - item.signature, - overflow: TextOverflow.ellipsis, // 超出部分使用省略号表示 - maxLines: 1, - style: TextStyle(fontSize: 12.sp, color: const Color(0xFFB7BECC)), - ), - ), - ], - ), - // Pla - const Spacer(), - GestureDetector(onTap: (){ - - logic.setLike(index); - }, - child: Container( - width: 75, - height: 28, - decoration: BoxDecoration( - color: const Color(0xFFFF4D7C), - borderRadius: BorderRadius.circular(14), - ), - child: - Center( - child: Text(item.isLike?"取消喜欢":"喜欢", style: TextStyle(fontSize: 14.sp, color: Colors.white)), - ), - ), - ), - ], - ), - ),); - } - Widget _buildInfoRow(UserInfo userInfoBean) { - String ageMsg = getAgeCOntent(userInfoBean.gender, userInfoBean.age, + String ageMsg = getAgeCOntent(userInfoBean.gender, userInfoBean.age, userInfoBean.role, userInfoBean.orientation); return Row( children: [ @@ -255,7 +375,7 @@ class _FriendslistPageState extends State with SingleTickerProv padding: EdgeInsets.only( top: 2.sp, bottom: 2.sp, left: 10.sp, right: 10.sp), child: Text( - ageMsg , + ageMsg, style: TextStyle( color: Colors.black, fontSize: 10.sp, @@ -263,7 +383,6 @@ class _FriendslistPageState extends State with SingleTickerProv ), ), SizedBox(width: 6.sp), - ], ); } @@ -277,4 +396,14 @@ class _FriendslistPageState extends State with SingleTickerProv logic.page = logic.page + 1; logic.initList(); } + + void _onEachRefresh() async { + logic.eachPage = 1; + logic.initEachList(); + } + + void _onEachLoading() async { + logic.eachPage = logic.eachPage + 1; + logic.initEachList(); + } } diff --git a/circle_app/lib/app/home/logic.dart b/circle_app/lib/app/home/logic.dart index 1688767..173545f 100644 --- a/circle_app/lib/app/home/logic.dart +++ b/circle_app/lib/app/home/logic.dart @@ -161,6 +161,13 @@ class HomeLogic extends GetxController with WidgetsBindingObserver { content['nickname']); }); break; + case 9://有新人加入 + { + CircleLogic logic = Get.find(); + logic.isNewPeopleRed = true; + logic.update(); + } + break; } } diff --git a/circle_app/lib/app/minefragment/view.dart b/circle_app/lib/app/minefragment/view.dart index 443e79f..bcf5469 100644 --- a/circle_app/lib/app/minefragment/view.dart +++ b/circle_app/lib/app/minefragment/view.dart @@ -591,7 +591,7 @@ class _MinefragmentPageState extends State with RouteAware { GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { - Get.toNamed(AppRoutes.FriendsActivity,arguments: 0); + Get.toNamed(AppRoutes.FriendsActivity,arguments: 1); }, child: Column( mainAxisAlignment: MainAxisAlignment.center, @@ -629,7 +629,7 @@ class _MinefragmentPageState extends State with RouteAware { SharedPreferencesHelper.getInstance().then((sharedPreferences) { sharedPreferences.setInt(SharedPreferencesHelper.LIKEMECOUNT, logic.like_me_count); }); - Get.toNamed(AppRoutes.FriendsActivity,arguments: 1); + Get.toNamed(AppRoutes.FriendsActivity,arguments: 2); }, child: Stack( children: [ diff --git a/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart b/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart index 0f28c1a..443b433 100644 --- a/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart +++ b/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart @@ -1134,8 +1134,6 @@ class _TIMConversationState extends TIMUIKitState { imageUrl: bean['image'], width: 40.sp, height: 40.sp, - memCacheHeight: 40, - memCacheWidth: 40, fit: BoxFit.cover), ), ), diff --git a/circle_app/lib/app/msg/recommend_circle_friend_item.dart b/circle_app/lib/app/msg/recommend_circle_friend_item.dart index d5076a1..5898a1d 100644 --- a/circle_app/lib/app/msg/recommend_circle_friend_item.dart +++ b/circle_app/lib/app/msg/recommend_circle_friend_item.dart @@ -542,8 +542,6 @@ class _CircleInfoItemState extends State { imageUrl: bean['image'], width: 40.sp, height: 40.sp, - memCacheHeight: 40, - memCacheWidth: 40, fit: BoxFit.cover), ), ), diff --git a/circle_app/lib/app/msg/view.dart b/circle_app/lib/app/msg/view.dart index 7305699..65f913a 100644 --- a/circle_app/lib/app/msg/view.dart +++ b/circle_app/lib/app/msg/view.dart @@ -110,8 +110,6 @@ class _MsgPageState extends State with AutomaticKeepAliveClientMixin { width: (width - 1).sp, height: (width - 1).sp, fit: BoxFit.cover, - memCacheHeight: width.toInt() - 1, - memCacheWidth: width.toInt() - 1, ), ) ], diff --git a/circle_app/lib/app/my_circle/view.dart b/circle_app/lib/app/my_circle/view.dart index a5f4e42..4074bee 100644 --- a/circle_app/lib/app/my_circle/view.dart +++ b/circle_app/lib/app/my_circle/view.dart @@ -182,8 +182,6 @@ class _My_circlePageState extends State imageUrl: bean.image, width: 40.sp, height: 40.sp, - memCacheHeight: 40, - memCacheWidth: 40, fit: BoxFit.cover), ), ), diff --git a/circle_app/lib/app/offaccount/view.dart b/circle_app/lib/app/offaccount/view.dart index e483e5f..87af129 100644 --- a/circle_app/lib/app/offaccount/view.dart +++ b/circle_app/lib/app/offaccount/view.dart @@ -287,26 +287,36 @@ class _OffaccountState extends State { void showBottomSheetDialog(BuildContext context,OffaccountLogic logic) { showModalBottomSheet( context: context, - backgroundColor: Colors.transparent, + // backgroundColor: Colors.transparent, + builder: (BuildContext context) { return Container( decoration: BoxDecoration( - color: Colors.black.withOpacity(0.6), - borderRadius: BorderRadius.only( - topLeft: Radius.circular(20.sp), - topRight: Radius.circular(20.sp), - ), + color: Colors.black, + + // borderRadius: BorderRadius.only( + // topLeft: Radius.circular(20.sp), + // topRight: Radius.circular(20.sp), + // ), ), child: Column( mainAxisSize: MainAxisSize.min, children: [ - buildOptionItem("体验太差", context,logic), + buildOptionItem("换平台玩了", context, logic), buildDivider(), - buildOptionItem("换平台了", context,logic), + buildOptionItem("功能体验差", context, logic), buildDivider(), - buildOptionItem("担心隐私泄露", context,logic), + buildOptionItem("消息通知比较频繁", context, logic), buildDivider(), - buildOptionItem("其他原因", context,logic), + buildOptionItem("找不到合适的人", context, logic), + buildDivider(), + buildOptionItem("回复消息的人少", context, logic), + buildDivider(), + buildOptionItem("收费有点高", context, logic), + buildDivider(), + buildOptionItem("收费的地方有点多", context, logic), + buildDivider(), + buildOptionItem("其他原因", context, logic), ], ), ); diff --git a/circle_app/lib/app/setup/view.dart b/circle_app/lib/app/setup/view.dart index 7c68a6b..211b44a 100644 --- a/circle_app/lib/app/setup/view.dart +++ b/circle_app/lib/app/setup/view.dart @@ -121,6 +121,8 @@ class SetupPage extends StatelessWidget { child: _buildItemRow('关于微乐园', getHomeImage("icon_in")), ), ), + Expanded(child: Container()), + SafeArea(child: Center(child: Text('备案号:粤ICP备2023079493号-2A',style: TextStyle(color: Colors.white.withOpacity(0.5),fontSize: 12.sp),))) ], ), ),), diff --git a/circle_app/lib/app/swiper/view.dart b/circle_app/lib/app/swiper/view.dart index 6868062..17801b7 100644 --- a/circle_app/lib/app/swiper/view.dart +++ b/circle_app/lib/app/swiper/view.dart @@ -159,6 +159,19 @@ class _SwiperPageState extends State { ), ), )), + Positioned( + left: 5.sp, + top: 10.sp + MediaQuery.of(context).padding.top, + child: IconButton( + onPressed: () { + Get.back(); + }, + padding: EdgeInsets.only(left: 15.sp), + icon: Image.asset('assets/images/navigator/back.png', + width: 30.sp, + height: 30.sp, + ), + )), ], ), ), diff --git a/circle_app/lib/app/userinfo/view.dart b/circle_app/lib/app/userinfo/view.dart index a561d77..3e0a73f 100644 --- a/circle_app/lib/app/userinfo/view.dart +++ b/circle_app/lib/app/userinfo/view.dart @@ -268,11 +268,11 @@ class MyTabbedScreenState extends State toolbarHeight: 0, foregroundColor: Colors.transparent, backgroundColor: Colors.transparent, - expandedHeight: 355.sp + + expandedHeight: 352.sp + (logic.userInfoBean != null ? logic.userInfoBean!.contact!.isNotEmpty && logic.userId.toString().isNotEmpty - ? 59.sp + ? 42.sp : 0 : 0), // bottom: PreferredSize( @@ -478,7 +478,7 @@ class MyTabbedScreenState extends State padding: EdgeInsets.symmetric( horizontal: 15.sp, ), - margin: EdgeInsets.only(top: 19.sp), + margin: EdgeInsets.only(top: 13.sp), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -565,7 +565,7 @@ class MyTabbedScreenState extends State alignment: Alignment.centerLeft, // width: 200.sp, // color: Colors.red, - margin: EdgeInsets.only(left: 15.sp, bottom: 15.sp), + margin: EdgeInsets.only(left: 5.sp, bottom: 5.sp), child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ @@ -591,10 +591,11 @@ class MyTabbedScreenState extends State }, child: Container( margin: EdgeInsets.only( - top: 0.sp, left: 15.sp, right: 10.sp, bottom: 10.sp), + top: 0.sp, left: 15.sp, right: 10.sp, bottom: 0.sp), padding: EdgeInsets.only( - left: 12.sp, right: 12.sp, bottom: 18.sp, top: 16.sp), - height: 144.sp, + left: 12.sp, right: 12.sp, top: 16.sp), + + height: 134.sp, decoration: BoxDecoration( color: Color(0x1AFFFFFF), borderRadius: BorderRadius.circular(14.sp)), diff --git a/circle_app/lib/app/visitorlist/logic.dart b/circle_app/lib/app/visitorlist/logic.dart index 6c8c240..34bc1e0 100644 --- a/circle_app/lib/app/visitorlist/logic.dart +++ b/circle_app/lib/app/visitorlist/logic.dart @@ -1,6 +1,8 @@ import 'dart:async'; +import 'package:circle_app/util/util.dart'; import 'package:get/get.dart'; +import 'package:oktoast/oktoast.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import '../../common/Widgets/open_vip_tip/logic.dart'; @@ -11,6 +13,25 @@ import '../../util/eventBus.dart'; import 'state.dart'; class VisitorlistLogic extends GetxController { + + + + final RefreshController refreshController = RefreshController(); + final VisitorlistState state = VisitorlistState(); + int page = 1; + int isVip = 0; + bool isLoad = true; + List lists = []; + List users = []; + StreamSubscription? subscription = null; + + int sameCityCount = 0; + int wantMeetCount = 0; + String tip = ''; + + bool userIsMore = true; + int userPage = 1; + @override void dispose() { refreshController.dispose(); @@ -21,14 +42,6 @@ class VisitorlistLogic extends GetxController { super.dispose(); } - final RefreshController refreshController = RefreshController(); - final VisitorlistState state = VisitorlistState(); - int page = 1; - int isVip = 0; - bool isLoad = true; - List lists = []; - StreamSubscription? subscription = null; - @override void onInit() async { super.onInit(); @@ -38,7 +51,38 @@ class VisitorlistLogic extends GetxController { page = 1; initList(); }); + loadVisitorTotalData(); refreshVipStatus(); + loadInterestedInMeUsersData(); + } + + void loadInterestedInMeUsersData() async { + var data = + await DioManager.instance.get(url: Api.interestedInMeUsers); + if (data['code'] == 200) { + List infoList = data['data']['lists']; + if (infoList.isNotEmpty) { + users = data['data']['lists']; + } + update(); + } + } + + void loadVisitorTotalData() async { + var data = + await DioManager.instance.get(url: Api.getVisitorTotal,); + if (data['code'] == 200) { + sameCityCount = data['data']['sameCityCount']; + wantMeetCount = data['data']['wantMeetCount']; + if (sameCityCount > 0 && wantMeetCount > 0) { + tip = '${sameCityCount}人和你同城,${wantMeetCount}人是你想认识的圈友'; + } else if (sameCityCount > 0) { + tip = '${sameCityCount}人和你同城'; + } else if (wantMeetCount > 0) { + tip = '${wantMeetCount}人是你想认识的圈友'; + } + update(); + } } refreshVipStatus() async { @@ -58,7 +102,7 @@ class VisitorlistLogic extends GetxController { initList() async { if (page == 1) { - lists.clear(); + // lists.clear(); } var data = await DioManager.instance @@ -66,16 +110,37 @@ class VisitorlistLogic extends GetxController { var bean = BaseResponse.fromJson( data, (data) => UserList.fromJson(data)); if (bean.isSuccess()) { - lists.addAll(bean.data.lists); + List list = bean.data.lists; + + if (list.isNotEmpty) { + if (page == 1) { + lists = bean.data.lists; + refreshController.resetNoData(); + refreshController.refreshCompleted(); + } else { + refreshController.loadComplete(); + lists.addAll(bean.data.lists); + } + + } else { + refreshController.loadNoData(); + } + } isLoad = false; update(); - if (page == 1) { - refreshController.refreshCompleted(); - } else { - refreshController.loadComplete(); + + } + + void sendAllLike(List idList) async { + var data = await DioManager.instance + .postBody(url: Api.allUserFollow, params: {'userIds': idList}); + if (data['code'] == 200) { + showOKToast('一键喜欢操作成功'); + users.clear(); + update(); } } } @@ -90,6 +155,7 @@ class User { final int vip; final int gender; final int role; + final int mark; final int orientation; final double lng; final double lat; @@ -104,6 +170,7 @@ class User { required this.birthday, required this.age, required this.vip, + required this.mark, required this.gender, required this.role, required this.orientation, @@ -127,6 +194,7 @@ class User { orientation: json['orientation'], lng: json['lng'], lat: json['lat'], + mark: json['mark'] ?? 0, city: json['city'], avatarThumb: json['avatar_thumb'], ); diff --git a/circle_app/lib/app/visitorlist/view.dart b/circle_app/lib/app/visitorlist/view.dart index 8f668f3..38ab52a 100644 --- a/circle_app/lib/app/visitorlist/view.dart +++ b/circle_app/lib/app/visitorlist/view.dart @@ -1,13 +1,16 @@ import 'dart:ui'; import 'package:cached_network_image/cached_network_image.dart'; +import 'package:circle_app/app/visitorlist/widget/visitors_follow_item.dart'; import 'package:circle_app/main.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; +import '../../common/Widgets/base_tip_widget.dart'; import '../../common/Widgets/open_vip_tip/view.dart'; +import '../../common/colors/app_color.dart'; import '../../components/my_app_bar.dart'; import '../../router/app_routers.dart'; import '../../util/util.dart'; @@ -17,17 +20,10 @@ class VisitorlistPage extends StatelessWidget { VisitorlistPage({Key? key}) : super(key: key); final logic = Get.find(); - final state = Get - .find() - .state; + final state = Get.find().state; @override Widget build(BuildContext context) { - - - - - return GetBuilder(builder: (logic) { return Container( decoration: BoxDecoration( @@ -38,8 +34,33 @@ class VisitorlistPage extends StatelessWidget { ), child: Scaffold( backgroundColor: Colors.transparent, - appBar: const MyAppBar( + appBar: MyAppBar( centerTitle: "最近访客", + actionWdiget: GestureDetector( + onTap: () { + if (logic.isVip == 2) { + showOKToast('已为你增加10倍曝光啦'); + } else { + showOKToast('开通年会员可以增加10倍曝光哦~'); + showOepnVipDialog(); + } + }, + child: Container( + height: 24.sp, + padding: EdgeInsets.only(left: 6.sp, right: 6.sp), + decoration: BoxDecoration( + gradient: AppColor.mainVerLinearGradient, + borderRadius: BorderRadius.circular(12.sp)), + child: Row( + children: [ + Text( + '10倍曝光', + style: TextStyle(color: Colors.black, fontSize: 13.sp), + ) + ], + ), + ), + ), ), body: Stack( children: [ @@ -47,26 +68,26 @@ class VisitorlistPage extends StatelessWidget { child: logic.isLoad ? loaddingWidget(true) : logic.lists.isEmpty - ? noResultWidget() - : SmartRefresher( - controller: logic.refreshController, - onRefresh: _onRefresh, - onLoading: _onLoading, - enablePullUp: true, - child: Stack( - alignment: Alignment.topCenter, - children: [ - ListView.builder( - padding: EdgeInsets.all(10.sp), - itemCount: logic.lists.length, - itemBuilder: (context, index) { - return ListItem(logic.lists[index], index); - }, - ), - showGd() - ], - ), - ), + ? noResultWidget() + : Stack( + alignment: Alignment.topCenter, + children: [ + SmartRefresher( + controller: logic.refreshController, + onRefresh: _onRefresh, + onLoading: _onLoading, + enablePullUp: true, + child: ListView.builder( + padding: EdgeInsets.all(10.sp), + itemCount: logic.lists.length, + itemBuilder: (context, index) { + return ListItem( + logic.lists[index], index); + }, + )), + showGd() + ], + ), ), ], ), @@ -91,10 +112,10 @@ class VisitorlistPage extends StatelessWidget { List widgets = []; - switch(urlList.length){ + switch (urlList.length) { case 0: widgets.add(Positioned( - left: (Get.width /2) - 40, + left: (Get.width / 2) - 40, child: circleWidget(""), )); break; @@ -102,7 +123,7 @@ class VisitorlistPage extends StatelessWidget { for (int i = 0; i < urlList.length; i++) { var element = urlList[i]; // double xOffset = interval * i + xOffsetBase; - double let = (Get.width /2) - 60 ; + double let = (Get.width / 2) - 60; widgets.add(Positioned( left: let, @@ -111,18 +132,19 @@ class VisitorlistPage extends StatelessWidget { } widgets.add(Positioned( - left: (Get.width /2) - 20, + left: (Get.width / 2) - 20, child: circleWidget(""), )); break; case 2: - - double xOffsetBase = (Get.width + interval * urlList.length - 60.0 * urlList.length) * 0.25; + double xOffsetBase = + (Get.width + interval * urlList.length - 60.0 * urlList.length) * + 0.25; for (int i = 0; i < urlList.length; i++) { var element = urlList[i]; // double xOffset = interval * i + xOffsetBase; - double let = ((Get.width /2) - ((40*urlList.length))+(i*40)) ; + double let = ((Get.width / 2) - ((40 * urlList.length)) + (i * 40)); widgets.add(Positioned( left: let, @@ -137,218 +159,264 @@ class VisitorlistPage extends StatelessWidget { )); break; case 3: - // double xOffsetBase = (Get.width + interval * urlList.length - 60.0 * urlList.length) * 0.25; + // double xOffsetBase = (Get.width + interval * urlList.length - 60.0 * urlList.length) * 0.25; for (int i = 0; i < urlList.length; i++) { - switch(i){ + switch (i) { case 0: widgets.add(Positioned( - left: (Get.width /2) - 100, + left: (Get.width / 2) - 100, child: circleWidget(urlList[i]), )); break; case 1: widgets.add(Positioned( - left: (Get.width /2) - 60, + left: (Get.width / 2) - 60, child: circleWidget(urlList[i]), )); break; case 2: widgets.add(Positioned( - left: (Get.width /2) - 20, + left: (Get.width / 2) - 20, child: circleWidget(urlList[i]), )); break; } } widgets.add(Positioned( - left: (Get.width /2) + 20, + left: (Get.width / 2) + 20, child: circleWidget(""), )); - break; } - return logic.isVip > 0 ? Container() : Positioned( - bottom: 150, - child: Container( - width: Get.width, - child: Column( - children: [ - SizedBox( - height: 140.sp, + bottom: 0, + child: Container( width: Get.width, - child: Stack( - alignment: Alignment.centerLeft, - children: widgets, - ), - ), - Container( - margin: EdgeInsets.only(bottom: 40.sp), - child: Text( - "TA们也喜欢你哦 \n" - "成为会员查看所有圈友信息", - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.white, - fontSize: 15.sp, - ), - ), - ), - GestureDetector( - onTap: () { - showRechargeDialog(); - }, - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(17), - gradient: LinearGradient( - colors: [ - Color(0xFF06F9FA), - Color(0xFFDC5BFD), - ], - begin: Alignment.centerLeft, - end: Alignment.centerRight, - ), - ), - padding: EdgeInsets.symmetric( - vertical: 10.sp, - horizontal: 55.sp, - ), - child: Text( - "开通会员查看更多访客", - style: TextStyle( - color: Colors.white, - fontSize: 14.sp, - ), - ), - ), - ), - ], - ), - ), - ); - } - - - Widget ListItem(UserListItem item, int index) { - //print("是不是vip"+logic.isVip.toString()); - return GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - if (logic.isVip > 0 || index < 3) { - Get.toNamed(AppRoutes.UserInfoActivity, - arguments: item.user.id.toString()); - } - }, - child: ImageFiltered( - imageFilter: ImageFilter.blur( - sigmaX: (logic.isVip > 0 || index < 3) ? 0 : 5, - sigmaY: (logic.isVip > 0 || index < 3) ? 0 : 5, - ), - child: Container( - margin: const EdgeInsets.only(bottom: 21), - child: Row( - children: [ - Stack( - children: [ - ClipOval( - child: GestureDetector( - onTap: () { - if (logic.isVip > 0 || index < 3) { - var imgList = []; - imgList.add(item.user.avatar); - Get.toNamed(AppRoutes.Swiper, - arguments: {'imaglist': imgList, 'index': 0}); - } - }, - child: CachedNetworkImage( - fit: BoxFit.cover, - imageUrl: item.user.avatarThumb, - width: 53.sp, - height: 53.sp, - ), - ), - ), - Positioned( - right: 0.sp, - left: 0.sp, - bottom: 0.sp, - child: item.user.vip != 0 - ? Image( - image: AssetImage(getBaseImage(item.user.vip == 1 ? "vip" : 'year_vip')), - width: 44.sp, - height: 18.sp, - ) - : Container(), - ) - ], - ), - SizedBox(width: 10.sp), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( + child: Column( children: [ - Text( - item.user.nickname, - style: const TextStyle( - color: Colors.white70, - fontSize: 14, - fontWeight: FontWeight.bold), + SizedBox( + height: 70.sp, + width: Get.width, + child: Stack( + alignment: Alignment.centerLeft, + children: widgets, + ), + ), + Container( + margin: EdgeInsets.only(bottom: 10.sp, top: 10.sp), + child: Text( + "TA们也喜欢你哦 \n" + "成为会员查看所有圈友信息", + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.white, + fontSize: 15.sp, + ), + ), + ), + if (logic.tip.isNotEmpty) + Container( + margin: EdgeInsets.only(bottom: 10.sp), + child: RichText( + text: TextSpan( + children: [ + if (logic.sameCityCount > 0) + TextSpan( + text: '${logic.sameCityCount}', + style: TextStyle( + color: AppColor.mainColor, fontSize: 14.0), + ), + if (logic.sameCityCount > 0) + TextSpan( + text: '人和你同城', + style: TextStyle( + color: Colors.white, fontSize: 14.0), + ), + if (logic.sameCityCount > 0 && + logic.wantMeetCount > 0) + TextSpan( + text: ',', + style: TextStyle( + color: Colors.white, fontSize: 14.0), + ), + if (logic.wantMeetCount > 0) + TextSpan( + text: '${logic.wantMeetCount}', + style: TextStyle( + color: AppColor.mainColor, + fontSize: 14.0, + fontWeight: FontWeight.bold), + ), + if (logic.wantMeetCount > 0) + TextSpan( + text: '人是你想认识的类型', + style: TextStyle( + color: Colors.white, fontSize: 14.0), + ), + ], + ), + ), + ), + GestureDetector( + onTap: () { + showRechargeDialog(); + }, + child: Container( + height: 40.sp, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + gradient: LinearGradient( + colors: [ + Color(0xFF06F9FA), + Color(0xFFDC5BFD), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + margin: EdgeInsets.only( + left: 50.sp, right: 50.sp, bottom: 20.sp), + child: Text( + "开通会员查看更多访客", + style: TextStyle( + color: Colors.white, + fontSize: 14.sp, + ), + ), + ), ), - SizedBox(width: 4.sp), - // SizedBox(height: 8.sp), - _buildInfoRow(item), - // Placeholder image ], ), - SizedBox(height: 8.sp), - SizedBox( - width: 200.sp, - child: Text( - item.user.signature, - overflow: TextOverflow.ellipsis, // 超出部分使用省略号表示 - maxLines: 1, - style: TextStyle( - fontSize: 12.sp, color: const Color(0xFFB7BECC)), - ), - ), - ], - ), - // Pla - const Spacer(), - GestureDetector( - onTap: () { - if (logic.isVip > 0 || index < 3) { - Get.toNamed(AppRoutes.UserInfoActivity, - arguments: item.user.id.toString()); - // pushChatPage(item.user.id.toString(), item.accountId, - // item.user.nickname); - } - }, + ), + ); + } + + Widget ListItem(UserListItem item, int index) { + return Column( + children: [ + if (index == 0 && logic.users.isNotEmpty) + VisitorsFollowItem(users: logic.users), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + if (logic.isVip > 0 || index < 3) { + Get.toNamed(AppRoutes.UserInfoActivity, + arguments: item.user.id.toString()); + } + }, + child: ImageFiltered( + imageFilter: ImageFilter.blur( + sigmaX: (logic.isVip > 0 || index < 3) ? 0 : 5, + sigmaY: (logic.isVip > 0 || index < 3) ? 0 : 5, + ), child: Container( - width: 60.sp, - height: 28.sp, - decoration: BoxDecoration( - color: const Color(0xFFFF4D7C), - borderRadius: BorderRadius.circular(14.sp), - ), - child: Center( - child: Text("回访", - style: TextStyle(fontSize: 14.sp, color: Colors.white)), + margin: const EdgeInsets.only(bottom: 21), + child: Row( + children: [ + Stack( + children: [ + ClipOval( + child: GestureDetector( + onTap: () { + if (logic.isVip > 0 || index < 3) { + var imgList = []; + imgList.add(item.user.avatar); + Get.toNamed(AppRoutes.Swiper, + arguments: {'imaglist': imgList, 'index': 0}); + } + }, + child: CachedNetworkImage( + fit: BoxFit.cover, + imageUrl: item.user.avatarThumb, + width: 53.sp, + height: 53.sp, + ), + ), + ), + Positioned( + right: 0.sp, + left: 0.sp, + bottom: 0.sp, + child: item.user.vip != 0 + ? Image( + image: AssetImage(getBaseImage( + item.user.vip == 1 ? "vip" : 'year_vip')), + width: 44.sp, + height: 18.sp, + ) + : Container(), + ) + ], + ), + SizedBox(width: 10.sp), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + item.user.nickname, + style: const TextStyle( + color: Colors.white70, + fontSize: 14, + fontWeight: FontWeight.bold), + ), + SizedBox(width: 4.sp), + // SizedBox(height: 8.sp), + _buildInfoRow(item), + // Placeholder image + ], + ), + SizedBox(height: 8.sp), + SizedBox( + width: 200.sp, + child: Text( + item.user.signature, + overflow: TextOverflow.ellipsis, // 超出部分使用省略号表示 + maxLines: 1, + style: TextStyle( + fontSize: 12.sp, color: const Color(0xFFB7BECC)), + ), + ), + ], + ), + // Pla + const Spacer(), + GestureDetector( + onTap: () { + if (logic.isVip > 0 || index < 3) { + Get.toNamed(AppRoutes.UserInfoActivity, + arguments: item.user.id.toString()); + // pushChatPage(item.user.id.toString(), item.accountId, + // item.user.nickname); + } + }, + child: Container( + width: 60.sp, + height: 28.sp, + decoration: BoxDecoration( + color: const Color(0xFFFF4D7C), + borderRadius: BorderRadius.circular(14.sp), + ), + child: Center( + child: Text("回访", + style: TextStyle( + fontSize: 14.sp, color: Colors.white)), + ), + ), + ), + ], ), ), ), - ], - ) - , - ),) - , + ), + ], ); } @@ -399,24 +467,20 @@ class VisitorlistPage extends StatelessWidget { showRechargeDialog() async { Get.bottomSheet( - Scaffold( - backgroundColor: Colors.transparent, - body: Open_vip_tipPage(false), - ), - isScrollControlled: true, - enableDrag: false) - .then((value) { - - }); + Scaffold( + backgroundColor: Colors.transparent, + body: Open_vip_tipPage(false), + ), + isScrollControlled: true, + enableDrag: false) + .then((value) {}); } - - - circleWidget(String url, {double width = 80}) { + circleWidget(String url, {double width = 70}) { return GestureDetector( - onTap: (){ - showRechargeDialog(); - }, + onTap: () { + showRechargeDialog(); + }, child: Stack( alignment: Alignment.center, children: [ @@ -425,18 +489,20 @@ class VisitorlistPage extends StatelessWidget { width: width.sp, height: width.sp, ), - url.contains("http") ? ClipOval( - child: CachedNetworkImage( - imageUrl:url, - width: (width - 1).sp, - height: (width - 1).sp, - fit: BoxFit.cover, - ), - ) : Text(url,style: TextStyle(color: Color(0xffF756FF),fontSize: 12.sp),) + url.contains("http") + ? ClipOval( + child: CachedNetworkImage( + imageUrl: url, + width: (width - 1).sp, + height: (width - 1).sp, + fit: BoxFit.cover, + ), + ) + : Text( + url, + style: TextStyle(color: Color(0xffF756FF), fontSize: 12.sp), + ) ], )); } } - - - diff --git a/circle_app/lib/app/visitorlist/widget/visitors_follow_item.dart b/circle_app/lib/app/visitorlist/widget/visitors_follow_item.dart new file mode 100644 index 0000000..9653442 --- /dev/null +++ b/circle_app/lib/app/visitorlist/widget/visitors_follow_item.dart @@ -0,0 +1,155 @@ +import 'package:circle_app/common/Widgets/base_tip_widget.dart'; +import 'package:circle_app/common/colors/app_color.dart'; +import 'package:circle_app/router/app_routers.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../../../common/Widgets/tag_widget.dart'; +import '../../../util/util.dart'; +import '../../circle/widgets/discover.dart'; +import '../logic.dart'; + +class VisitorsFollowItem extends StatefulWidget { + List users; + + VisitorsFollowItem({super.key,required this.users}); + @override + _VisitorsFollowItemState createState() => new _VisitorsFollowItemState(); + +} + +class _VisitorsFollowItemState extends State { + // TODO: add state variables and methods + @override + Widget build(BuildContext context) { + // TODO: add widget build method + return Container( + height: 240.sp, + width: Get.width, + padding: EdgeInsets.all(10.sp), + margin: EdgeInsets.only(bottom: 20.sp), + decoration: BoxDecoration( + color: AppColor.bgColor, + borderRadius: BorderRadius.circular(8.sp) + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + + Container( + margin: EdgeInsets.only(bottom: 10.sp), + child: Text('有${widget.users.length}个人反复看过你,喜欢一下吧',style: TextStyle(color: Colors.white.withOpacity(0.75),fontSize: 18.sp,fontWeight: FontWeight.bold),)), + Expanded( + child: ListView.builder(itemBuilder: (context,index) { + var user = UserListItem.fromJson(widget.users[index]).user; + return GestureDetector( + onTap: () { + VisitorlistLogic logic = Get.find(); + if (logic.isVip > 0) { + Get.toNamed(AppRoutes.UserInfoActivity,arguments: user.id.toString()); + } else { + showOKToast('开通会员可以一键喜欢哦~'); + showOepnVipDialog(); + } + }, + child: Container( + width: 120.sp, + height: 120.sp, + margin: EdgeInsets.only(right: 10.sp), + child: Stack( + fit: StackFit.expand, + children: [ + ClipRRect(borderRadius: BorderRadius.circular(8.sp),child: Image.network(user.avatar!,fit: BoxFit.cover,)), + Positioned( + bottom: 5.sp, + left: 5.sp, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + user.nickname ?? '', + style: TextStyle( + fontSize: 18.sp, + color: Color(0XFFF7FAFA), + fontWeight: FontWeight.bold), + ), + Container( + margin: EdgeInsets.only( + left: 4.sp, + ), + child: UserTagWidget(user.mark!), + ), + ], + ), + Container( + margin: + EdgeInsets.only(left: 0.sp), + alignment: Alignment.center, + height: 18.sp, + padding: EdgeInsets.only( + left: 6.sp, right: 6.sp), + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular( + 9.sp), + gradient: + const LinearGradient( + begin: Alignment( + 0.25, 0.5), + end: Alignment( + 0.75, 0.5), + colors: [ + Color(0xff8DFFF8), + Color(0xffB5D3FF) + ])), + child: Text( + getAgeCOntent( + user!.gender ?? 0, + user!.age ?? 0, + user!.role ?? 0, + user!.orientation ?? 0), + style: TextStyle( + color: Colors.black, + fontSize: 10.sp, + ), + ), + ), + + ], + )), + ], + ), + ), + ); + },itemCount: widget.users.length,scrollDirection: Axis.horizontal,), + ), + GestureDetector( + onTap: () { + VisitorlistLogic logic = Get.find(); + List idList = []; + widget.users.forEach((element) { + var user = UserListItem.fromJson(element).user; + idList.add(user.id.toString()); + }); + logic.sendAllLike(idList); + }, + child: Container( + margin: EdgeInsets.only(left: 50.sp,right: 50.sp,top: 10.sp), + height: 40.sp, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.sp), + color: AppColor.mainBgColor, + ), + child: Text('一键喜欢',style: TextStyle(color: Colors.white,fontSize: 16.sp),), + ), + ) + ], + ), + ); + } +} diff --git a/circle_app/lib/common/Widgets/circle_share.dart b/circle_app/lib/common/Widgets/circle_share.dart index fa4f40a..084c5eb 100644 --- a/circle_app/lib/common/Widgets/circle_share.dart +++ b/circle_app/lib/common/Widgets/circle_share.dart @@ -493,8 +493,6 @@ class _CircleShareState extends State { width: (width - 1).sp, height: (width - 1).sp, fit: BoxFit.cover, - memCacheHeight: width.toInt() - 1, - memCacheWidth: width.toInt() - 1, ), ) ], @@ -565,8 +563,6 @@ class _CircleShareState extends State { imageUrl: bean.image, width: 40.sp, height: 40.sp, - memCacheHeight: 40, - memCacheWidth: 40, fit: BoxFit.cover), ), ), diff --git a/circle_app/lib/common/Widgets/open_vip_tip/view.dart b/circle_app/lib/common/Widgets/open_vip_tip/view.dart index 5049244..4e47ebf 100644 --- a/circle_app/lib/common/Widgets/open_vip_tip/view.dart +++ b/circle_app/lib/common/Widgets/open_vip_tip/view.dart @@ -20,26 +20,60 @@ class Open_vip_tipPage extends StatelessWidget { final state = Get.find().state; final mineLogic = Get.find(); + Map vipImgMap = { + "身份标识" : 'vip_fun_1', + "专属客服": 'vip_fun_2', + "无限畅聊": 'vip_fun_3', + "至尊喊话": 'vip_fun_4', + "图片私聊": 'vip_fun_5', + "视频私聊": 'vip_fun_6', + "看谁喜欢你": 'vip_fun_7', + "看谁看过你": 'vip_fun_8', + "缘分匹配": 'vip_fun_9', + "取向筛选": 'vip_fun_10', + "角色筛选": 'vip_fun_11', + "查看附近": 'vip_fun_12', + "排序靠前": 'vip_fun_13', + "权重提升": 'vip_fun_14', + }; @override Widget build(BuildContext context) { List vipFuncList = [ + "至尊喊话", + '权重提升', + '取向筛选', + '排序靠前', + '查看附近', + '角色筛选', "身份标识", "专属客服", "无限畅聊", - "至尊喊话", + "图片私聊", "视频私聊", "看谁喜欢你", "看谁看过你", "缘分匹配" ]; + // 权重提升- + // 取向筛选- + // 排序靠前- + // 查看附近- + // 角色筛选- + + List vipDescList = [ + "发布的喊话在圈内凸显", + '年会员权重直接提升数倍', + '可以精准筛选符合您取向的TA', + '在各个列表的排序都可以靠前', + '可以无限查看并私聊附近圈友', + '可以精准筛选您喜欢的角色', '会员专属,更显尊贵', "给您更加贴心的服务", "可以随心所欲畅聊", - "发布的喊话在圈内凸显", "聊天可以一直使用图片", "聊天可以一直使用视频", "看到所有喜欢你的人", @@ -360,7 +394,7 @@ class Open_vip_tipPage extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ Image.asset( - getBaseImage('vip_fun_$index'), + getBaseImage(vipImgMap[func]!), width: 70.sp, ), SizedBox( diff --git a/circle_app/lib/common/Widgets/today_people_dialog.dart b/circle_app/lib/common/Widgets/today_people_dialog.dart index e22fba1..647e7c7 100644 --- a/circle_app/lib/common/Widgets/today_people_dialog.dart +++ b/circle_app/lib/common/Widgets/today_people_dialog.dart @@ -476,8 +476,6 @@ class _TodayPeopleDialogState extends State { imageUrl: bean['image'], width: 40.sp, height: 40.sp, - memCacheHeight: 40, - memCacheWidth: 40, fit: BoxFit.cover), ), ), diff --git a/circle_app/lib/common/const.dart b/circle_app/lib/common/const.dart index 1199515..035902a 100644 --- a/circle_app/lib/common/const.dart +++ b/circle_app/lib/common/const.dart @@ -50,7 +50,7 @@ wxStatusWidget(bool isUnclock,String wx,String userId,int type,String avatarUrl, }, child: Container( height: 38.sp, - width: (isUnclock ? 45.sp : 60.sp) + textWidth, + width: (isUnclock ? 45.sp : 65.sp) + textWidth, padding: EdgeInsets.only(left: 10.sp,right: 10.sp), decoration: BoxDecoration( color: Color(0x66000000), diff --git a/circle_app/lib/main.dart b/circle_app/lib/main.dart index 20e7de6..b4c2be6 100644 --- a/circle_app/lib/main.dart +++ b/circle_app/lib/main.dart @@ -45,7 +45,6 @@ final TUIChatSeparateViewModel chatSeparateViewModel = OverlayEntry? mainOverlayEntry; void main() { - checkAndExitIfEmulator(); // setCustomErrorWidget(); FlutterBugly.postCatchedException(() async { // 如果需要 ensureInitialized,请在这里运行。 @@ -70,17 +69,6 @@ void main() { } } - -Future checkAndExitIfEmulator() async { - DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); - if (Platform.isAndroid) { - AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; - if (!androidInfo.isPhysicalDevice) { - exit(0); - } - } -} - setCustomErrorWidget() { ErrorWidget.builder = (FlutterErrorDetails details) { print(details.toString()); @@ -93,7 +81,10 @@ setCustomErrorWidget() { // errorBuilder = buildErrorWidget(details); // } return Center( - child: Text('请重新加载',style: TextStyle(color: Colors.white,fontSize: 15.sp),), + child: Text( + '请重新加载', + style: TextStyle(color: Colors.white, fontSize: 15.sp), + ), ); }; } @@ -155,9 +146,7 @@ logoutIM() async { try { final result = await coreInstance.logout(); print(result.desc + '退出IM'); - } catch (e) { - - } + } catch (e) {} } //获取设备Token,获取成功后开启离线推送 @@ -167,7 +156,6 @@ void uploadBuzIDAndToken() async { return; } - await ChannelPush.init((msg) {}); int? businessID = await TimUiKitPushPlugin.getBuzId(PushConfig.appInfo); @@ -184,7 +172,6 @@ void uploadBuzIDAndToken() async { } } - class MyApp extends StatefulWidget { const MyApp({super.key}); @@ -351,9 +338,6 @@ class _MyAppState extends State with WidgetsBindingObserver { }, // [建议配置,详见此部分](https://cloud.tencent.com/document/product/269/70746#callback) listener: V2TimSDKListener(onConnectSuccess: () { - print('IM登录成功'); - - // loginIM(); })); } @@ -380,34 +364,44 @@ class _MyAppState extends State with WidgetsBindingObserver { return RefreshConfiguration( footerBuilder: () => CustomLoadFooter(), child: OKToast( - // 2-A: wrap your app with OKToast - textStyle: - const TextStyle(fontSize: 19.0, color: Colors.white), - backgroundColor: Colors.grey, - animationCurve: Curves.easeIn, + // 2-A: wrap your app with OKToast + textStyle: const TextStyle(fontSize: 19.0, color: Colors.white), + backgroundColor: Colors.grey, + animationCurve: Curves.easeIn, - // animationBuilder: const Miui10AnimBuilder(), - animationDuration: const Duration(milliseconds: 200), - duration: const Duration(seconds: 2), - child: GetMaterialApp( - title: '微乐园', - initialBinding: SplashBinding(), - getPages: AppPages.routes, - /// 国际化处理 - localizationsDelegates: const [ - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, /// iOS一定要设置,不然报错 - ], - locale: const Locale('zh', 'CN'), - supportedLocales : const [ - Locale('zh', 'CN'), - ], - home: SplashPage(), - navigatorObservers: [routeObserver], - builder: FlutterSmartDialog.init(), - debugShowCheckedModeBanner: false, - ))); + // animationBuilder: const Miui10AnimBuilder(), + animationDuration: const Duration(milliseconds: 200), + duration: const Duration(seconds: 2), + child: GetMaterialApp( + title: '微乐园', + initialBinding: SplashBinding(), + getPages: AppPages.routes, + + /// 国际化处理 + localizationsDelegates: const [ + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + + /// iOS一定要设置,不然报错 + ], + locale: const Locale('zh', 'CN'), + supportedLocales: const [ + Locale('zh', 'CN'), + ], + home: SplashPage(), + navigatorObservers: [routeObserver], + builder: (BuildContext context, Widget? child) { + return MediaQuery( + ///设置文字大小不随系统设置改变 + data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0), + child:FlutterSmartDialog( + child: child, + )); + }, + debugShowCheckedModeBanner: false, + ), + )); }); } diff --git a/circle_app/lib/network/api.dart b/circle_app/lib/network/api.dart index e8c0a2d..aa1621d 100644 --- a/circle_app/lib/network/api.dart +++ b/circle_app/lib/network/api.dart @@ -85,6 +85,8 @@ class Api { //发视频图片消息增加计数 static const getAddTrialCount = 'mall-service/vips/trialCount/'; + //访客信息匹配 + static const getVisitorTotal = '/user-service/visit/getVisitorTotal'; //个人信息 static const getUserInfo = 'user-service/my/home'; @@ -141,14 +143,21 @@ class Api { //关注列表 static const followList = 'user-service/follow/users'; + //互相喜欢 + static const mutualUsers = '/user-service/mutual/users'; //被关注列表 static const fansList = 'user-service/fans/users'; + //喜欢列表统计 + static const getFollowTotal = '/user-service/getFollowTotal/'; //被关注列表 static const visitList = 'user-service/visit/users'; + //召唤喜欢 + static const callMyFollow = '/user-service/callMyFollow'; + //举报 static const postReport = 'up-service/report'; @@ -281,6 +290,9 @@ class Api { static const sendGift = '/mall-service/gift/sendGift'; + //新人欢迎 + static const sayHelloV2 = '/user-service/newUser/sayHelloV2/'; + //礼物列表 static const giftList = '/mall-service/gift/giftMall'; @@ -387,4 +399,11 @@ class Api { //打招呼 static const sayHello = '/user-service/newUser/sayHello/'; + + //访问多次且未关注的用户列表 + static const interestedInMeUsers = '/user-service/visit/allInterestedInMeUsers'; + + + //批量关注用户 + static const allUserFollow = '/user-service/follow/users'; } \ No newline at end of file diff --git a/circle_app/lib/util/eventBus.dart b/circle_app/lib/util/eventBus.dart index e56cbea..2e86ef8 100644 --- a/circle_app/lib/util/eventBus.dart +++ b/circle_app/lib/util/eventBus.dart @@ -45,6 +45,11 @@ V2TimValueCallback? createCustomMessageRes = null; SendCoustomMessage(this.createCustomMessageRes); } +class ChatRefreshMsg { + +} + + class CommentBlackEvent { String userId = ""; bool isBlack = false; diff --git a/circle_app/lib/util/util.dart b/circle_app/lib/util/util.dart index add47b9..97b52ca 100644 --- a/circle_app/lib/util/util.dart +++ b/circle_app/lib/util/util.dart @@ -330,6 +330,32 @@ class CustomLoadFooter extends StatelessWidget { } } +class DiyLoadFooter extends StatefulWidget { + String noDataText; + + DiyLoadFooter({super.key,required this.noDataText}); + + + @override + State createState() => _DiyLoadFooterState(); +} + +class _DiyLoadFooterState extends State { + + + @override + Widget build(BuildContext context) { + return ClassicFooter( + // 自定义加载更多时的文字 + canLoadingText: "松手开始加载数据", + loadingText: "正在加载...", + idleText: "上拉加载更多", + noDataText: widget.noDataText, + failedText: "加载失败", + ); + } +} + class CustomLikeLoadFooter extends StatelessWidget { @override @@ -677,20 +703,21 @@ sendCustomMsg(String userId, String data, String desc) async { if (createCustomMessageRes.code == 0) { String? id = createCustomMessageRes.data?.id; // 发送自定义消息 - if (Get.currentRoute == AppRoutes.Chat) { - EventBusManager.fire(SendCoustomMessage(createCustomMessageRes)); - } else { + // if (Get.currentRoute == AppRoutes.Chat) { + // EventBusManager.fire(SendCoustomMessage(createCustomMessageRes)); + // } else { V2TimValueCallback sendMessageRes = await TencentImSDKPlugin .v2TIMManager .getMessageManager() .sendMessage(id: id!, receiver: userId, groupID: ''); if (sendMessageRes.code == 0) { // 发送成功 + EventBusManager.fire(ChatRefreshMsg()); sendMessageRes.data?.customElem?.data; //自定义data sendMessageRes.data?.customElem?.desc; //自定义desc sendMessageRes.data?.customElem?.extension; //自定义extension } - } + // } } } diff --git a/circle_app/pubspec.yaml b/circle_app/pubspec.yaml index a84af43..3da8b9a 100644 --- a/circle_app/pubspec.yaml +++ b/circle_app/pubspec.yaml @@ -111,7 +111,7 @@ dependencies: svgaplayer_flutter: ^2.2.0 #边框渐变 gradient_borders: ^1.0.0 - #系统设置 + #系统设置 安卓4.3.1 苹果4.0.4 app_settings: 4.3.1 #百度定位插件 flutter_bmflocation: ^3.6.0