From 8ce0f58a776d11f8e66e05e1541acaa9eb2cbf94 Mon Sep 17 00:00:00 2001 From: CYH <13923927013@163.com> Date: Mon, 13 Nov 2023 09:52:08 +0800 Subject: [PATCH] =?UTF-8?q?bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- circle_app/android/app/build.gradle | 4 +- .../assets/images/circle/callout_icon.png | Bin 0 -> 11993 bytes .../assets/images/circle/circile_all_icon.png | Bin 0 -> 15852 bytes .../assets/images/tabbar/like_normal.png | Bin 0 -> 7202 bytes .../assets/images/tabbar/like_selected.png | Bin 0 -> 11848 bytes .../ios/Runner.xcodeproj/project.pbxproj | 6 +- circle_app/ios/Runner/Info.plist | 6 +- circle_app/ios/Runner/Runner.entitlements | 7 +- circle_app/lib/app/call_out/logic.dart | 77 +- circle_app/lib/app/circle/logic.dart | 35 +- circle_app/lib/app/circle/view.dart | 106 +- .../lib/app/circle/widgets/discover.dart | 6 +- .../app/circle/widgets/info_list_view.dart | 421 +++-- .../lib/app/circle/widgets/like_view.dart | 1409 +++++++++++++++++ .../lib/app/circle/widgets/vicinity.dart | 10 +- .../lib/app/dialog/UnlockCallDialog.dart | 4 +- circle_app/lib/app/dialog/UpdateDialog.dart | 4 +- circle_app/lib/app/home/binding.dart | 2 + circle_app/lib/app/home/logic.dart | 34 +- circle_app/lib/app/home/view.dart | 153 +- circle_app/lib/app/invite/view.dart | 1 - circle_app/lib/app/like/binding.dart | 10 + circle_app/lib/app/like/logic.dart | 188 +++ circle_app/lib/app/like/view.dart | 501 ++++++ .../app/login/complete_material/logic.dart | 2 +- .../lib/app/msg/sys_notify_list/view.dart | 4 +- circle_app/lib/app/msg/view.dart | 2 +- circle_app/lib/app/my_circle/view.dart | 412 +++-- circle_app/lib/app/select_circle/logic.dart | 22 +- .../lib/app/signal_circle_list/view.dart | 18 +- .../lib/common/Widgets/base_tip_widget.dart | 6 +- .../lib/common/Widgets/circle_share.dart | 735 +++++++++ .../lib/common/Widgets/open_vip_tip/view.dart | 4 +- circle_app/lib/common/Widgets/text_more.dart | 6 +- circle_app/lib/network/api.dart | 6 + circle_app/lib/view/notice.dart | 2 +- 36 files changed, 3785 insertions(+), 418 deletions(-) create mode 100644 circle_app/assets/images/circle/callout_icon.png create mode 100644 circle_app/assets/images/circle/circile_all_icon.png create mode 100644 circle_app/assets/images/tabbar/like_normal.png create mode 100644 circle_app/assets/images/tabbar/like_selected.png create mode 100644 circle_app/lib/app/circle/widgets/like_view.dart create mode 100644 circle_app/lib/app/like/binding.dart create mode 100644 circle_app/lib/app/like/logic.dart create mode 100644 circle_app/lib/app/like/view.dart create mode 100644 circle_app/lib/common/Widgets/circle_share.dart diff --git a/circle_app/android/app/build.gradle b/circle_app/android/app/build.gradle index 73d5bce..3877ade 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 21 - versionName "1.2.7" + versionCode 24 + versionName "1.3.2" manifestPlaceholders = [ vivo_APPID: "105669716", vivo_APPKEY:"84f750207787376b310ca5b0d5969122", diff --git a/circle_app/assets/images/circle/callout_icon.png b/circle_app/assets/images/circle/callout_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..434139306eef4684e13819132a4d44032466424d GIT binary patch literal 11993 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 literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/circle/circile_all_icon.png b/circle_app/assets/images/circle/circile_all_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..501fdee472b0e0b3c43cd7421f3d83012684ac0a GIT binary patch literal 15852 zcmVPyA07*naRCr$PeFvNs)%E{5GjCqo_jV~tRRjcS8bj=gEov+n^S29%T`W-(ODs{M zMva<)#u`y$tbh_51~rNm6~P__L^@Iz*kyO$zB)7a|2enKyk*%p3+uA@+c6t<-J*=2)MO2mV zRfoV<0^s*9gBgYkpV+zFTqsMY0K25N1Omm6ZpNL$jO_}peIj$&0bm#hqG3kW>;ZED zIi={uJ)%gO@yXJJ<&cnolCvTPMZ^-w&;U>q>`EkxYrXk*nFJ?&DrXmgA!EpB?m4WA zKljZOV>A^E8QqdUo8R7tOmS11ag8s!H^>FyflIF%Ihh_28o-(VDNs(2r2G2jpVNgC zLM|@;uY4J`YWVr$9ciovy@4RVgdQLo;(Gd5tyjm+0l*A&-2a-cJ0TN`Eo;W~`xbdK zuiB2WWGbJ3$VD8EhS5=s$mN4%rl}`e544D*H2yH(;??BypIPdAkL?tZzi2E?-LJ7x z6#-nbpi=i}YBl=bLEWdZ_wut3{}>wH+s_I8@86IX>RCnaV;2N)Y0g}N8e7Kz-#0^{ zD>H~cGzSvFIS^x3ESI|+B9XD+GC;=xmzD+bO*db_| z$Ae)4*fu~o1eh&+f{^_~U99}WQX?qIfs(2GIn0EI5HL!jN+8w#8UQa&#zJ4OL`;`@ zNc;C~m;!8ZG?DMo$FT7UW|@0~<8W=Axo#dD7@0~&UTA9cO#-N*Hh&(N>`|`B83yS( z8D>y8k^#F70Ak>}z|bJA{(_pa@IN zxdNbpz+C5ZblDZv<+16TIllJGwgC!sOcxFShmB<>?#p$fNEk4aJ-@0v_D^no3WtS0 z8U;|74Y?B?WdG*&tYH9ioOvB$@ zs?325j5h#S9K&I7a`~$&J4f%{2tYknR`o(F{yj4=f+ks9aMg;AmOini-c7jcxs%ue zfG_}r`(1Jq{un|K%9Vn@&G_81|ti+rC+wk+RV)uwr*kt8!&7^E@zal z+aBwrloF5YwJtlEg{+f!{3@59wY+P5pOzd5V~l_j^8rT$X2j9rFWr)3Z^QTUOAv|> z5|HR8gNOvM7CUyROn(KIwL8V_T)Xh}itS@(Y5)=UvCR0VuEDl9$i<9o@Y3xfb6eu+ zlH*hWKm;h%*M77H1r(TSTM9@!ttspWvCzjXLlF+Q+GXtE<=qnBa0K_R%w5YI=T0)& z!Es-L+?tU~`t%7D3u%fPjIlBRAn>$vnAU(z@iS;{2}re)BW=+f^jOK_mXUo05D(|s z1Fn1XlJ2ovaByX1BIhJuWq^k;<~j`E$|XJG_if4hGR8=^NdN$)cx=(Yw`3gc*K!IF zkjN?`ZltZJ&7n=-<@Fac)3_f2O~%-p>9sW{VDH7LZlSQb1b~r9D!iw_n#P6sW;12!QwhA^jN`xQ9^|g+fjCa2&WS^GAqA zZs(!=eEy#AdMB>joY#f5m}| z>R&a&*0E?=z_Rs+&)F&Qc5~l_F-E$M$WClOwiOBxh)C=->lnDO?nI+3{%>#`V0K|D z?z%WVmzl;uj6@(;lNvmKmt?cdcd0OUYS($1H4km!WReu?o2yt4T~^ZOb)=Y z=izP(Qng?hNh1-1ue&rTizxA$(#O+TItSYVQQF7QJPMH0v8uV=>)qEd=GJG(}vaV(bZP4utnoo-5f5o=PJhRx_Vynguj@V;?YebQ3jv(Y!-k>Y38+H?Z-Av0h<1L zM63z=7JIE=%uUscYRo;qOSzP)XeJXdbBAC6lH6yz_SjZXlDGNuDC9v3b)cldeV0oP zMB-b8qGukX7maSAPQ3?+dNs?2iP16)FEP^GUxr4G3M0Q^YV1u_uD$DL?_^* z-lYK~EiV#Z6#8gCemWGOcv*E2U1-=+#_akOuLQ^azpWD@ERlrieF6c9QZl;ygp_Au z-;_H;|EeER*k638L^yhX`XM9Yr<4Ro?^}t8M1v-e0~a&qq$r;Z0f+ssmJ=$JNWy!4 z0|AIQ5BYw!Mbn)FBeOCSwins4>~g29WvRhGne`UL_I=|AP$7=S3ZDY|Uj%3agT?LFQ4!p~U&2QZrr zN|=dof!W|P2VCX?{U^G>(4m^UPzH?r4-pKYv^x_*MhNPiR1OSW3>M5Wlji54&ek{m zZs_qD<={vwbz8|wpmCBO#8Xw9I)1r;u>$8n0C@11wJt51P+0=s-X#!#C~UE<QbHG{xU}_y-Xx2NRiy@c*!PS%=@erwLp=0z5@8HNiE?;r zKp+5hZR6&*QEtvTI%32^IVUIjoQa}bKDoSq6mO8D z8afFsBHDhb-(_bt$$5CICn4O#_0-OZw{jBwt@!6&FDh|A1PB{puw4h-i2G{1yESR> zm>pi17HpdoZHTz4)chSem#i>hz2gzHYFr{hsH_}b9~=lkJ=&oDlUwxc`kmK)T>BTy zvx5*YO!F-od-0}ve6mFICJ6=J)Ju>`15C*?KR_gCB;KeYlJ8!kH<-)8B>JvNH%D=U zI!0`VH$Tfk2p8==uFv5R=V_*t`rDQc!~lJrj-KO6D+~aSoLR#u9ZFQd)LpkZ0J$~u zvhhVvuRT6nX^%5_V>@C7#2N%xxEA9zVw7DM1+Nf22RRe*S(FX0_3k5BhHOPATGPqK za07k-OVV;RvBY$g#+cjyT5YJss-t*L$-B9!J*8AqHddV9>r&}XQ20)X!j|(iPDhy zXR4M zK)?RRB@xEo9*2LlLHmJT*`3;sHGQ-Z02OA9S$CR^HFH2J9srNBjhqd{(ins6uc zj(u=%qAt8D17Wk8(eCKYb7e+rJ-$}1G(8%5c%xhAO46L z^FrInOA%!VfQU6g^1y4HD@|^X_4q}a;zD}ea5kevUoj>GLWS0>H7bb{AqI6TWBz=_ zg~YJb69k|YLlR>Nn_++i8#nm;&i8lNx|UiX0G;ra%krrj>iWv?H`65tDoer(zi87O z$X)PuRp;ezr0%tx=;2x0%L(^eMbz_CixfYQ)VkHCyx$b?L?2hE^`FYYqX42EK0-N{ zji)_K`R^n2FQuRh15bYDYw64Jga9!!4h1v!=FTToT)M+P<>Wis8hTM60G;@S!$lZh zPXF(N4ZQ2J6;HzCJ=-pTHZ0DDKYwWLWVhh%#ns%#0x4Q-$tLDvW;HkPlx3kPdzccU zuGq{M>WZg`E2Y>|x)qmE%DCUZ2Mos0Ro$jl4{HDTzzE~4JudEYN{2pCQtDd! z2n3*$KXX_iUB?v!JmI}+PD`t-9G=^&O#;Z>us9o?HNNr%(+TZiJGRdsBczJwCH7Ca z78;F+7v7$niz_AJip7rrk1+9d`}$%%Tu!aO3qJ>()Vn-^XE4PT#WOr5UH>W_NOVoe z41KmP)|$}08e_Siu*5!15Ml~)Yg<}cllSj^4XIrpD|cy z?}AhC!V7W&J&&%Pdu7m9z#w9rBO)BeND&hB?$Cu%F$TH-7afJV%;i34%o zj;Fp|O)msiyd0k0uWbQ{#MZ};t$oxfz!40%zf*dCJx=2p)SkaZxP*1De?3utaVF+Z z7}dgy?7zmRRQq;P&>K~#jWIaoly0N8>kx{u@GE-v^t5^dtj%zs-0Oc` zd4XML-dW(WEM+3A@PrCmd43fcmlBiOz$YVh8Nmb^Rlud~rQ%-FGwlbU5LYr#=DWXt zY(?OZVHAB2bq(FZRnA6Fj2VauN#Jq0K6}!;i+A&zzPV z$?vlf;M&MG69eWg|WYu^UlMkA8_$ z_CKrB*FUm86bL})OfPUNj4J`7USH2iABmU4V+U`204@5uF8TQ@HP0{`_aePV9g5)E z;oOLX(He(u_4A1<&gPMmEI!xQ$fYCBmtJeBp(}uS=6JCe!4C$1MBcAtdtA^9a}+7z zdc!7RwR!JN$~dBFxzmQ7y#45|19(cvk97nB(0T6{SUyw7Wip=i+Is#*;j(ggWa|Sc z|KivczbmB8F)p)dD_x&w9RhU^rfm;}6}c9EfEyV7@$V)pCc&wrEa;zebzA zGI&lqFVJ_ALGT5@O?C+cMRo&eHH$3@6<`GWq0onNHmV#mspaSim)q0v`^pUiHCyn` zmA(W0Y`yzkQDE0oni~FAq^_xb>g2A9To}rv6Ol0jFktWG-g_NYzEmdkw=^dT1fbFH z6j&is%Oin!-mB|44Z`tq_{U-4t*HZLpT2X&N2~yYl%JRnM(x^HUan#mNi2T~v#vKjlgjA5);X;vea>UUANUu*bk^fZ=2mmMQ#3?H@q2S0*B9SA_botBp( z3>jYd@_O0`0m89zy#L6p1E3A7AUtK_>iY_L_c*`4vypC~OkAZJ$px(UqZODa&J6Tn zN^udvQN;QeqRrzl>UYi~w13DiXoRXn*Ace~TX85jsV~aQjYs#wD>PWO>sBgnxxlRP*Q)AWR1O(H9SC2Ze)8*ZI^D?5A zJOTmevNsigXxF%x)^SRaALzcLwhn;af1|GV{BP<%rqUY4LbT#x7{V&jtVQRhYUP>c zgE$Cn|LODW2^E5NIpctnfmQ8B^t{TJMsU8sDmylx*I?pXNFZ$Wo!O@qVv< z(fbb@-jNzlQso5|8gA-f3m4`R@4U4BBj&O$!l_8Qm5k&`jB=23MZQ>JSJtF-VA_Ls zj~;N~k)2z5m&iZ>y8MkC4`uKnU-H5_;y_4d{5?lUwuTOr`RDzsA9n4~skS5P@&plu zDed=+cy1S!mgURC5pv6yX5rr%nr8_Kv)z!BCewm+WK6iH1!tji1YkKmOw-~l%W?B7 z!eM-)qCEWG(7mjgeFv3O0y_0bY6>`hK-G`Gd({lrWrIETA`>6Q77#vfmdaa_*=arr zN8-{9IZvK*X&35e*^-%zfdF*H>p3C9Xfa*(@3lOgBOEJ-al>03Ky20GY-Gxm)DoMg zq;mX7DOObDAWd^=ZRsiTHhfoljJF}0&)(s7CP#+PG*_0D2T@OaicpqeS|a#>g*STk zjNad~ueD_8(8LB=3hftBLB+_1f84uzj_bI+^}Es=yQItUQZ?x}l^&vocU9Y?lNbwy z;iAhsQ-yG=1L&%$5ZPqotKF^JNTEItOL#mtZ5s)fw_WN+E-4`E@g?_2_k^6K(wuM`VT(!dMjka_;Eu$F`tF7Kj7= z;nfVwWq4;h#49FMa&}Dsy6d=TNdmQWPV~JGtp1QWtgojs3N|jZN-|@G=Cu$CB{yhk7a zT{|U9o@lZ1uAErOw+ITyl6c2&S`|R-`B&EMwS2if0r;L84Wj4LG7|YT!u?;Iyj2|3 z@P)&)2dCKTlHO(?wGFC_aP4$7Vm#irZ+t?(ox+v<`bDTm&gO`xCg*X<>TG1nD>V<; z1vXsf!iq&8bRV&Pr0z$ewxI>8v-HK8!nJ@{+qX~bq~njN_+|^aqi+bfvJ@b%dpRQk z1b|mhsH9CXF&s<6Urva%CI@mKd1mc-H8u9F+@Ik$J2ac{E7Z!@r}B;^r%_f`!yH!~ zVfB<_AD81>I7T8k;pks=ysdw)2zkYR)FQtRW~95#`l|K=#vmb`)HYMcBNgFTO#Q!5C^*9B@$t>F6^3T*6`tw2)nfv0kmpW)|&KM z?cI4BPNa=prNges_afXSWI0LGR;^e~K?Tz7mb8+|yR6S{-qsFI!dbB8>fH{ekG3w1TEAH#sK z$(}#!gz~F9b&3UQPgi1`fdDk-#VpH_Cz>?R>z+~oO2REC#Y+;hrF5XrzsXm;HKXcf z7jS@hDK8~VSK{ahL~)#}NN*59OPSwXRC42^wnupeZnkTu@P+4})cMU;0FIik)SZv6 zo&{(QbX-T4R}1}3RQO1*5VzPR;5`W~-BhyNNa}+kVU4`t@bys#b~t7CfsvAJSpqDA zKmfYwg$&D4ItRH$u77e3jf{n(Nxb=#)&tO6pKjlCXu8FxI8#5Y+40-O=4XXm z+82!z_%2Gd@K#plc%*z9O6x#3KcD70 z5Xb(FPgc5w`e-bPV@_=~0I>h64Y?c;?4p6ob|7fcmV{^G+Y+%zZR%u~{U z`+;PxlJr~Swo3UwfP3^y?0@|Ju_Yx~Jxiy-n6)6) zsWxjwX;b8QER_32zq0C1F}^c$$wlV7zx($oRm0b9uxWB5N<4{_c@@v)d3|!t2+#ZN zd3NoaE}DC}4s{MwSv6jgr}7^2LLQ}JHwcXR^JzQ_MV;>RuNVfH2K)HbVdZD;x?`lN zeX{aXzE1c0a$fqvT!H;26fWyVN|l|jUmvk>>fjxt51+h$^8271ER)F?W2e^Nn9j0` zeAW7%B}JUlmD!cjm(HcR$aa&pvNF8ki8mhy12D`G7+}x3b!3+#TR=1i0??h$)O%+9 zZI7&`NDM||3AkodqU7poAuFu@`iX15bs6r+^PaVCBUhka!m1QT<`2qrQ|YSap$}=o z2n$`u9le?`6`rVw8n@kWLgxpX&=c5;Gc&zEU6h*W0`^u}`Z7kVBKwOE9#VGV(Ywbf zh+2|XGrq5@nDTjcs>`sifQ1OU2vMujWrcrBD|nIv$#DzH_)5$aM-`4n&Ryw@>bpj6 zNAWe<$w00$;k>IUaKAM4TstpT zB`KCNuH|tfK~!c)B1``WN4?5@E-vTtluo5c%fxoWV2j6|y#3xyDVeW*Q@`D`x#@R- zVP_>{bgvg)K_@_pz}6hOTkP;(4N6eSaZ^X;x);|zZnN<5u3HceQ8oX9cL-}iR-1V~ zA;J?+^7eIB^K&RNG|03k7rbz!npPP8c0xHhM7MPNi9i6l=Lyn*WK#WI53VFvFN;LW z@OS4XOS0t_5@B^$znZNpWb0)2FrCLEpD)7|IvOgYqH?-aL8>RWd@M{k<7AYT(jF?p z?E0IIsTki>)cS=l(>*`_0Y0_!QbqEZkmuq=U{)l7`|aTFb>h(YiYCy*maNW3@B1Xb z*eT>aVW+*wp5pI&7lzcHNiL*~JfmJ?BBk!hHVy`}B4s%C*U?r3(7lhRSXPBH{`$Zw zuIWdkNx1y{)&tNLQ?qq;KFz?TGEHBnWtqmMlxMC2@P4Su7vcj`gKXu76H3!W0Q&vG z<-PlK;7u(zxj@hoWULtOqLvpzKX=R9{q`GylSf z%QklKEJ~Sasl>9bDiIfWFyrz{^n`72&^cBt0rwo!dH}lbu{xHe#ZLqscmGPBP!@?K z;nLBq2cXMdt*djKe33=LeIz`kK_#+F8fxuWd1!rlkcxAOW`p|n9{>Oynn^@KRGCF? z62r7GjD?r(KDP6@r7V;;=cYPOnU|a9GU%$+8*WL*6>VjzvED5$a}sJ4teS2SHeyiT)H8K zbpP{u|0MK`WKO&8po;fOd1=!C_@~#a$JEq<~EsY)Q z&gnG=EU7L$1%Ppt8|zEB-n9BHt3!0%nmW^;si+MG)c}NpI`xm^I<=Y-{m}SYmdn<2 z-!1+9vQHBzh2RiXa9^lBR3@u-D{>* zUAiH|Zj^BruZU5FV|)Qotplk*4Cz3c23|x}uN=B5Pk$BS4-J#p*0S-#JMPw6X8ibn z)Ur%gIuh@@dj)?_(t$=_Qr=ohbY}D$RsVG%v^R5X-MZ52)*}5SO6E%)NV!XN>nCN! z$f^wPee;Df5*9xEr(x0CI>%xqw=j~dB>%+RO#jc8WiQFPaEuX-b*5;gn@z1rSordR zeInye>=$3wlq2!;%3S=BFY2GNUEE*wtd=!9+S?_2D+pXlT}QdumF}ZH7PYCeUWwKW zS*1ezpcG4ZMf~2u)vF-?7%lh-CpJLvHraofB1Yv7cCzi|p}lGQB@op8Z&aBKSas!%b*E zDu+WSE{QUK;hOMm$e?^f!ptwS|NUN903#HJuv?h;@R1!aZLLtoV-M7NI?zL7SMZF) zXfy%mUPj$inm$^{j4xdA-iAx7S>z@+pY>e#K46GYkOE0j3_~SB=z&TZBlJ|stq@`L zd4tOiI%o%;CsXphO1*c$@AH?uTYFO)LYKLDGWw()r8=1jK=GxaN`}-)ihD}Wh46vN z+;5>H`o)>{BcU0ILg$cu_1Iy_r&^%TbRa*_zwWPPX>Nrvz=!WrA}j%C|E|>lhP zIYW&58Wzdx6}V+=OR-9SPKW9`tqLTSCsP8>0~x<1|27mahe5IQ(bxT=oQfN_bfE+S z&=dF8axpK6=M;uIrH%cE%O02cQqv z<&qD5n|a;_++FzO1z-%BpDNavYTzqX8|C6J&crHqOjG2YIp0krbWYf{ zpVc3+q^>ZY0gDw|OmedWkK^c!T_MhV=^JV#$$+cYiNq+18-d6YZPPHmJ7<^Z@xSUG z$kHtJK7j!A%sn++2jVSt{(1WkeAw}5IgGff^#HUolL=k>d3J1unWylPaE7Qzulw%^ z9C5DXa}YPsA!JfCKi7;UpgU$Symzm}%dNnDXvnFnzpOoeX^K6-7?g`Rtb7k&t(Wv} zdz}_#`hdvB6efe$|HBvk(78j>BQM*+2*bmGn29gkGT6GZZ^vj$baD*@pb6t@SSDA; z}TIl8;x!etZS$TAUZBK(8RbwH8u|-q%t7!Go<`?cH0LgTYXKz}@M-+=B;e_iuwk8K6 zGG@;Bs{WcP8?R@S+NymWzE00x_b};Kl*vj=$$Mo&n@{bO`wJz z!Z*kr`9($MlhwSWg&ks=TWdhw2GmdT|A$DKIl2a10~Jd(iQ+|cR(qJig* z`Z~9sk>gEhhAN)w)ljL%g|a=1I!~w&da@vdxOnQG$sqvHp_#Iai>EYzIdyfu!>6@& z@9%2u%krVfQDh-9n}b^={Yy6Efn0U+6zz$8O26hbUTG4~$`JC-b1Et^rBhd=$KCHg zRo9RQp5k&L3m+O7-KlRBC|_ht7K@)$fdKT%?bR%ulXYRw-MEYojX2P8W3~=}PWWH_ z-6^!ra&tM6EL@ZW;cJ^f3aX5Msm+-@3k<G=%D0M^3rS=wi zsom0nEwF1uq7Zd5&rkVz#f2@%eFE!1Q*NvFJkgVHSVsC9i$#-o?4Py@fZ(3xnH^uP zv_GPaYD7wmXt*S>U-$1Cmv2XH#L&`yQ*w_>!BH(0hU7Y>-%#?j; z#$g9DhNQ^Hgq)N;R8{GXK#?!#+sKkvl2vjluWC>fk;-m+K9__{*;TJ3RzguBoK(Ao z2Bf0&d?+R!(*gItdZ&^lO3h@%!IbE!w^Xroo=D69|9$;Z;RlK&;h38{m1Ko2XocyQ z`)Wfra{Y4WzKjdM<|0G;MO2}M(j7f|c)mon^D;Mk>@H#RmdS(Sw66qrQ^+egD!$4> zY-VktV*0w=eybfg--(v(!Eza3Hr1=Ene==z!b0NYQQ=+P`%c|jx9#%1;mAL49RSh#8oeNM@Z5~^G%yyHQEZ)Xk2+6SkkLzTl^KjgYSr!+Ak)#p2T$!{ z{p<8j;l&i8zJG0@&j;1{Uv9A7Lvt=3gt0`@&1He{{l|F!O;5kk>WObH>1~}r6adg6 zyM~CaYO+g+($xgyB(s#hEeS@EsU&f!lIuD6yhOMLg@#J!QXDWhpe%ImV|}Aa5KMJ&nh8!B36+`}u) zUp`IB0m-*5;Dj~+)|m*aUBDz`Zh|rB0ETIDXP;Wzl8uQb1;X3yFN+qDeXj+th;2&0 z%tq_p+j+;+kaetGD&Z15Mf^?z)n^R&uJ`1({LMm``~Kj>0WH|p&i^KXIM7>Ts#v}7 zL^GUn%~IZ&kgTx7ZtJ{NM3{U7XWZ(-PLr$iv;5LTzn#CqfD#N|s;BfmHkei49v2(W zx3sF1FG*Q|I+31ROI}^RKk;4pVl=mEbj0Gr2Jurpjt2QZ+ASbAcTgE{zC0l+Lxpz+ zM0*CwOWI7i76?GoZsa12lnuoHT(yMO9|zDc|FTs9MDLtCVNvevt)|Yp=e3#QyLCJ>k%g-ghH?#I)8qxZ~VTXrPZ4OqCfz8 z=a1`HCRZ;q5?{NL03?*?L+;q>0D@Uri2i;>{UbRLqReXpBobhxyIqt6d788rh*V6! z*w>=E3aUvIwDq!;rTXfDPt2Y6{dn27Y78QBp}36rP5FT&^u>pMg-2~8C9$D_>3gmm zf06A;9r1z9x~6M<)bUAZiAGYJ!d4&vy?6b3?g!$?e*KEYTnmgx%Hg29wmyJJJ-zIQ z+|NHOIFo>}4r(7{mHO#p^=gMLSuZ7GN3wFYC=Z9D!^ee`U8U;N{gTFOlu;bG^eFCA zij?H?i6gJ(UHGrOh9bT>Q)#S98}t3`o#m5#2sQi1;gkovm$iuv=cZq~p4I26(Ks@E z^Y@Fn+odd=fMI{zerxJL{#B7XYI**GRcPMHa#v4 zA;JSF+v)mCibM+-ZFKvZRcYU#6k{?lDq6fnhl9j|^SsXg%bK|D>jNH`%`OZO9qCg_-IUR>6?Zsu=hP}Mue#sbf3;cr@JcCPvs-gJt3D>`8HZ<^{gW8!%<8_ zT1IkFOHXc*Wv`2bl*QhF`)J)pduDVLMFDtIR=QVSul(2o7+T7SKP1TfrOL=K97Zdj z{q)YHdHS*C5z3ori5}1`#(`#CK^&-FGywhJ;>DaP69?M!-ZlpydTIB|Y&Lp&HG45{ zMSel%eR0%YO}gjfg7gy0Ef8eppG@!a0YvrOmD8--?P&#uTTC*Nu63AVFSOqy z?KjYbwdi+85Fi!T^HNi|lhO)9xRCwg*^b5uL!*3y-PQt+;K>0J%0BL1?MRQ2k~fq)CL)=8(vUD(P_lTJmo z1GNCX=4c|m7mH#%o11o3dF1l*!%)@AoJWBu5P-hAw31t4WVzyu^A`#$%u2$~9_rGT ztgyypw)-VO^qh5>%hyL^SGqY4BCU+73;g|rWcxVoEf$i*mtQ29w#R~$g{2d_{FNdq zKB`5L?s=#cUvCs`bOzNw`y|COist)2!@)SewL=AnHzszoqe zqV^EeZHE1wGqf$Qp64mVya`0n{_|eOpuc?$?Js38x29*vykllEM3og*5KZ?-JSPwb z`u1W1kn{u1I!ADzL^uh9AKqpFL^RBes)s$^xAV8>LZQ8=GD2?k>=zsjXx-3eDvF@{ zJT?tJ_lMW%?mVSKbjEMgogmQXadYn)*$5p0!eNNzbJO+>nSYy97W%9O8Y8p>t^xsQ z&V_4OeZF2KCwzYP0v=2)3ny^kBVF6N2x~|r_qiNY+?vatu{vap0msp?F5gxGA~8p& zph{y}2VWHgq^nYxOO14c_40reKk*j}@`3p)O6A{PXF4e<4Fi$6up<~({oM+^bWjwi zDdW}>Sq&0VRZ!_Oa=VrjQM;a5`g;tOY8^I z)WI0*+J;zeV?*VZ+IZXU@v80qz9ter1<4dI_)EuSy1L*ZUJiCqA0C5Y zB9afP$z$o+t63el!VqxIi1}QJPJ|QK>&ZX>Dwl0jwgmw3`Il9uu_GO4&qa*wRs*m{ z2H21SgTBn7CU)ZBJV)hBt1TFmjxF}205GWrOmZjs)3ys1z?>*!^Ex7aJrF{lPRyrg z$K!EQj$3nIvQqP2>U(;rT12FJou&bF<|AE5MNp-M887pw!kokR553d3_w2zp_>EPi5a0X{|g!}dCss9c42-D*@6V% z{5}SLu@9I(3<9V>03fq7=qk~Ysz9kp+6v#(nAag<$x@+ZXRh{?=sBm&=jm0X0|f*S zEyXTs!ES{YZRtl6PN>k3en?wVWg86_2=`-49foK?Kcon^Wu2xuw4(Q|MC2M{lLrAP zMIwyMFd@Q7iB3STr@EJ1IdVVqj&0BcE%n~*-#1MG;yhJq@7ktLT{dbJOBIPQX@v#h zKy+iq7wB703x+5dCC4-37L5HCMw7DEeiZS9o z-L_F{EGVu1FPuj@@YR-%h+V#a8X&Wd&rZL>Hd?y~_Ao7#wY zqnB$S!oIIXFp}|59CmuTM@cKJ;oTTxSvn2e#J#dQetPf&&`N_0&)Jm4N(`3ch z;hYiQe`kO>AR3B6wx+h{z$pW%zhK~lQ9Bj@3U4$Ue1RX*e&UZo0TNwgwwH7q`X4@T z#JqtKD={})$bt)O9?l-|{Zz}ajxjL=`9l80LC@{{Vsl5!7>i3$*4#_m&)<3!Akjs^ z-DVwgMlL)&YJ}f%m;(hT{~zK&e~p;YKhOs@v+o%^q5qZ5x}!W?dvk`8Y zwd+KiOT-`NI+6?oo@R?JHJsUJEa-=h`w0Mc2EZJ%bG>op=#}xBRQ*c`#;+J-4l?)B zfs=N5cuU?vD%OWL&yO9enXAJH}M3XW1J=f0v znsbS{r_H|!4dZ5>*8%W$heZ6i9*^{BmT#cp!(`BvxDf%Vof~aA5H{xyM0esk^_z3C z|C)EtemB}JyW_KfaDu2g!RrT4*!eC2pwk!b#$5J30P7evqmas__W#-BK{K}Wp>#cC zj8Yy*q*3Bld+e+wh+6s{6x$+hLzY&HNPzE8{eBQLLvzU3LV!xwGWHts)XvK^XZUX9 zf~O2LN72{{PT}hzlXm%e>2U@>Ljs975+$Vh!PFuz7ZPV9d&eW?NT;kn->yXWJzIVT6?6LP`6WzdBFH@7sorD&t) z5{T%B07cP#;!f?NE*QaS(Gg&5TJKWFp?~=f+`(=U{H(dB&cD(y&2cX82nt!JfCGk1 z-kG*PFP^ZuBNkm{8Rpo$o2Q|q88}A`nKWQ}@JF?u`BS67>=6rxA-Hc*VL&VtgLFQ9 z(U9kM8L!^6XvKdv`ZKGnuEQIE@Jp(?bea1(X6+*fy)GMP%>RZH*jYP(Grz|+YH5j$g4;zMouH(!bh)w%l~6=@{mdW|K0G4#sI`C=;n-^e_q6h zJeGIzywcKT?hIzT*EB?6`y~9dC@}l9MF*nc++%>T2Pw@FBLX=meg5D{1F8MYMn{uY z4}l0=c$DY9ijI(31mlK56L-G*r$x5*w;>A59XbDI=HegFfH>cZo!9TO(Ss-SZxlR@ z>Oc)iId{bOCo;eZh!`ezMp0PXwP(5v&RG|;79Z+UsM@Dt+oJ%5ves4C>~4k3f0#yi zciS!S=9%OgaG8C{kVyj{Z|bcA`CX(bH#QcE?US{$97NPS#dYnM7{Gfj!>PMH*Pq&z zv>)3D1-?0L!HyQ-a2MH$Q8RM5&1_-}5H`Y)bMx;4xPKZlkt@txrPzhzSA(2x;A!!RJ{6t2!BH{7@9BYOt&WCsS2qVnvM7xpqN_ih9{ z&}FQP)Q$MpAq;WuM8Gl)3W2GO)aAC6-tIc`cB*rMZw|d?O^r`%qu=}QBl|>20qx&J z(0@bTf@M=*ZuH~;_f+HJoA8R>FY5l{wI!+b_#1imO+2@`2v?6&uSeUI^ZIS(fGZLQ z`PgWl=x~`^%>brW*E^RCn=-Ijy8$&DKpv20_W~m{5)I=h1l+gGDvJBQo>oC#e07F?j@$l_nGJcTnrRp5YVFICpWxC z?nlXQ((rqIuLfhGYh2N@S`^#)#?bItO@TpO$DiZ!4p+^apGIh;`XJLi)#A1c3sQv? zIRmF78Xs8>d!gTR{l0B3P<_i{b1oIv%szQGl{hC%D>BG&*?xv$?8lhX9}s(hiwU`7 z+D3$EIMIy}t5HG*0n#Q2*%)9p|INMCAa}k45&>%BHv(J3F*P>EfP*Ol8t-$YT3|O0 zI0UG50ahd6e8Yv=4&s|J#Bb|Db*bH--hGQwJ^nvl4c5dMq1iJ40000Py5+(|@1RCr$PT?v#NRn@-tRaMv0T|F~dAORs5@MqP4fFKGOH)L@m?t&j|GB+{ndz>s?wX!3 zdh*VhlXKEl@7;I5_wKvfyM?g5%}Ng7tfXo?QLr7DS-J?e1G62NS;~P~O4jxrvmKZr zaNvn2tdWHa_0)CMR8e#YQRpRQPC{uFRUjUL5)g`pj|rkAPSY5PQX>q*4fE!OfLI>_ z72BkXS-oRMiAEDQJOBjlg#^z4puGrj5r7;+MO}!x){{vTL@p7HBhYFhSc61s2=HD? z@#$RJ=wEpciacoU*;=fWx zKo9^>ND^+8Y4jC;bo37e`8Q*)%?e<~h(^*{ZBMC|PDV{zj;aC_M*T5=I;>Guz>*5& zhpQ=}ON1_NuIc(?fEZ1u+hM%>lmcTD%>yqwi4aaiMOgxx3J`4rK&Em|QGmrF`C$lv zKPD-^9)EbaiFkV$%;H&VHJ z&@P7Y{I&&#$gGC(@s!FhfuY-t-O*2*ct$kOnS>Bxl#l{Y9h$!<03ZNJ0P(-5fItn1 z3{aG&Se$r9^)W7521qabMWVpTp<(a05MnVJI#8SdB#dQFE0qB1aZHjfPeb@jFwc5C@0DTvzD_p0=ki>hjZ0tkz6ri4C-Y`u> zY$!cSgr|BHQs^O>4#X20v!RVwB3n~=n-z%q`8dT%kuXAk+|O`;y1I6gYMc_!$c z5n#%$|9*k^89;0rh20vjK2rzq!zj?L+9#1RGj?66vF!w|5H4wNN(p zg}hx(v?@;UWzmT7@UW>GIxv+W`nWJk=TQ){Q10x%sXXxE7`NTWP=R4k5a7H_InDApNqj_czGId?yDinv zB2249(LN%TXM=8>Kv{-w)9%@np!)K_((WuWPFI04td4R);ngM6N2C<5_A2_Hhc)hu z_j4C%)qSGnB;{o-d#Q8Crq;G8PVul|?VO?Pm`V_xD~!_lJv1)@fpSZ^P@$GB_al(4MZD^c2{{!o;bfYNNlu(h&ZsK zF%pK0Wh$=&MSV`!bBCoul0JZGe0XhSWK)s(4&{uQ<3#(^F}(wX80)5ev04ePe}2s_ zpEoFx#I6*8Y76jbFQ6&oGoTDi4H0=q_1&uD<8weO-AO{(vnx0ax1ap3Yng9?0sEdv zMDYm|3EL0<1e&&ASIb!lz$6(6l$N++@if{JRe3w2Z-!<($n$51-8hTAzQr7oS`EVc zvcPHDIsV(7a{0=l1QrIy_QM-M*Ovi%%DXg_a!^nhkO}~pt@C20L76Bucr3Q!9qiLl z$vcNs?Pd_lbGn{6S_v?S4ylb;h0K9Mz*ODf1VZ=*04N=pXc}M~f4f$(Uf=I(A)+z> z*i#PheqSHvbF3h+c?SQyX z$GOsQugeD=)7YyYLRzAW0pXppt#(KrY0MMeIZob#{QF24zEq}kOGB0J?&Y}Hv5b$x zfZE{Tz_|WdST;Y^p&B=|uXJ4sw7*|2|08cwM8sO$SWDxYEuc&kZ+!M_M#Q}M1XP{y zJz$nDYZ#%EPVfd;9w_*1$1ons<4NJe-`o`Js#; zF?oZxcFNp;0Z`ggVYPZ=-p;W+??45Vp8*g{fyo<(BcZN)q-)!^=kaIamhJ1=>bQ3d zsp5Mr(evaxE!ir`Sm0IgpLv}T5rb07dv2Ef&bH2`JaxM21s9NMd<=pqnkvVdNdBQ# zwhrufUj6NuTW?kEgATnMRB`H5)vys458`F6r88(f8xgU=IGYaoJd!6a;Jy@ssvoQ- zq3qVh_>2I=>z%UxgMJ3>3mD6zofM4NtzDTU#+u13e=LRG3pUN2TkAC-5wU&3+kCbi z^!@OOpJ85YK}5gT3wF&r4lC9VY3i2Pu^Nzz}T+;AuOAp?9jvzQv!Iu zYZ;g2fWpS(yjftU^b11PbF889d6Vg9+lk0>{NOea%E6PQOUnbDg50kkt+iiZ{t1e* zLl+BoBc$~`ooaPs)=XNq%1FzipDtr2zTftDu~U*6#((VWT>KtHL3*%Kh-Ls{BNgVI^ z)kMB-9m4Bk)7YzF`f+X;hkn`W)->3$UjM|ymT~C>=7%4u*LT0Mo*ow?R!0F=U1I7t z9Ra{+MG=6QXE7pf=r!+(>tByu_|{OC+;|_?*8kG${hq+gBeEku^Cs#PO`HsTCl-=;9i1d8~ zuqMe$j+^0y(^$OUo{|`{r1(T!=(=6pfPQ}`@ zFfg_segKF*)1gfvf|SVuuTsf0C|i+77Gt^MGK)Y4We-2N)K#@*lhRpPO*eH=g2*+1 z?$QZXszlx%TIsf1O3EFr#US?!;%$Y&(OyGA3yjrpja@8hXR3s&T&oiqJe>_5bc0|@BpBgJH=^9 zDCvxvZL#LlwY40TtRffDdg!zuc>48(-;!Ofs5&zmH5*b9&*-*n2> z+abeP&D=4j@9(0S=A)g~K6p~5ul6dHpY;HS4XYiBYGb?k!P%QoIUT4qUqsM=9=g{w zUbJ%)lzv4I-5!SK8HmTNO69pyQRnHYynBBYFaBAnG>qgtrsJQP;b@d>2XxOeQvYV$)IoE$y@q&+`5Epcu(~|BNNpyHtQhFvZwimn| zE#rzVNqlQH%h+=hVy4rQh&aoIRqR3S7dkGA4!m8_egu5Ei94_i*g1|b{A;Q7g;^Lb zVE%cC$XPaBo9%h00*Eh7%8zKO%p0j}?&Bh^>-J(cFs^?lmd#Ih0p8#UvuyvEW35`F`+=NYxH#sK`QqL3G=7 zrhdwcn(0NuYP5G8FMnJuohQOz;{mGj?psTxTf1ic8i9k^{_61;iM4>5c~B;}V74kjX;8sFdIMqh*{k zw|PDcqsha<`ce1E^qY;&SW8ROc(ti7E^5;tVrKG5)%On}i9ZEwWR-4h>@yQ#xZ4)f zTr(Iju752W#+xVI25YE!@>fp9JYt4`acoWQw3LZH!|fjgW$w9 zgr98p$>-QV!Qa^etB4l>5wWW{;=!xq{-LDeEv4z&L#6ys1U@Ya_L3=?%=#McMQYf40~Mogh!tpYH{?N1FDm znL7L*0MK3>M4xvNU)?^(gp}*ISOy2LI8kKK#>wbiRbK9>;si&c7~Y z82;|5E?0d2wMckPXUH4tDWtm%tS*<`;LS?exVFQNAzBC0+{dY6uQ)%)_&L#fU<31* zC_4C8x_)C@0bnt+V-T%aY3l60XM1BhEq-PYy={%IuV`zV-2a~S`aAE^G)}+jOp@A3FxL{L&vI?M>+Q2laWfhOFOY_DYgd;{R6oLxeFgEFs8Cfyx|r58*1Z7P(7Ae%>)0Px>y z8PC4}I6O0O>&GQ?4hnJM&|ET>=k26urNj2K&>eXf^rlbddS2kXoU`s zIHu)=Uj;?Ht<#B_{M>b&S7lw%$edt>Xg>Pky?{75me9Ol`oWrIT+(C5uxeY_?SCP_ zj-U0zUr2yCTgO1;llcd~GWF931gDYav^a=9wt+Q&@{1}9IewSFn*PXKUjx2xK z5CUcKk|;W1m9Bq&QlPBm{(sCgmRik3io6`?`h7uQE(PU=h~&YOK+z4@Ar3yX(lq(( zDjN6C4U~}|-iwF}rv}OZ=%Y?^?5-^@wER^NQ?_9J@NB;rPxy z8}-s*t^1xuY2DLo?;a8PO*l}6-p zVr?{41wBoEf4*s)^sc6*U$o^WW7w{LF<9n@JF@?YHr12(;Ba(wRUu$1L2v|0xM`~4 z)wm|^g>R`bwCa1+vNL8H5V%KLIBt=uz_%GyqfSn+^SVx?u0 zr?Wy7uQiN zPEEa`XrLd~b)W}Ii1+VLc-^roK5|r=y1SbuukIo$aW}eIMb5m6VQ$>`G*vh60z?iN zKG|4JPLjXXD%R8Un2`%iLst5M1K6dw4bhe)4wnRT=JZkmc#N62hQT%joA2#w80{U& z<1qkyw(+9qYmRx0n(%w>H4NL0J_IN^-ZQ!JHH;v7r&~7IMboqOMRe7TPlU2|br<&x zm+(B_Et?ng5>+ivz`w)AB?h0*mh1vSM3(Ibw{}#_XqXvti?GbaEX!Zr7<1Ec}M!z$!_}+id+yl!Ck5NqhrVbUkdDGzQj%A$M zPXWEYfPv=a*e`-AmUq7#8=UT1))(^_L_|fs&UszW^zY0k7ki{^wF$7junq`n7p>7F z0mr(g`OAKY?GG5%FTMC+3F&Q9uVggJ@&b4<(!OCvVnLgbmaB%<=R8+RKeTVlXZWI0 zW|*T*$cP)RkVff0JF4b3^2pLZIhFGM{Sw_bFij;O{2>T&T*vLQX1S8zIAx1n96j5= zYXJtkR(n1O?WU>OFw6{Ak>e=ZJv59=OMfcU1_H*|9PFl<%IbzV>oD*zMJYMiJXfT( z&YXXnk|lG9s&zm3F^DP2<2+HWD;EnxnAiu`!NIizV9b`;cWI(*0L0+!^7`DyJKetB#Yjih??3ljM3j_c)3 z&10ogHlNY&>X?NJLF1rrmBz~TR#g0G83NtVm~R(15doa*mdy+M0zgA9FTR@q8B}d8DV?D*T6JR>Co3(qanaWwX%6mAIxYiwnjMmsVKeJCXwwER*Czn zE^F6nb4jSTpb!Uk?3DHwJv@htQw&t6Y+5^}#YwEX!JTC2hqkXwOaeg&ASust%jWq5 zfWr%gT`7ExV;GLlyrFqKcIj|jhHoL~imuk&)v6cXM`}hTS$4gI!E0R0`feTpS-%(F zG2G#tjs7l)0rwJ$(X8^m(hmm$r%fmkF)-|&=bbbyI=f7s0bpMni>-lf5!kibJQUg; znV>Z9zFh09S$zuZyYE1ygQumHO`T-fbzdw{;iPG1UMB0-Koi1ITH$E zGf*5Aofvq_Tj3MwX*)cbSy9iDBN@b4UVMSq@XWhL5Pa57rPl|4V+L-2s}dt(VK?N5eJC4NE)c~-L-B>v;w#6V32t6czy&x`g2 zrA958zQxrP0$BS3lGh@l(KSfd%zW7bmcDzf73S^-fEf{G6FaSX!FeRa$1}f#(Nv|^ zkWAh(ND0E}Ol~Oe5*ZaYJQFqLg3QmAH0%}FoLc&Revc~|gU~aS9n&7L0gj?DI0Vg) zBus96NhnF!M!3vz#xE*Tk9d&DP4`(Vj-Rc>=>@2ljwSw%S+{U@W5LPI3CiOF%NoW_ z=myzC1%^B1GAC&2pUo6&Pu3@1B`JNESE=y%H0xT$@h(H5oCt~-$=oSi8myjdNi2Qe zVeOPQBZdwPcU*D&<59tH0^sCQjg!=l=GXfu3a_Uyz1SNo-``K1Vnz|;zXABq~a6VBb45DwK zsV~d@++u@53W4AWNpQv3X5$Ng-(@fxV^A#ZTJ5Z70VV7M7 zG61(5W^7ztJa(MmwEk`NwgRF*)wQKqS*2;m@6!^b6sFcl$; zgv30hQKp{e5#nMb+M59OLepHp>1ch^z+bVAq74LascRXZE8>tWg5Wj-rnPdF5ieRw zg03XP*fq-mnkn1c75&mwHokSnU{K>j*nA)~y#S438vN~L(6Id-vmzhC=8(Cm^M^>U zP6T``FthWti!eU#oox%u1Zt{o@D>no9ue%C`zhVLSq$rU2EI|tAdL{{ekt+&u5I>R zkAGNXG}qTt*@$#I4BrGPoCE@oY<&DW>wA+kNhiBgbPdQ4)+37R3FNJgW$_2`p0f7T z0@Io{-@JH?|C_almv(bSE;&w!$=plF;kD zSpm#c0xi!wMge>q03Hs2Iv|)Jgg)tt1;3P+@!$M>@Yam~mPQx=kq-hlP%6KrXv%+& z8^$9u!QAQeIV*wLIw7J`+4J^RN$e$oo<)d@5OEOz?F5AL0H};*v*Z3vqcC6?vQn@f zhznQKYD9dTh#m%+tV~q(4}oR33&0FjHqwq|Mu~!H9IdB!$ojQIv$xCKZh5 zuh0`oBua&}>PkAEj5{MCJPo3(i>NcrPyA07*naRCr$PT?v>J)wMq7R#opa3qNaRab8_ z0|Fu6XZy*(ba&Og_rGWR&pEdcK7JjSD}cx4s6HMPd<@KSx(Pl8=3`)v(-k;QhxM_< zd<@K?uRv2%6MJRz<`^1Agjv=}jIlFNh%{z<~oBGc~oZq`TK{`QZHX-!)UI%z=LW+5pi!^bsAqZyc8rGj-v@AxzgN zFd;@V%N&8GHPSxmq+rWQCqwHACqUaLJ|TamYrBCJ4nd}-E7-w+Ts0K*2LL)VqaXBt zFx3i{X&w}an|Uy}0c^fQ0In4l-`LtUw&vI^dFSqQ+yHaY!iCWQV{yjVQV^m$v#csR z9M(QO;|zFr(qzbV>kf7x0G$5UG(bTJ0D%1A{Jo<&duTbxah?SMX#kNC9Dd8~><`*% zYF2l2nPc((zZ95DuD?FWT3b(MLVU&0^~(h3kPQYQeZmQ_Ys^@9Z{j2nOao?_04@+m zYgKd|Frb5I%WM;tSjmFysg_{yT|mqpty{Kt-G3P{b&D3w1;!R2K%K!kv{hHbo^wXS zp3$Qrc}g!3ng-1L7nlK(#-Kp}WdQK^g7crHV&UHdV&+%^bj*R7*3fVc)3iqbpbz6b z2%N*VsncNR#7U5=ssdo_=u1auSD3~^>JDHRx9q0YE-@PSF?k&`VCowitAO*Bnqe&F zrYY?O*^iBv%>y$Q17=yBo3P(bka`os5(qiuU;_x#vHEl|LYRS|pQr&t1B3{HrYYdv z|2ubAz(@#qYvx%?gT_oKv=b2RPJZ>UK6XrisY@j0p%8a#y51Ms+F2BCZF7^}t~dT6~W{Y(`;zC=i)IJfK@v*w(ZlXTc!j z*=m8Dxj6{aEb?*+QrUNr`fSh-{fPnyjnac?-zGr9P8|m(m_d5R4 z;eFz$0yA{ZoIw9r>^BH-5ddi9NxeN|7Q8oc0$9N?py*&RNIHT+QYQep+>a3O2@C8s z!ECneK-aE^6^op?WQlQL&YVcMO`8UV_wS$GdeTXs-+lgt>_G2cpyfF$qC_ z;0_`1s@7QO>BC$4_P=%1fT>%wXc#i~zsOjBVcU@H+7&j;UjQGTF%qby3&7BS$f^bp=;i)J&%en?R{m?rE!{dCx{paC+qwe8!IPzWHKZ3Q77Wy1dD!C35> zBRSdjuC;LZ@MyMg-^HnuPEH&cGvN=OqpI;qdY$6Ybf6&&mXU}yD7eTUjZ(zAx`{Ng4YtF(c*)E~YM`A=r4w$AUR=0io zoeXh>5JDRCty8B-Pza#1F9j9{F18@k7PLeHuO5j>9f@mPykJ4kpkX|OLR|3ntXYBG z=Z=-`d`0OYZ_l=^oQKKj~Fm;KLS=Zc3kDaSH(U1E!6AM5o6Wi-jlv}M1ZMF zByMMjUm{5%>3DnAY#B6G1ci1Nx3_T4X12zHZ+w&q9EA=MZfjAIBR7V54j5D(qK+dvvA@V%}U=s-Va~j0o3_Z86%8n(+uI#)g zwPeW>V~=S*uVu4icb|K%bY^UFR?2aBN^)$$Lp@Vf_~GGfo{t1fePiQUAjF>mv6?{n zaKs3BW63pn&b@d z1U<9y7z)%*wycea*q7pz)}B3K^-VW}6^WF$^N|ohs_jcH zRnewH9poSW!@;R+uXL7Ui!_@i>NX>?Y`<88=G`ZyCWS4!0MYn53N0VmIsH%CHViOBH=3lu^qRr z^md00OnqbHUlCv&8GG7}uikPiq)zEoK5}M^sFy?0XQSu@G zt!p}PA%F|((H!zSK7Cikn1t3%)HgOhib7mYDQ#MVmOg#U+Z-bRn9h!F=@RL5IB>|o zOuhEnu39#`4TR`IKK-82=fe7h4IoH~7rzVxFqeC*B^GJNjVb)nufLeP0R?M9gs!wm zN+x`p-Vu*-yQ`cIa;Pl{9RMSiOKCHSR{k3jR4HgOF-?DM7ATg@{&L_aAiq;ieKvDZzo$0o&i02w01^v4jGvGc>IT&u3u%_wk&>Fz3e7v z>v>Y?PLcFF-jN#a0$#~q!!kEJS8nujr_7G6jzE(9l4CP4j@)E<{0 zN-c#<{af0T{2r1%gJYZA9pEn^px^1b4msO;p;ffay0WRfcU2#cPXWfB(y|%Ye&I#1 z@rwDSoS@nst)StkWGJ+$qcu4sVCoWyO$acMR9L!OcUX1T-Q|Nw#2j+b*b)o>tfK)m zJty=5f3@D!kPVjZZt>1n8mC~K%H9wH`43Z8j28#Yeu;1#1V@cY1m)Y#^`)fHeHh(O zNv3)sITT=Xdt=~KW7yoer3tb*bLME-SnPX%xP4oIDHN(B{WKa~uJFYV~&58f+k18wFirs;zPmw6CR#Fd(I zi(nk3<)|5D${maDcwvrjrgVfeE9FJ2y;JBIxb`LghIcRL>n^5p6G)F-Lz~+hOtWoV zImvO-950{{-CBC}hBepUP&Rasnb1^fVydd@FYT>Qr+}eq7Co8#4P$HyC9U=jI}P4k zay8KIC{*mqGIJ5?(Hg_|E8ke)b4{SV6SSUTj7=mxBn_?%3SAYIxBE&*$t_JDnX{vv z{p_r0frlVfn`1E?xKT<%WeUnsYZ4YEF|H!??juNcY{6d;2lTqdU&Cba{H8ZHet~J) zJ)*4*w#=LbTc^(`Wu>K6OIrcuV-i9tNuBUib=d=qYtbKqBh?QK23e0l>` zTFh}Ol;%_Mk5rxHQd_q5tt*!sOUuo1dLr=-Aod2!f>n3l1L^MF%LSiV0Crh28vNf% z>(nWUsf)*dr)k<$ing;|YT%XI?QWor(NvB!<*%nSo@*422XX&M1P$W_Az&ukUze-;T z2X#p2_zl#?cwhROQdE+u@>C>lByQm56w}GEl$!qNpn5psjt%k1O&21a> zbQ)e*`7OwH=~B)c+XuEeI9Xl2uadNU``aQ2+kwC z+_{B3*o;JC2}isiIM?4BKLIw+y{sev$8ZQls`b`nb?lyU>(wDJ^@#)-@e@c|4h$Rw z|G4GWQfZ+GKWl!!r7C=Fdn#<@{bC3c@Rs0IVd=yeDqN(!=yOrst0+6-CjcC~BDXwY z5)OjsS_{~x7ZbgEBX;i&plJx})^m9N1tCn6yU~lQlce*YJYyBpOCTI4!Q(k42(Ha? z9S#)}an2E$Vy*?)=Ptc2@QQ!lGaDKP*_uX)vTno#ynII!KFmmvl`Z&22kx(A9!? zk)Pa|6g(1*?^Ozra?j&N6-Kcrz_3%97&aKOTetH2>&2Hiyt5A*7 zT<6@-R8??&@%P)6n7TybY6SQmt(6rD!K=634%wQT!fO}?fMxzA83|8pPg=hE-SmV& zF!X|Hnjm+ZE!L2s=hLA9^?;J-wI90S+CEaPfEs;c)u`|BtmoJoh)7yj)@C zI1U@k;F8H21PnD&BF1;UFW|A?*&xFxq&$x6QY%Z3OuFix#c~}v=gvacbuuIoP|C!l%2K=}KuD@rvD>Drw2qhwWhNvDC4`4-cB5D^=Q+TTBPD7<;q z)v~m;z&=o(r8Tp#B^Lf^d%)cD19LSXj+9Cv&mk7Bta`^255Hb_-M0(IFgW}4GK6W- z&D+udPdsD8j@^=}#BMbJiCH=rMWGjcZNnA;k3Ve#75gh{hsaKH3|#H!!r=Gl95t&1 zZSyTx2L=_-f5w$p3ePs*d!MYWE6_Hy^*G;@j70`_8W>_uIlx~4@pQ5PJ1)2o-kv$T zv`T=IP2B3y8jDp7DDVDpZj|8o8~{|QeVOOHl#ArkXKD>3-=fG~H)=MkN*laZ8p``ZJAalgHB456ug8u0Ngq^SzTSgpHjSVNU7AFz?_9pHN|fz zi8$qiIJqA=0CxGsm%lO+>QvK{LQZzc-;Zi$Yg8I%Gaw#r-(_ zj)_4h171E^1HBA3&8+}m{ka7}LyD@pvAc1+Y^VSCt|Ov?Cvwrauzr_{1m>=sn=kOF zZ)_Zlh#SZhP)Eb7x84T1>gvKJSHAgesc`u2&H)pTH)@9QkZoDA(2dZh{7cbGAQwwp zsv_U61n|v|Bu@xHXgvbdI=jqKRX&621cx3y?`k^%*u5Iys*5zJiWCa>tD8AI`HC%p zBlg#c6X~L^p>|fy$wGsGD<SEH+LT>njg8=va-V)rF$rp8NCn)qN7neqG9SR}P&{3S$i{aFf3}PXG9eV}*VT}!2 z-*?8~eMeo=lO8vPsSwFm6F5>u@)-*0*xCX^zL~%c?pny6AR(yWd^~+~^JSOA&hZlp z%>i{;+xDMR(eQLY^s<}n0rND|v`>*&LAARt-`)fi%M`xwfZ*o%R8`fwiW2i^Zm|(C z9yGI(tjtGpifmDSfSPMw6-lED5DuYOcCm&vMbfhT7nagABq;9p9CVz>Lj^_-H|Eq$ zOW>(a)Up&ifEoyc$qpwcUEt&~-I008n!*T2x{b>CcsoW98enG4W#70WaG$#t#L63~ z)FX&EmyF-GOQ*`ZyMjVU>6wXj%*u}U7o}GQhLU241Hrc7z4Io>8mcnw6MKwEXz+f- zilpVTU*;awbmMYTiFsTc`rggCIMl5}wo_;+q3TtOxb(t8qwwVG9R9T423-;c#aheF zXu5au+X6}_(B5`@Jug|Kc7-g2asx^V=m}U#9k?$)aq3j)IF7&EBATv)Wtl&|@3O#R z_bYTx!RqbXzl(_1Qqc6?xbtAsgAE5WPP|i+U-5;1u4?o0%}RYL^PngeRk#E|N;YQ+ihCiTdD_vjFfJkBVdU8^ z$I3`?VwyqKJgdL+X`>*|QXh}siHv=b9Du#24~KP&uLMp(dEv{pf%j^QMt5}x%=E@a z>8Dd~AZWzqZ~3WG7L@sL~$}EbhV;6c*)cin2C}6&GsQ zyK8>auKz&5gD=~Vqm?YkdAYjZv0W-M&D$)WJ#!g4sq%>ML=+bcU^r_ygJc%qk$-Tp zZnuq^%VbJ@>0H-kAiNmMRnDj=XPdX&|7oLu6svD+{5%NpHPXG!g9gFcYd%w&G6{vi z%BFjzBawGI1ZMWtR||5LB{1_Bz|Qk8C@oci5pM|vOCz)w=cYY-3>tW zmj6YZ8Ovn)G>606I}eO$!kbrK1-r+LEv)>IZXSOz84FKn7no;+$hGDB^<7s}s(86$ zOB9@3?~IM&zh_EI;=O*iiHqN?x8>%PYRPq3^L~JnZ*h0BtRr(sOkatUN>xi6JfSzj z{NdEpoWIZ2Pg;sIBU_`S&9(QASLV9OD*Bf)g(w1H9q+%e(1Vn~0Nh8{Y3bV!)?9bJ zDn|FcBrwgHKFwW^Auv}zD}>qRN{mmvII+EBK;5bfWzdDdv<2|<8HKv|x0^XUvC($R zV0~!<$F_JHEzg8{?zEq2aMq404KD7-#N|T^gV*bxwxHFNz3Bc_grgdzwC9bPPbC{s z1AcIRAu#pv_>F+L@`wRbpGe4?e^gbr==Y{_Xx%7HDS+Zq2L})pywTJoFw+dsd^`F1 zcR4(=jsqnPoIHWMNN$~;x^|wjR&~m<*2BjHIJ^*16*C8FFtdn%i$6u~xRNyGtvODE zv&#!It;#Ex2x*Mj)P}4>cGrIj^%JUzdyL|bda<4I_j}la^@5zcsAv*@veJ5}F z=+l?=XE3{8e$g^Ez|E^H*q3p9GN<^JxG+*XPOY=IF2$~KG2>7jL~++S8g>um!C$*y zz?c4Ei=gV$@OgG_%<5FWyyngs3EB&z!c&G;NhXkYOI*&pZn+RkC_oj z&@m+rjirnwDDO*fc@4w8~*yfauKB@`WPeE36R@}?n4r<5^10rI$AmN z7r(kN;MFtCnKLJxjl~{C#OWObn0thdi`?*{tVsOZAYk(vn=6S1+dM62~3;*JE+LTV@;7_DKqVE)=9kvF_*!M#a62433v0i!QxjQ@Ns!3+s<}=x&$yW-zaJ;jZ4%D&VHo z7SI(PYwzP;T>dK0%(*+9B!wdi+ZK4|a2-a~76Sgq-5h@Swk-uAPl~$o=q6yi(g0_g z>OOkZ0J}9e^ofc2{5|Eg(6%=UfG)C7@{0NL9JT_kOp=(^GpST^hQCFlqQp#XZ0u(+ zwuMMcGgbw!-nybRm!MYkb1jk3%1RP*$zPJ6&@i+X5PG;d4%gf98*48O;`JD*lG)lI zitnDGV|5XW@#2RZ?%iyIsVZTm!Oyc^es~>#9N;Y>AkjyIIj67!?jXkjmaVa1dz;^e zI1=VU;Puof;9N&SdVUD|bjS>SVqBHScTojvz%X8;%}v!ZZ(My192k6RNlpuG{=Jq+ z@Opnvt0FL$Bod#{0p37>6X~KdQ8r*;;YC$0;o)R7vZNAUHfNOxry%zjqCQOsS@GcG zpj;*4@-jtzE{K9`!6hdk-ZY>z!?hzV;Mz47(4y+3>m8!n+ax|IBtkjB1b%I(4nwL7 z8U^IXfBLQsKiNUH%ZX8(_73?b_XnE}c`9oI=q(V8DmH}pT@3WOkB{{w%Hr`GHN&`% z2;BA(WdLGDG93Pje{)v^hR&!AY1$LW*rzySuwmX6GWsu}tc6$=jD)7Nms+0kviSu8 zaF4UCm9ckf`8^N1AYAk~D7iB;w!j2c)QtCRHBXxDD9DLK$qm3^WxXSVP zKT*@pplU>!I%#SGy{+VwkTlr*vSfAi$xZ=7`=Y+F@f!$m6ZzmfCr^gWv*(nyiX)hM z1_m6c4ezL=&Mta6cc#toSpZS(x}csq%cq`H{85-d^W0Uk5C73mgA2Qr&-=I80^Uji z?8*u_C>bCDQ5~UI2w-RoAyNhq`qa8s0k?1FaF9gPGwzP$`Y0d&*pwHYpDiM`a1@iD zJuBaqPNlNC5UnIF6r^vSH5=ZUI<1rl7Gl3?<<8F3)NJi6FfctK!~Y+G5PI{#fw1=4 z&z3Nw#PdLFrlBPk{_je_(C;U`mfIu*3{>QDQ6pus+&Y;PN2pv!TE;33Cuy*#g51IM9L3D;443p|(7hzB(K%>RHo%Yf*zl7*Ld57i zK)G2wHRg^dZ%>_AMO|Ha<*w#s0UgXtX2Rdj48K^Q#uACY1L9e9f?<25#gNN=JsFEE zKO|u2!}W>8OMrMT6_i&jkqrhxq+5rjs;UYq--~ZHc5QAAYQ_jb$Mq`7anu(rjmj3P z@FvgR`1H7!$2GaYJ|To@wVJrN2Jl3q-Tmba_6J{=2ckL%*`dl+M1kmpEu?F#=` z{)JLaLq+A5^-fDH(zo22b!w~CB@!t_jOwke@azNM2Rjrl?Y$JD*~(=`q-$#{Isrr1 zi9iI+{{q0vog|l18(zlIrE;B431y4&gr)m;|4-@70#I`f9eYZ}eV!>$EfvHN2t)NY z=XGR0E9vSmM~YPnC(lMGVuq4Gbf0`5l(Y|ze!?&kPYukUq9F?TQ!zs``cf(yzOzia(!2M_&0?sq zt-k_@8YiOhy7b*{WY_3BWqXc_%h!G7Yl`!0D#b0|TITU*ZmGXhFzqYZ_mEMR!x2nb zDpt@;>lA#b>QFb3r6Du}w@0rTT6lWKv_*@S2ZF)>ltE=60BdeoD(U_rH;(E z?;v8?;~G09F_$i0+}jZ1O(8^#`aG!LqvQk#Ram-%MM5K*5u4jnX~W;n-N3@ex9pTD zDtjYl1X2#bJ2>h4-BUFh0N!!lJ!}Ofui#0bcEp3ohrvW~kjD)VLbbwx`fFb(2 zOP@a96^va?Q==5XuJIE})R}6IO<$jiM84au;R1kRTg>~=&~M~)3WjeKUKvrr+Bo*W zb)%&!b2Y!CplH!$^iR4?6%0jBUen_dg(y!Y^~CS*u_$H5CrOP-&ey1q^+8Ry=;Th4?%O5uw9uXeSi6 zWH={JwB}F@%lHZl%H4eM22q6p^GVROiPWE`0?T|ef#>}=Z5eKI%Tf1kFQp?PPCnDm z{wg9%sX;H3riu(zWvg>9r(@0Y%8Hy4ml2oWk|z$?FKp~K(ZA%okmCu7l)W~TxH?PzEF-=E&tNG{-1%w=KC^-Ig2{-BO4c_|r< zjP2;!!`?kuo3kUUfZ<@(>!0TprOn8fy*eoaM?v`-Y?PVyFLpkUomY(t8f8b6NpTBZ z3qIr34EQ#=b4z3z2ySo4Xz6h~PboaQgra;f%@+}16v=OM|Nb%Cip@JzY4DuT`wqyxiA*0% zZC!bv$ZMR*yVgpkJOl2P$@-inUmdQ~+3NULj^yQCHdT|U0uwi{uZU1@e>kn{Qc}3R zaoZ=2VdZQ>eLVh6JrKBw3_b9X^}LAavv$;!dQj6E8?RwP zJV5uRgIc%Dm;qa-&n!JqPfg;W$zViBYTmEXI|9&qU#3f=(Z`Xosb(kyYi_s^lD&GD z8aU;7yq%1O2X^M-lZ4Q>yl;J7MD?YRqR`MY0^ZJc)J~Zy8>ODqnyQqwSMixY7{EPk z!)eCNw-ow%VSFW?0$9udku<*@Z82`!cxq{5*0jdP5lo2Z0icF9=k9Yx!@8@Mlr#3u z0O9sjH2mextj8fs3|(}_qD5zN#-2gWYxWKw0dJPC$CZutXj*@0iG?recrZ%s_xK#{P(mohmC}1`Lp=V3eG%BX2HCs5U2~p^^Spi}u#!uz;ZpPERD3>4Ct#c5AD6 zD;~%9CQhz+%sK+x-4YGo)-gEh6Ww>V3}V4hlhE~fGIaNzyyR*upP!{#o#mSPn$DH# za;P4+ms0^$$ci~NXo>_2=&F^O+rQ92+_k4$uxxt?Mfc>LF-;rHog~=npS=!}z5A3( z3xPtX{K3BVrx;u zB_~!J|9q>$sjm_g&i{e{gGf>+PI-037v(9sWgQ`+UNY%Vry`O6>FmZlEF0s$xYL;P zCj=Nzk34*J#R{;(m5=x3ZJ9#?M=553HO-mv0=4@Pu)m<X6&_B0|6cKa&nNaKp2sC)c0xqaJW7&h$K9PjH+ zVCt1u4$)`_3DJH3;8WrC>#nc-RM#S`5 zd8{7^6UC_1t}IUp^a}Nq(O?=qRtSJf)F=U(G~Y*HuL2XRm?i#nuqIH@243#|^^J{_ zL5S}%O&bd7G#nf-05;5D2+31UDK9D11C!1DO*b=B57gEkJQQj9$P(k;jJk6{h&P#S z>+hX+p6m`NIVaOUG68QT{~j6vlgl3f+TkRG2**;XDhLF+Sy>#13@!kK!2se!5e}S0 zW{Hf9Xr;$ALJ}El765BBgg2OG{6XYW`%^^sls;H#H zC`#Jm$#14}Vt6w|g8f?%5BZexBL)mzh`M%c&@h`sF^h9DTM|@Hf zqIS!rQ(@b*y2=xvb5txV1pwbkCJ)}-+4G1Gb%KZad7ReRxR7z)Bp-N}PD6A50kCcA zRQV{ciccVvu^T^NA)l6xME>=UDe+IfE*?J>5np16HQOhj4;vQDFITdozLF2=w{l^B zrZpD(<6$o35&PQIg$qy9bp7XmI0QMT(`Dqrc~rkm=Nwdgun!##W?IcwBslD&NQyg= zBPucOMX6i&wH-U2)^oWF_MCM#tZ!IU`H>zjKvXx7&HO@S?0Z_fM%Nw72mKHUspWDf zaDe|{j9o(sH!Bd3J(HB;Xgje-`%kf@4QBJdVJuvKxHhGDXB`z_=q6LIxT32T2;9Pi z_&iOJp7qt%qk{=5k}oAVe-r?pPE|#Ib;LxW%!Q^kG@L9n?Lr1HSF`O;=?F%$TX)zu zY?v%=Y#uNOkPcI=^o&dbBt*|vOaD~QWv)9M@2k@Mjv6rT4X4NBmkNM~cqG!}t@#V& zK|$?$Z27W?3<%i81^lS%fzY>hp3?b;@N@*`)OdWB20&+ooy9n>*36u-Z^%%1chdQ? zvwf+11Rl~%^TM6ypKolbs|Pb0>-5uF zQD*j_{GkbF=3DD?RaM%)swx%=g$&EGbVLkf z0)dnDKwum-4`3j0uAug9#vt9L2KJqPI=pw@c=<$hYM1Zu39@;+xP=Qgt2Gu}+tDH) z&ils%7%$$5$LFwIZh30Rkh8Xrp8yo|FtZ(1;h#|;00a70^0)_v1{jaWLkBot#0}#+EvKGptebZQq{+Cp z_ngTR%ji%lWnm>F;dVZvqs6T~xE&3^|1j+@56%{@L(y6FznMW)J zUrdK9*J&RP2<5(WOeLmx0QC(GU(++0`8zJSpxcg1rv)=zYd{cvawv;-q*kIF__EE! z&LW6)oa3@oRk+>r_>bgJ{-wasL@2rrw6sh~ck4F&{d3Nlv2V=S=>C5Fr45jQ+_46U z=oG4iX-j{I$bKP!KbMR|o;Z?=-kEFt%YktRx#Y|zW!dVxk!eB|exi@sd4b z$3iv~rl&S_&IWX5#%1*e0ubp)DS>R}9Rch{3;Ap5aClc|9>R0Dw{7ox#|<#WgS;0Y z{PNVP6E@A8H*fEVGsYk6+qVh@1cjyrfw7<`Nv=e7Bw4N-?o$5h@$hL7q74}C6*m8w zW@tY@7z%AU8Vh}>*F0{4DW1sqyYKF~Y3>!hTYH??8$k>gh`o`XIsxJ&5ZE0+L@^pJ z=?9cqfDH8`iw{B2v4~2L0W`Mtwj-EnK9kxQ)j7Ln(K4=|GcFDjeAzSHi)uX-OoxT3QFEE{*;lJtU zJ_hDE1@2>DJ_hDEU4i3tSRYHw$G{w?D{!0+>;D1z$`QagsoG2c0000CFBundleTypeRole Editor CFBundleURLName - + weixin CFBundleURLSchemes - + + wxab2387c2198f01e1 + LSApplicationQueriesSchemes diff --git a/circle_app/ios/Runner/Runner.entitlements b/circle_app/ios/Runner/Runner.entitlements index ab3837e..0c67376 100644 --- a/circle_app/ios/Runner/Runner.entitlements +++ b/circle_app/ios/Runner/Runner.entitlements @@ -1,10 +1,5 @@ - - com.apple.developer.associated-domains - - applinks:https://www.leyuan666.com/ - - + diff --git a/circle_app/lib/app/call_out/logic.dart b/circle_app/lib/app/call_out/logic.dart index 640b152..8306218 100644 --- a/circle_app/lib/app/call_out/logic.dart +++ b/circle_app/lib/app/call_out/logic.dart @@ -37,7 +37,7 @@ class Call_outLogic extends GetxController { var quToken = ''; VideoPlayerController? videoPlayerController; List numbers = []; - List myConfigData = Get.arguments['numbers']; + List? myConfigData; int vip = 0; bool isZfbPrice = true; @@ -51,24 +51,7 @@ class Call_outLogic extends GetxController { @override void onInit() async { super.onInit(); - if (myConfigData != null) { - // print(myConfigData.name); - numbers.addAll(myConfigData); - if(numbers.length>0){ - circleName = numbers[0].name; - } - SharedPreferencesHelper.getInstance().then((sharedPreferences) { - vip = sharedPreferences.getInt(SharedPreferencesHelper.VIP); - print(vip); - if (vip == 2) { - isCheck = true; - } - update(); - }); - - update(); - } var data = await DioManager.instance.get(url: Api.getCircleList, params: {}); @@ -80,11 +63,51 @@ class Call_outLogic extends GetxController { showOKToast(bean.msg); } - var quniuData = - await DioManager.instance.get(url: Api.getqiniuToken, params: {}); - var qiniuBean = BaseResponse.fromJson( - quniuData, (quniuData) => QnTokenData.fromJson(quniuData)); - quToken = qiniuBean.data!.token.toString(); + Map arg = Get.arguments; + + if (arg != null) { + // print(myConfigData.name); + List myConfigData = Get.arguments['numbers']; + numbers.addAll(myConfigData); + if(numbers.length>0) { + circleName = numbers[0].name; + } + update(); + } else { + var data = await DioManager.instance + .get(url: Api.getMyCircleInterests, params: {"page": 1,'page_size':20}); + + var bean = BaseResponse.fromJson( + data, (data) => InterestsBean.fromJson(data)); + + InterestsBean info = bean.data; + + if (info.lists.isNotEmpty) { + Circle circle = info.lists.first; + MyConfigData configData = MyConfigData(circle.id.toString(),circle.title,true); + numbers.add(configData); + if(numbers.length>0){ + circleName = numbers[0].name; + } + + + update(); + } + + + } + + SharedPreferencesHelper.getInstance().then((sharedPreferences) { + vip = sharedPreferences.getInt(SharedPreferencesHelper.VIP); + print(vip); + if (vip == 2) { + isCheck = true; + } + update(); + }); + + + loadQiniuToken(); StreamSubscription subscription = EventBusManager.on().listen((event) { @@ -92,6 +115,14 @@ class Call_outLogic extends GetxController { }); } + Future loadQiniuToken() async { + var quniuData = + await DioManager.instance.get(url: Api.getqiniuToken, params: {}); + var qiniuBean = BaseResponse.fromJson( + quniuData, (quniuData) => QnTokenData.fromJson(quniuData)); + quToken = qiniuBean.data!.token.toString(); + } + showRechargeDialog() { Get.bottomSheet( Scaffold( diff --git a/circle_app/lib/app/circle/logic.dart b/circle_app/lib/app/circle/logic.dart index c126f7c..f0b45f7 100644 --- a/circle_app/lib/app/circle/logic.dart +++ b/circle_app/lib/app/circle/logic.dart @@ -198,7 +198,7 @@ class CircleLogic extends GetxController { if (data['code'] == 200) { statistics.value = myAlbumBean.data; - // update(); + update(); } } @@ -305,6 +305,7 @@ class CircleLogic extends GetxController { vicinityList.addAll(bean.data.users); vicinityPage = vicinityPage + 1; } on Exception {} + update(); } else if (bean.code == 21201) { myVip = 0; refreshController.loadComplete(); @@ -478,7 +479,7 @@ class InterestsBean { InterestsBean({required this.lists}); factory InterestsBean.fromJson(Map json) { - List listsJson = json['lists']; + List listsJson = json.containsKey('lists') ? json['lists'] : json; List lists = listsJson.map((e) => Circle.fromJson(e)).toList(); return InterestsBean(lists: lists); } @@ -518,24 +519,28 @@ class Circle { }); factory Circle.fromJson(Map json) { - List lastJoinUsersJson = json['last_join_users']; - List lastJoinUsers = - lastJoinUsersJson.map((e) => JoinUser.fromJson(e)).toList(); + List lastJoinUsers = []; + if (json.containsKey('last_join_users')) { + List lastJoinUsersJson = json['last_join_users']; + lastJoinUsers = + lastJoinUsersJson.map((e) => JoinUser.fromJson(e)).toList(); + } + return Circle( id: json['id'], is_limit: json['is_limit'] ?? false, - image: json['image'], + image: json['image'] ?? '', ios_item: json['ios_item'] ?? '', - title: json['title'], - intro: json['intro'], - amount: json['amount'].toDouble(), - oldAmount: json['old_amount'].toDouble(), - lastCalloutTime: json['last_callout_time'], - isJoin: json['is_join'], - isLike: json['is_like'], - viewTotal: json['view_total'], - joinTotal: json['join_total'], + title: json['title'] ?? '', + intro: json['intro'] ?? '', + amount: json.containsKey('amount') ? json['amount'].toDouble() ?? 0 : 0, + oldAmount: json.containsKey('amount') ? json['old_amount'].toDouble() ?? 0 : 0, + lastCalloutTime: json['last_callout_time'] ?? '', + isJoin: json['is_join'] ?? false, + isLike: json['is_like'] ?? false, + viewTotal: json['view_total'] ?? 0, + joinTotal: json['join_total'] ?? 0, lastJoinUsers: lastJoinUsers, ); } diff --git a/circle_app/lib/app/circle/view.dart b/circle_app/lib/app/circle/view.dart index 526ed33..f003104 100644 --- a/circle_app/lib/app/circle/view.dart +++ b/circle_app/lib/app/circle/view.dart @@ -3,8 +3,10 @@ import 'dart:math'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:circle_app/app/circle/widgets/discover.dart'; import 'package:circle_app/app/circle/widgets/info_list_view.dart'; +import 'package:circle_app/app/circle/widgets/like_view.dart'; import 'package:circle_app/app/circle/widgets/vicinity.dart'; import 'package:circle_app/app/dialog/ScreenBottomSheetDialog.dart'; +import 'package:circle_app/app/like/view.dart'; import 'package:circle_app/router/app_routers.dart'; import 'package:circle_app/util/eventBus.dart'; import 'package:circle_app/util/util.dart'; @@ -24,7 +26,7 @@ const bgWidget = DecorationImage( fit: BoxFit.fill, image: AssetImage('assets/images/base/home_back.png')); class CirclePage extends StatefulWidget { - CirclePage({Key? key}) : super(key: key); + const CirclePage({Key? key}) : super(key: key); @override State createState() => _CirclePageState(); @@ -37,6 +39,14 @@ class _CirclePageState extends State int currentIndex = 0; + + final logic = Get.find(); + + final state = Get.find().state; + + var getContext; + + // 是否需要缓存 @override bool get wantKeepAlive => true; @@ -45,10 +55,12 @@ class _CirclePageState extends State @override void initState() { super.initState(); + currentIndex = Random().nextInt(3); _pageController = PageController(initialPage: currentIndex); _tabController = TabController(length: 3, vsync: this, initialIndex: currentIndex); _tabController.addListener(_handleTabChange); + getContext = context; } void _handleTabChange() { @@ -59,12 +71,6 @@ class _CirclePageState extends State logic.update(); } - // 是否需要缓存 - final logic = Get.put(CircleLogic()); - - final state = Get.find().state; - - var getContext; @override void dispose() { @@ -76,13 +82,13 @@ class _CirclePageState extends State @override Widget build(BuildContext context) { - getContext = context; - return GetBuilder(builder: (logic) { + super.build(context); + + return GetBuilder(builder: (controller) { return Scaffold( backgroundColor: Colors.transparent, body: SafeArea( - child: GetBuilder(builder: (CircleLogic controller) { - return Stack( + child:Stack( children: [ Column(children: [ Obx(() { @@ -93,42 +99,44 @@ class _CirclePageState extends State ]), Container( margin: EdgeInsets.only(top: 45.sp), - child: PageView( - controller: _pageController, - onPageChanged: (index) { - _tabController.animateTo(index); - print("index=" + index.toString()); - }, + child: TabBarView( + controller: _tabController, + // controller: _pageController, + // onPageChanged: (index) { + // _tabController.animateTo(index); + // print("index=" + index.toString()); + // }, children: [ - circleList(controller), + LikeView(), + // circleList(controller), Vicinity(controller), Discover(0) ], ), ), - _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() + // _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() ], - ); - }), - ), + ) + ), + ); }); } @@ -691,7 +699,7 @@ class _CirclePageState extends State tabs: [ Tab( child: Text( - '圈子', + '喜欢', style: TextStyle( fontSize: 20.sp, ), @@ -750,11 +758,11 @@ class _CirclePageState extends State return; } currentIndex = index; - _pageController.animateToPage( - index, // 目标页面索引 - duration: const Duration(milliseconds: 300), // 动画时长 - curve: Curves.ease, // 动画曲线 - ); + // _pageController.animateToPage( + // index, // 目标页面索引 + // duration: const Duration(milliseconds: 300), // 动画时长 + // curve: Curves.ease, // 动画曲线 + // ); }, ), @@ -766,11 +774,11 @@ class _CirclePageState extends State child: _tabController.index == 0 ? GestureDetector( onTap: () { - Get.toNamed(AppRoutes.MyCircle, arguments: ''); + Get.toNamed(AppRoutes.Call_out); }, child: Image.asset( - getCircleImage('my_circle'), - width: 64.sp, + getCircleImage('callout_icon'), + width: 75.sp, ), ) : GestureDetector( diff --git a/circle_app/lib/app/circle/widgets/discover.dart b/circle_app/lib/app/circle/widgets/discover.dart index 870f59e..99ca9a0 100644 --- a/circle_app/lib/app/circle/widgets/discover.dart +++ b/circle_app/lib/app/circle/widgets/discover.dart @@ -507,7 +507,7 @@ class _DiscoverState extends State user.userId.toString()); }), SizedBox( - height: 10.sp, + height: 15.sp, ), Row( children: [ @@ -562,13 +562,13 @@ class _DiscoverState extends State ), Container( width: Get.width - 120.sp, - margin: EdgeInsets.only(top: 5.sp), + margin: EdgeInsets.only(top: 10.sp,bottom: 10.sp), child: Text( user.signature! ?? '', overflow: TextOverflow.ellipsis, maxLines: 2, style: TextStyle( - fontSize: 15.sp, + fontSize: 16.sp, color: const Color(0XFFF7FAFA)), ), ), 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 f654b61..ccc9d08 100644 --- a/circle_app/lib/app/circle/widgets/info_list_view.dart +++ b/circle_app/lib/app/circle/widgets/info_list_view.dart @@ -6,7 +6,10 @@ import 'package:circle_app/app/circle/logic.dart'; import 'package:circle_app/app/circle/state.dart'; import 'package:circle_app/app/circle/widgets/list_logic.dart'; import 'package:circle_app/app/circle/widgets/video_item.dart'; +import 'package:circle_app/app/like/logic.dart'; +import 'package:circle_app/app/select_circle/logic.dart'; import 'package:circle_app/common/Widgets/base_tip_widget.dart'; +import 'package:circle_app/common/Widgets/circle_share.dart'; import 'package:circle_app/common/Widgets/text_more.dart'; import 'package:circle_app/main.dart'; import 'package:circle_app/network/dio_manager.dart'; @@ -53,6 +56,7 @@ class InfoListViewState extends State with AutomaticKeepAliveClien List lists = []; + @override void dispose() { // TODO: implement dispose @@ -92,29 +96,42 @@ class InfoListViewState extends State with AutomaticKeepAliveClien + callRefreshCicle = EventBusManager.on().listen((event) { if(widget.bean.id.toString() == event.circleId){ loadCallOutListData(); } }); - - scroToTop = EventBusManager.on().listen((event) { - if (widget.logic.state.index == widget.index) { - scrollController.animateTo( - 0.0, - duration: Duration(milliseconds: 300), - curve: Curves.easeInOut, - ); - } - - }); + // + // scroToTop = EventBusManager.on().listen((event) { + // if (widget.logic.state.index == widget.index) { + // scrollController.animateTo( + // 0.0, + // duration: Duration(milliseconds: 300), + // curve: Curves.easeInOut, + // ); + // } + // + // }); // widget.back(widget.createState()); } + loadCircleInfo() async{ + var data = await DioManager.instance.get( + url: "/up-service/interest/$circleId",); + if (data["code"] == 200) { + widget.bean = Circle.fromJson(data['data']); + if (mounted) { + setState(() { + }); + } + + } + } loadCallOutListData() async { var data = await DioManager.instance.get( @@ -143,6 +160,8 @@ class InfoListViewState extends State with AutomaticKeepAliveClien } } + + setCircleId(String id) { circleId = id; loadCallOutListData(); @@ -245,6 +264,9 @@ class InfoListViewState extends State with AutomaticKeepAliveClien @override Widget build(BuildContext context) { + if (widget.bean.image.isEmpty) { + loadCircleInfo(); + } List urlList = widget.bean.lastJoinUsers; List widgets = []; int i = 0; @@ -267,17 +289,18 @@ class InfoListViewState extends State with AutomaticKeepAliveClien borderRadius: BorderRadius.circular(10.sp), child: Container( width: Get.width, - margin: - EdgeInsets.only(left: widget.index > 0 ? 4.sp : 0, right: 4.sp), + // margin: + child: Stack( children: [ ClipRRect( borderRadius: BorderRadius.circular(10.sp), child: SizedBox( width: Get.width, + height: Get.height, child: Image.asset( getCircleImage('circle_bg'), - fit: BoxFit.fill, + fit: BoxFit.cover, ), )), Container( @@ -321,7 +344,7 @@ class InfoListViewState extends State with AutomaticKeepAliveClien margin: EdgeInsets.only(bottom: 7.sp), width: Get.width, // height: 50.sp, - child: HideText(text: widget.bean.intro,additionText: '查看更多',maxLines: 3,style: TextStyle(color: Colors.white, fontSize: 14.sp),additionStyle: TextStyle(color: const Color(0xFFFF4DF6), fontSize: 14.sp),onTap: () { + child: HideText(text: widget.bean.intro,maxWidth: Get.currentRoute == AppRoutes.Home ? Get.width - 90.sp : Get.width - 60.sp,additionText: '查看更多',maxLines: 3,style: TextStyle(color: Colors.white, fontSize: 17.sp),additionStyle: TextStyle(color: const Color(0xFFFF4DF6), fontSize: 17.sp),onTap: () { _showTextContentDialog( context, widget.bean.intro,widget.bean.title); }, @@ -333,39 +356,51 @@ class InfoListViewState extends State with AutomaticKeepAliveClien // showToast("点个鸡毛,星哥还没做"); // Get.toNamed(AppRoutes.FriendsActivity,arguments: '3'); }, - child:urlList.length==0?Container(): Row( - children: [ - Row( - children: [ - SizedBox( - height: 30.sp, - width: 30.0.sp + - 15.sp * - (widgets.length - - 1.sp), - child: Stack( - children: widgets, - ), + child:urlList.length==0?Container(): Container( + height: 30.sp, + child: Row( + children: [ + SizedBox( + height: 30.sp, + width: 30.0.sp + + 15.sp * + (widgets.length - + 1.sp), + child: Stack( + alignment: Alignment.center, + children: widgets, ), - SizedBox( - width: 8.sp, - ), - Text( - '${convertToTenThousand(widget.bean.joinTotal)}圈友加入', - style: TextStyle( - color: Colors.white, - fontSize: 12.sp), - ), - SizedBox( - width: 8.sp, - ), - // Image.asset( - // getCircleImage('play'), - // width: 20.sp, - // ) - ], - ) - ], + ), + SizedBox( + width: 4.sp, + ), + Text( + '${convertToTenThousand(widget.bean.joinTotal)}圈友加入', + style: TextStyle( + color: Colors.white, + fontSize: 12.sp), + ), + SizedBox( + width: 8.sp, + ), + // GestureDetector( + // onTap: () { + // Get.bottomSheet( + // CircleShare('','',widget.bean), isScrollControlled: true, + // enableDrag: false + // ); + // }, + // child: Container( + // height: 30.sp, + // alignment: Alignment.center, + // child: Image.asset( + // getCircleImage('play'), + // width: 20.sp, + // ), + // ), + // ) + ], + ), ), ), ], @@ -403,32 +438,39 @@ class InfoListViewState extends State with AutomaticKeepAliveClien child: Row( // mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Container( - width: 42.sp, - height: 42.sp, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8.0), - gradient: const LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [ - Color(0xFF71F3F2), - Color(0xFFF558FF), - ], - stops: [0.0365, 0.9427], - ), - ), - padding: EdgeInsets.all(1.sp), - child: ClipRRect( - borderRadius: BorderRadius.circular(8.0), - child: CachedNetworkImage( - imageUrl:widget.bean.image, - width: 40.sp, - height: 40.sp, - memCacheHeight: 40, - memCacheWidth: 40, - fit:BoxFit.cover + GestureDetector( + onTap: () { + if (widget.bean.isJoin) { + _showOutCircleDialog(Get.context!, widget.logic, widget.bean); + } + }, + child: Container( + width: 42.sp, + height: 42.sp, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.0), + gradient: const LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0xFF71F3F2), + Color(0xFFF558FF), + ], + stops: [0.0365, 0.9427], + ), ), + padding: EdgeInsets.all(1.sp), + child: widget.bean.image.isNotEmpty ? ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: CachedNetworkImage( + imageUrl:widget.bean.image, + width: 40.sp, + height: 40.sp, + memCacheHeight: 40, + memCacheWidth: 40, + fit:BoxFit.cover + ) , + ) : Container(), ), ), Expanded( @@ -473,8 +515,10 @@ class InfoListViewState extends State with AutomaticKeepAliveClien GestureDetector(//加入圈子 onTap: () async { if (widget.bean.isJoin) { - _showOutCircleDialog( - context, widget.logic, widget.bean); + Get.bottomSheet( + CircleShare('','',widget.bean), isScrollControlled: true, + enableDrag: false + ); } else { await widget.logic.outCircle( widget.bean.id.toString(), @@ -490,7 +534,7 @@ class InfoListViewState extends State with AutomaticKeepAliveClien width: 77.sp, ), Text( - !widget.bean.isJoin ? '申请加入' : '已加入', + !widget.bean.isJoin ? '申请加入' : '分享有奖', style: TextStyle( color: Colors.white, fontSize: 12.sp), ) @@ -505,6 +549,26 @@ class InfoListViewState extends State with AutomaticKeepAliveClien getCircleImage('circle_line'), width: Get.width, )), + if (Get.currentRoute == AppRoutes.Home) + Positioned( + bottom: 36.sp, + right: 10.sp, + child: GestureDetector( + onTap: () async { + List numbers = []; + numbers.add(MyConfigData( + widget.bean.id.toString(), + widget.bean.title, + false)); + var data = await Get.toNamed( + AppRoutes.Call_out, + arguments: {'numbers': numbers} + ); + }, + child: Image.asset( + getCircleImage('send_msg'), + width: 70.sp, + ))) ], ))); } @@ -588,7 +652,7 @@ class InfoListViewState extends State with AutomaticKeepAliveClien vipDynamicItem(Lists lists) { Text descText = Text( lists.content!, - style: TextStyle(color: Colors.white, fontSize: 14.sp), + style: TextStyle(color: Colors.white, fontSize: 17.sp), maxLines: 2, ); @@ -624,10 +688,11 @@ class InfoListViewState extends State with AutomaticKeepAliveClien Album info = lists.album!.first; if (info.type == 1) { + double picWidth = (Get.width - (widget.logic.runtimeType == LikeLogic ? 100.sp : 60.sp))/3; if (lists.album!.length > 3) { - picHeight = 218.sp; + picHeight = picWidth * 2; } else { - picHeight = 109.sp; + picHeight = picWidth; } } else { picHeight = 140.sp; @@ -635,7 +700,7 @@ class InfoListViewState extends State with AutomaticKeepAliveClien } } - double widgetHeight = 140.sp + contentHeight(lists.content!) + picHeight; + double widgetHeight = 130.sp + contentHeight(lists.content!) + picHeight; return Container( margin: EdgeInsets.only(top: 10.sp), @@ -657,17 +722,17 @@ class InfoListViewState extends State with AutomaticKeepAliveClien Positioned( right: 2.sp, top: 2.sp, - height: 18.sp, + child: Stack( alignment: Alignment.center, children: [ Image.asset( getCircleImage('location'), - height: 20.sp, + height: 30.sp, ), Text( lists.user!.city ?? '外星', - style: TextStyle(color: Colors.white, fontSize: 12.sp), + style: TextStyle(color: Colors.white, fontSize: 15.sp), ) ], ), @@ -849,20 +914,18 @@ class InfoListViewState extends State with AutomaticKeepAliveClien }), ), Container( - height: 34.sp, + height: 30.sp, padding: EdgeInsets.only(left: 5.sp, right: 10.sp), - margin: EdgeInsets.only(top: 5.sp), + margin: EdgeInsets.only(top: picHeight > 0 ? 5.sp : 5.sp), decoration: BoxDecoration( - borderRadius: BorderRadius.circular(17.sp), - gradient: const LinearGradient( - begin: Alignment(0.25, 0.5), - end: Alignment(0.75, 0.5), - colors: [Color(0xff261240), Color(0xff122D40)])), + borderRadius: BorderRadius.circular(15.sp), + color: Color(0x33000000) + ), child: Row( children: [ widgets.isNotEmpty ? SizedBox( - width: 24 + 12.sp * widgets.length - 12.sp, + width: 24 + 12.sp * widgets.length - 8.sp, height: 24.sp, child: Stack(children: widgets), ) @@ -875,13 +938,13 @@ class InfoListViewState extends State with AutomaticKeepAliveClien child: Text( '${lists.chat!.count!}位圈友已私聊', style: TextStyle( - color: Colors.white, fontSize: 12.sp), + color: Colors.white, fontSize: 14.sp), )) : Expanded( child: Text( '赶紧成为第一位私聊ta的圈友吧', style: TextStyle( - color: Colors.white, fontSize: 12.sp), + color: Colors.white, fontSize: 14.sp), )), GestureDetector( onTap: () { @@ -907,7 +970,7 @@ class InfoListViewState extends State with AutomaticKeepAliveClien normalDynamicItem(Lists lists) { Text descText = Text( lists.content!, - style: TextStyle(color: Colors.white, fontSize: 14.sp), + style: TextStyle(color: Colors.white, fontSize: 17.sp), // maxLines: 2, ); @@ -917,10 +980,11 @@ class InfoListViewState extends State with AutomaticKeepAliveClien Album info = lists.album!.first; if (info.type == 1) { + double picWidth = (Get.width - (widget.logic.runtimeType == LikeLogic ? 100.sp : 60.sp))/3; if (lists.album!.length > 3) { - picHeight = 218.sp; + picHeight = picWidth * 2; } else { - picHeight = 109.sp; + picHeight = picWidth; } } else { picHeight = 140.sp; @@ -952,7 +1016,7 @@ class InfoListViewState extends State with AutomaticKeepAliveClien return Container( margin: EdgeInsets.only(top: 10.sp), width: Get.width, - height: 130.sp + contentHeight(lists.content!) + picHeight, + height: 120.sp + contentHeight(lists.content!) + picHeight, decoration: BoxDecoration( image: DecorationImage( fit: BoxFit.fill, @@ -969,19 +1033,19 @@ class InfoListViewState extends State with AutomaticKeepAliveClien children: [ Image.asset( getCircleImage('location'), - height: 20.sp, + height: 30.sp, ), Text( lists.user!.city ?? '外星', - style: TextStyle(color: Colors.white, fontSize: 12.sp), + style: TextStyle(color: Colors.white, fontSize: 15.sp), ) ], ), // height: 18.sp, ), Container( - height: 130.sp + contentHeight(lists.content!) + picHeight, width: Get.width, + padding: EdgeInsets.only(left: 12.sp, right: 12.sp), child: Column( children: [ @@ -1167,20 +1231,17 @@ class InfoListViewState extends State with AutomaticKeepAliveClien })) : Container(), Container( - height: 34.sp, - padding: EdgeInsets.only(left: 5.sp, right: 10.sp), - margin: EdgeInsets.only(top: 5.sp), + height: 30.sp, + padding: EdgeInsets.only(left: 5.sp, right: 10.sp,), + margin: EdgeInsets.only(top: picHeight > 0 ? 5.sp : 10.sp), decoration: BoxDecoration( - borderRadius: BorderRadius.circular(17.sp), - gradient: const LinearGradient( - begin: Alignment(0.25, 0.5), - end: Alignment(0.75, 0.5), - colors: [Color(0xff261240), Color(0xff122D40)])), + borderRadius: BorderRadius.circular(15.sp), + color: Color(0x33000000)), child: Row( children: [ widgets.isNotEmpty ? SizedBox( - width: 24 + 12.sp * widgets.length - 12.sp, + width: 24 + 12.sp * widgets.length - 8.sp, height: 24.sp, child: Stack(children: widgets), ) @@ -1193,13 +1254,13 @@ class InfoListViewState extends State with AutomaticKeepAliveClien child: Text( '${lists.chat!.count!}位圈友已私聊', style: TextStyle( - color: Colors.white, fontSize: 12.sp), + color: Colors.white, fontSize: 14.sp), )) : Expanded( child: Text( '赶紧成为第一位私聊ta的圈友吧', style: TextStyle( - color: Colors.white, fontSize: 12.sp), + color: Colors.white, fontSize: 14.sp), )), GestureDetector( onTap: () async{ @@ -1213,15 +1274,137 @@ class InfoListViewState extends State with AutomaticKeepAliveClien )) ], ), - ) + ), + ], ), - ) + ), + // Positioned( + // bottom: 0, + // child: Container( + // width: Get.width - 26.sp, + // child: circleInfoItem(), + // )) ], )); } - circleWidget(String url, String userId,{double width = 30}) { + circleInfoItem() { + return ClipRRect( + borderRadius: BorderRadius.circular( + 10.sp), + child: Container( + padding: EdgeInsets.only(left: 12.sp, right: 12.sp), + height: 72.sp, + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.fill, + image: + AssetImage(getCircleImage('top_circle_bg')))), + child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: 42.sp, + height: 42.sp, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.0), + gradient: const LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0xFF71F3F2), + Color(0xFFF558FF), + ], + stops: [0.0365, 0.9427], + ), + ), + padding: EdgeInsets.all(1.sp), + child: ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: CachedNetworkImage( + imageUrl:widget.bean.image, + width: 40.sp, + height: 40.sp, + memCacheHeight: 40, + memCacheWidth: 40, + fit:BoxFit.cover + ), + ), + ), + Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: (){ + scrollController.animateTo( + 0.0, // Scroll to the top + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + ); + }, + child: Container( + padding: EdgeInsets.only(left: 8.sp, top: 12.sp), + // alignment: Alignment., + height: 72.sp, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.bean.title, + style: TextStyle( + color: Colors.white, + fontSize: 18.sp, + fontWeight: FontWeight.w600), + ), + SizedBox( + height: 4.sp, + ), + Text( + '${convertToTenThousand(widget.bean.viewTotal)}人看过', + textAlign: TextAlign.left, + style: TextStyle( + color: const Color(0xff03FEFB), + fontSize: 12.sp, + ), + ), + ], + ), + ), + )), + GestureDetector(//加入圈子 + onTap: () async { + if (widget.bean.isJoin) { + Get.bottomSheet( + CircleShare('','',widget.bean), isScrollControlled: true, + enableDrag: false + ); + } else { + await widget.logic.outCircle( + widget.bean.id.toString(), + widget.bean.isJoin); + widget.logic.update(); + } + }, + child: Stack( + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('add'), + width: 77.sp, + ), + Text( + !widget.bean.isJoin ? '申请加入' : '分享有奖', + style: TextStyle( + color: Colors.white, fontSize: 12.sp), + ) + ], + )) + ], + ), + )); + } + + circleWidget(String url, String userId,{double width = 24}) { return GestureDetector( onTap: (){ Get.toNamed(AppRoutes.UserInfoActivity, arguments: userId); @@ -1345,7 +1528,7 @@ class InfoListViewState extends State with AutomaticKeepAliveClien Navigator.pop(context); await widget.logic .outCircle(bean.id.toString(), bean.isJoin); - widget.logic.update(); + // widget.logic.update(); }, child: Container( margin: EdgeInsets.only(top: 24.sp), @@ -1389,7 +1572,7 @@ class InfoListViewState extends State with AutomaticKeepAliveClien double contentHeight(String content) { return calculateTextHeight( - content, 14.sp, FontWeight.w300, Get.width - 64.sp, 100); + content, 17.sp, FontWeight.w300, Get.currentRoute == AppRoutes.Home ? Get.width - 90.sp : Get.width - 64.sp, 100); } void refreshCircleData() async { @@ -1400,10 +1583,10 @@ class InfoListViewState extends State with AutomaticKeepAliveClien .get(url: 'up-service/interest/${widget.bean.id}'); if (data['code'] == 200) { widget.bean = Circle.fromJson(data['data']); - widget.logic.updateCircleInfo(widget.bean); - setState(() { - - }); + // widget.logic.updateCircleInfo(widget.bean); + // setState(() { + // + // }); // final logic = Get.put(CircleLogic()); // logic.update(); diff --git a/circle_app/lib/app/circle/widgets/like_view.dart b/circle_app/lib/app/circle/widgets/like_view.dart new file mode 100644 index 0000000..03f79f9 --- /dev/null +++ b/circle_app/lib/app/circle/widgets/like_view.dart @@ -0,0 +1,1409 @@ +import 'dart:async'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:circle_app/app/circle/logic.dart'; +import 'package:circle_app/app/circle/state.dart'; +import 'package:circle_app/app/circle/widgets/video_item.dart'; +import 'package:circle_app/app/home/logic.dart'; +import 'package:circle_app/common/Widgets/circle_share.dart'; +import 'package:circle_app/common/Widgets/text_more.dart'; +import 'package:circle_app/main.dart'; +import 'package:circle_app/network/dio_manager.dart'; +import 'package:circle_app/router/app_routers.dart'; +import 'package:circle_app/util/SharedPreferencesHelper.dart'; +import 'package:circle_app/util/eventBus.dart'; +import 'package:circle_app/util/util.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class LikeView extends StatefulWidget { + + @override + _LikeViewState createState() => _LikeViewState(); + +} + +class _LikeViewState extends State with AutomaticKeepAliveClientMixin { + @override + bool get wantKeepAlive => true; + final ScrollController scrollController = ScrollController(); + + + // ListLogic? listsLg; + + int callOutPage = 1; + int recomandPage = 1; + + bool isLoad = true; + bool likeMore = true; + bool recomandMore = true; + var circleId = ''; + List lists = []; + List recomanddlists = []; + + @override + void dispose() { + // TODO: implement dispose + + if(null!=scroToTop){ + EventBusManager.cancelSubscription(scroToTop!); + + } + scrollController.dispose(); + super.dispose(); + + + } + + StreamSubscription? callRefreshCicle =null; + StreamSubscription? scroToTop =null; + + @override + void initState() { + // TODO: implement initState + super.initState(); + scrollController.addListener(() { + try { + if (scrollController.position.pixels == + scrollController.position.maxScrollExtent) { + loadMore(); + } + } catch (_) {} + }); + loadLikeListData(); + + + + scroToTop = EventBusManager.on().listen((event) { + // if (widget.logic.state.index == widget.index) { + scrollController.animateTo( + 0.0, + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + ); + // } + + }); + + // widget.back(widget.createState()); + } + + + + + loadLikeListData() async { + if (likeMore) { + var data = await DioManager.instance.get( + url: "/up-service/follow/callouts", + params: {"page": callOutPage, "page_size": "20"}); + if (data["code"] == 200) { + List dataList = data["data"]["lists"] ?? []; + if (callOutPage == 1) { + lists.clear(); + } + if (dataList.isNotEmpty) { + likeMore = true; + for (var element in dataList) { + lists.add(Lists.fromJson(element)); + } + callOutPage++; + } + likeMore = dataList.length == 20; + if (!likeMore) { + loadRecomdistData(); + } + if (mounted) { + setState(() {}); + } + } else { + showOKToast(data["msg"]); + } + } else { + loadRecomdistData(); + } + } + + loadRecomdistData() async { + var data = await DioManager.instance.get( + url: "/up-service/recommend/callouts", + params: {"page": recomandPage, "page_size": "20"}); + if (data["code"] == 200) { + List dataList = data["data"]["lists"] ?? []; + if (recomandPage == 1) { + if (recomanddlists.isNotEmpty) { + recomanddlists.clear(); + } + } + if (dataList.isNotEmpty) { + recomandMore = true; + for (var element in dataList) { + recomanddlists.add(Lists.fromJson(element)); + } + recomandPage++; + } + recomandMore = dataList.length == 20; + if (mounted) { + setState(() {}); + } + } else { + showOKToast(data["msg"]); + } + } + + setCircleId(String id) { + circleId = id; + loadLikeListData(); + } + + void refreshData() { + callOutPage = 1; + likeMore = true; + loadLikeListData(); + } + + void loadMore() { + if (recomandMore == false) return; + loadLikeListData(); + } + + void pushOtherPeopleHomePage(String userId) { + Get.toNamed(AppRoutes.UserInfoActivity, arguments: userId); + + // if (bean.isQueen) { + // showJoinCiclePiker(cicleId); + // } else { + //跳转消息页面 + // Get.bottomSheet(Open_vip_tipPage(), + // isScrollControlled: true, + // enableDrag: false, + // ); + // } + } + + void pushHomePage(var bean, String cicleId) async { + // SharedPreferencesHelper.getInstance().then((sharedPreferences) { + // int userId = sharedPreferences.getInt(SharedPreferencesHelper.USERID); + // if (bean.user!.id == userId) { + // Get.toNamed(AppRoutes.UserInfoActivity); + // } else { + Get.toNamed(AppRoutes.UserInfoActivity, + arguments: bean.user!.id!.toString()); + // } + // }); + + + + + + // if (bean.isQueen) { + // showJoinCiclePiker(cicleId); + // } else { + //跳转消息页面 + // Get.bottomSheet(Open_vip_tipPage(), + // isScrollControlled: true, + // enableDrag: false, + // ); + // } + } + + void pushMsgPage(var bean, String cicleId) async { + + // if (widget.bean.is_limit&&widget.bean.amount>0) { + // showJoinCiclePiker(cicleId,widget.bean.amount.toString(),widget.bean.oldAmount.toString(),2,(payResult){ + // widget.bean.is_limit = false; + // if (Get.isRegistered()) { + // var logic = Get.find(); + // for (var element in logic.circle.lists) { + // if (element.id == widget.bean.id) { + // element.is_limit = false; + // element.isJoin = true; + // } + // } + // logic.update(); + // } + // Get.back(); + // },widget.bean.ios_item); + // return; + // } + + var sp = await SharedPreferencesHelper.getInstance(); + String myUserId = sp.getMyUserId(); + if (bean.user!.id.toString() == myUserId) { + showOKToast('无法与自己私聊'); + return; + } + // if () + + var data = await DioManager.instance.get( + url: "/up-service/callout/${bean.id}/chat",); + if (data["code"] == 200) { + pushChatPage(data['data']['account_id'].toString().split("_").last,data['data']['account_id'], bean.user!.nickname!); + + await Future.delayed(Duration(seconds: 1)); + SharedPreferences sharedPreferences =await SharedPreferences.getInstance(); + // SharedPreferencesHelper.getInstance().then((sharedPreferences) { + int userId = sharedPreferences.getInt(SharedPreferencesHelper.USERID)??0; + String avatar = sharedPreferences.getString(SharedPreferencesHelper.AVATAR)??""; + String name = sharedPreferences.getString(SharedPreferencesHelper.NAME)??""; + // bean.chat!.users!.add(Users(avatar: avatar,id: userId,nickname: name)); + // widget.logic.update(); + } + } + + @override + Widget build(BuildContext context) { + List urlList = []; + List widgets = []; + int i = 0; + // print(urlList); + if(null!=urlList){ + urlList.forEach((element) { + if(widgets.length>2){ + return; + } + widgets.add(Positioned( + left: 15.sp * i, + child: circleWidget(element.avatar! ?? "https://qiniuyun.leyuan666.com/quanzi/avatar/default.png",element.id.toString()), + )); + i++; + }); + } + + + return ClipRRect( + borderRadius: BorderRadius.circular(10.sp), + child: Container( + width: Get.width, + padding: EdgeInsets.only(left: 10.sp,right: 10.sp), + // margin: + // EdgeInsets.only(left: widget.index > 0 ? 4.sp : 0, right: 4.sp), + child: + RefreshIndicator( + onRefresh: () async { + refreshData(); + // refreshCircleData(); + }, + child: + ListView.builder( + physics: const AlwaysScrollableScrollPhysics(), + addAutomaticKeepAlives:false, + addRepaintBoundaries:false, + scrollDirection: Axis.vertical, + controller: scrollController, + itemCount: likeMore ? lists.length + 1 : lists.length + 1 + recomanddlists.length, + itemBuilder: (context, index) { + if (lists.length > index) { + var list = lists[index]; + if (list.isQueen!) { + return vipDynamicItem(list); + } else { + return normalDynamicItem(list); + } + } else if (!likeMore && lists.length == index) { + return tipItem(); + } else if (index - lists.length < recomanddlists.length) { + var list = recomanddlists[index - lists.length]; + if (list.isQueen!) { + return vipDynamicItem(list); + } else { + return normalDynamicItem(list); + } + } else { + return Container( + margin: EdgeInsets.only( + top: likeMore ? 0 : 10.sp), + child: likeMore ? loaddingWidget(likeMore) : GestureDetector( + onTap: () { + + var homeLogic = Get.find(); + homeLogic.tabController.animateTo(1, duration: Duration(milliseconds: 0), curve: Curves.ease); + homeLogic.updateIndex(1); + }, + child: Container( + margin: EdgeInsets.only(bottom: 10.sp), + child: Stack( + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('add'), + width: 180.sp, + ), + Text( + '查看更多圈子', + style: TextStyle( + color: Colors.white, fontSize: 18.sp), + ) + ], + ), + ), + )); + } + }), + ), + + )); + } + + void _showTextContentDialog(BuildContext context, String msg,String title) { + showDialog( + context: context, + builder: (BuildContext context) { + return Dialog( + backgroundColor: Colors.transparent, + child: Container( + height: 300.sp, + padding: const EdgeInsets.all(1.0), + child: Stack( + children: [ + + Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(10.0), + gradient: const LinearGradient( + colors: [Color(0xFFDD3DF4), Color(0xFF30FFD9)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ), + Container( + margin: EdgeInsets.all(1.sp), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(10.0), + gradient: const LinearGradient( + colors: [Color(0xFF4C3E5F), Color(0xFF324140)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ), + Positioned( + top: 15, + left: 0, + right: 0, + child: Center(child: Text(title, style: TextStyle( + color: const Color(0xFFF7FAFA), fontSize: 16.sp)),)), + Container( + margin: EdgeInsets.only(top: 24.sp,bottom: 24.sp), + child: Container( + margin: EdgeInsets.only( + top: 12.sp, left: 14.sp, right: 14.sp), + alignment: Alignment.center, + child: SingleChildScrollView(child: Text( + msg, + textAlign: TextAlign.center, + style: TextStyle( + color: const Color(0xCCF7FAFA), fontSize: 16.sp), + ),), + ), + ), + Positioned( + top:8.sp, + right: 10.sp, + child: GestureDetector( + onTap: () { + Get.back(); + }, + child: Icon( + Icons.close,color: Colors.white, + size: 20.sp, + ), + )), + ], + ), + ), + ); + }, + ); + } + + ///至尊喊话 + vipDynamicItem(Lists lists) { + Text descText = Text( + lists.content!, + style: TextStyle(color: Colors.white, fontSize: 17.sp), + maxLines: 2, + ); + + // List urlList = bean.lastJoinUsers; + List widgets = []; + int index = 0; + for (var element in lists.chat!.users!) { + widgets.add(Positioned( + left: 12.sp * index, + child: GestureDetector( + onTap: () { + // pushOtherPeopleHomePage(element.id.toString()); + }, + child: circleWidget(element.avatar!,element.id.toString(), width: 24), + ), + )); + index++; + } + if (widgets.isNotEmpty) { + widgets.add(Positioned( + left: 12.sp * lists.chat!.users!.length, + child: Image.asset( + getCircleImage('more'), + width: 24.sp, + ))); + } + + double picHeight = 0.0; + + + if (lists.album != null) { + if (lists.album!.isNotEmpty) { + Album info = lists.album!.first; + + if (info.type == 1) { + double picWidth = (Get.width - 20.sp)/3; + if (lists.album!.length > 3) { + picHeight = picWidth * 2; + } else { + picHeight = picWidth; + } + } else { + picHeight = 140.sp; + } + } + } + + double widgetHeight = 130.sp + contentHeight(lists.content!) + picHeight + 76.sp; + + return GestureDetector( + onTap: () async { + var sp = await SharedPreferencesHelper.getInstance(); + String myUserId = sp.getMyUserId(); + + if(lists.user?.id!.toString() == myUserId){ + Get.toNamed(AppRoutes.UserInfoActivity); + return; + } + pushHomePage(lists, lists.id.toString()); + }, + child: Container( + margin: EdgeInsets.only(top: 10.sp), + width: Get.width, + height: widgetHeight, + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.fill, + image: AssetImage( + getCircleImage('pic_bg'), + ))), + child: Stack(children: + + [ + + Positioned( + left: 0, + top: 2.sp, + height: 18.sp, + child: Image.asset(getCircleImage('vip_say')), + ), + Positioned( + right: 2.sp, + top: 2.sp, + + child: Stack( + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('location'), + height: 30.sp, + ), + Text( + lists.user!.city ?? '外星', + style: TextStyle(color: Colors.white, fontSize: 15.sp), + ) + ], + ), + ), + Container( + height: widgetHeight, + width: Get.width, + padding: EdgeInsets.only(top: 12.sp, left: 12.sp, right: 12.sp), + child: Column( + children: [ + SizedBox( + height: 72.sp, + child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Stack( + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('avatar_bg'), + width: 42.sp, + ), + ClipOval( + child: CachedNetworkImage( + imageUrl:lists.user!.avatar_thumb!, + width: 40.sp, + height: 40.sp, + fit: BoxFit.cover, + ), + ) + ], + ), + Expanded( + child: Container( + padding: EdgeInsets.only(left: 8.sp, top: 12.sp), + alignment: Alignment.centerLeft, + height: 72.sp, + child: Column( + children: [ + Row( + children: [ + Text( + lists.user!.nickname!, + style: TextStyle( + color: Colors.white, + fontSize: 18.sp, + fontWeight: FontWeight.w600), + ), + SizedBox( + width: 8.sp, + ), + lists.user?.vip != null && lists.user!.vip == 0 + ? Container() + : Image.asset( + getCircleImage(lists.user!.vip == 1 ? 'vip' : 'year_vip'), + width: 36.sp, + ) + ], + ), + SizedBox( + height: 4.sp, + ), + Row( + children: [ + Container( + 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(lists.user!.gender??0, lists.user!.age??0, + lists.user!.role??0, lists.user!.orientation??0), + // '${genderList[lists.user!.gender!]}.${lists.user!.age}.${roleList[lists.user!.role!]}.${orientationList[lists.user!.orientation!]}', + style: TextStyle( + color: Colors.black, + fontSize: 12.sp, + ), + ), + ) + ], + ), + ], + ), + )), + ], + ), + ), + Container( + alignment: Alignment.topLeft, + // margin: EdgeInsets.only(top: 4.sp), + child: descText, + ), + Container( + height: picHeight, + margin: EdgeInsets.only(top: 5.sp), + child: picHeight == 140.sp + ? ClipRRect( + borderRadius: BorderRadius.circular(6.sp), + child: VideoItemWidget(lists.album![0].url!)) + : GridView.builder( + itemCount: lists.album!.length, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, //横轴三个子widget + crossAxisSpacing: 8.sp, + mainAxisSpacing: 8.sp, + childAspectRatio: 1.0 //宽高比为1时,子widget + ), + itemBuilder: (contentxt, currentIndex) { + Album album = lists.album![currentIndex]; + return GestureDetector( + onTap: () { + var imgList = []; + for (var element in lists.album!) { + imgList.add(element.url!); + } + Get.toNamed(AppRoutes.Swiper, arguments: { + 'imaglist': imgList, + 'index': currentIndex + }); + }, + child: ClipRRect( + borderRadius: BorderRadius.circular(6.sp), + child: CachedNetworkImage( + imageUrl: album.url!, + // placeholder: (context, url) => + // SizedBox( + // width: 30.sp, + // height: 30.sp, + // child: CircularProgressIndicator( + // color: Color(0xFF07FAFB), + // strokeWidth: 2.sp, + // ), + // ), + errorWidget: (context, url, error) => + const Icon(Icons.error), + fit: BoxFit.cover, + ), + ), + ); + }), + ), + Container( + height: 30.sp, + padding: EdgeInsets.only(left: 5.sp, right: 10.sp), + margin: EdgeInsets.only(top: picHeight == 0 ? 15.sp : 5.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15.sp), + color: Color(0x33000000) + ), + child: Row( + children: [ + widgets.isNotEmpty + ? SizedBox( + width: 24 + 12.sp * widgets.length - 8.sp, + height: 24.sp, + child: Stack(children: widgets), + ) + : Container(), + SizedBox( + width: 4.sp, + ), + widgets.isNotEmpty + ? Expanded( + child: Text( + '${lists.chat!.count!}位圈友已私聊', + style: TextStyle( + color: Colors.white, fontSize: 14.sp), + )) + : Expanded( + child: Text( + '赶紧成为第一位私聊ta的圈友吧', + style: TextStyle( + color: Colors.white, fontSize: 14.sp), + )), + GestureDetector( + onTap: () { + pushMsgPage(lists, lists.interest!['id'].toString(),); + // pushHomePage( + // lists, widget.bean.id.toString()); + }, + child: Image.asset( + getCircleImage('chat'), + width: 60.sp, + ), + ) + ], + ), + ) + ], + ), + ), + Positioned( + bottom: 2.sp, + left: 2.sp, + child: Container( + width: Get.width - 4.sp - 20.sp, + child: circleInfoItem(lists.interest,lists,index), + )) + ])), + ); + } + + ///普通图文喊话 + normalDynamicItem(Lists lists) { + Text descText = Text( + lists.content!, + style: TextStyle(color: Colors.white, fontSize: 17.sp), + // maxLines: 2, + ); + + double picHeight = 0.0; + if (lists.album != null) { + if (lists.album!.isNotEmpty) { + Album info = lists.album!.first; + + if (info.type == 1) { + double picWidth = (Get.width - 20.sp)/3; + if (lists.album!.length > 3) { + picHeight = picWidth * 2; + } else { + picHeight = picWidth; + } + } else { + picHeight = 140.sp; + } + } + } + + List widgets = []; + int index = 0; + lists.chat!.users!.forEach((element) { + widgets.add(Positioned( + left: 12.sp * index, + child: GestureDetector( + onTap: () { + }, + child: circleWidget(element.avatar!,element.id.toString(), width: 24), + ), + )); + index++; + }); + if (widgets.isNotEmpty) { + widgets.add(Positioned( + left: 12.sp * lists.chat!.users!.length, + child: Image.asset( + getCircleImage('more'), + width: 24.sp, + ))); + } + return GestureDetector( + onTap: () async { + var sp = await SharedPreferencesHelper.getInstance(); + String myUserId = sp.getMyUserId(); + if(lists.user?.id!.toString() == myUserId){ + Get.toNamed(AppRoutes.UserInfoActivity); + return; + } + pushHomePage(lists, lists.id.toString()); + }, + child: Container( + margin: EdgeInsets.only(top: 10.sp), + width: Get.width, + height: 120.sp + contentHeight(lists.content!) + picHeight + 76.sp, + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.fill, + image: AssetImage( + getCircleImage('normal_bg'), + ))), + child: Stack( + children: [ + Positioned( + right: 2.sp, + top: 2.sp, + child: Stack( + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('location'), + height: 30.sp, + ), + Text( + lists.user!.city ?? '外星', + style: TextStyle(color: Colors.white, fontSize: 15.sp), + ) + ], + ), + // height: 18.sp, + ), + Container( + width: Get.width, + + padding: EdgeInsets.only(left: 12.sp, right: 12.sp), + child: Column( + children: [ + SizedBox( + height: 72.sp, + child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Stack( + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('avatar_bg'), + width: 42.sp, + ), + ClipOval( + child: CachedNetworkImage( + imageUrl:lists.user!.avatar_thumb!, + width: 40.sp, + height: 40.sp, + fit: BoxFit.cover, + memCacheHeight: 40, + memCacheWidth: 40, + ), + ) + ], + ), + Expanded( + child: Container( + padding: EdgeInsets.only(left: 8.sp, top: 12.sp), + alignment: Alignment.centerLeft, + height: 72.sp, + child: Column( + children: [ + Row( + children: [ + Text( + lists.user!.nickname!, + style: TextStyle( + color: Colors.white, + fontSize: 18.sp, + fontWeight: FontWeight.w600), + ), + SizedBox( + width: 8.sp, + ), + lists.user?.vip != null && lists.user!.vip == 0 + ? Container() + : Image.asset( + getCircleImage(lists.user!.vip == 1 ? 'vip' : 'year_vip'), + width: 36.sp, + ) + ], + ), + SizedBox( + height: 4.sp, + ), + Row( + children: [ + Container( + 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(lists.user!.gender??0, lists.user!.age??0, + lists.user!.role??0, lists.user!.orientation??0), + style: TextStyle( + color: Colors.black, + fontSize: 12.sp, + ), + ), + ) + ], + ), + ], + ), + )), + ], + ), + ), + Container( + alignment: Alignment.topLeft, + // margin: EdgeInsets.only(top: 4.sp), + child: descText, + ), + picHeight > 0 + ? Container( + height: picHeight, + alignment: Alignment.centerLeft, + margin: EdgeInsets.only(top: 5.sp), + child: picHeight == 140.sp + ? ClipRRect( + borderRadius: BorderRadius.circular(6.sp), + child: VideoItemWidget(lists.album![0].url!)) + : GridView.builder( + itemCount: lists.album!.length, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, //横轴三个子widget + crossAxisSpacing: 8.sp, + mainAxisSpacing: 8.sp, + childAspectRatio: 1.0 //宽高比为1时,子widget + ), + itemBuilder: (contentxt, currentIndex) { + Album album = lists.album![currentIndex]; + if (album.type == 2) { + return ClipRRect( + borderRadius: + BorderRadius.circular(6.sp), + child: VideoItemWidget(album.url!)); + } + return GestureDetector( + onTap: () { + var imgList = []; + for (var element in lists.album!) { + imgList.add(element.url!); + } + Get.toNamed(AppRoutes.Swiper, + arguments: { + 'imaglist': imgList, + 'index': currentIndex + }); + }, + child: ClipRRect( + borderRadius: + BorderRadius.circular(6.sp), + child: CachedNetworkImage( + imageUrl: album.url!, + // placeholder: (context, url) => + // SizedBox( + // width: 30.sp, + // height: 30.sp, + // child: CircularProgressIndicator( + // color: Color(0xFF07FAFB), + // strokeWidth: 2.sp, + // ), + // ), + errorWidget: (context, url, error) => + const Icon(Icons.error), + fit: BoxFit.cover, + ), + ), + ); + })) + : Container(), + Container( + height: 30.sp, + padding: EdgeInsets.only(left: 5.sp, right: 10.sp,), + margin: EdgeInsets.only(top: picHeight == 0 ? 15.sp : 5.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15.sp), + color: Color(0x33000000)), + child: Row( + children: [ + widgets.isNotEmpty + ? SizedBox( + width: 24 + 12.sp * widgets.length - 8.sp, + height: 24.sp, + child: Stack(children: widgets), + ) + : Container(), + SizedBox( + width: 4.sp, + ), + widgets.isNotEmpty + ? Expanded( + child: Text( + '${lists.chat!.count!}位圈友已私聊', + style: TextStyle( + color: Colors.white, fontSize: 14.sp), + )) + : Expanded( + child: Text( + '赶紧成为第一位私聊ta的圈友吧', + style: TextStyle( + color: Colors.white, fontSize: 14.sp), + )), + GestureDetector( + onTap: () async{ + pushMsgPage(lists, lists.interest!['id'].toString()); + + // }); + }, + child: Image.asset( + getCircleImage('chat'), + width: 60.sp, + )) + ], + ), + ), + + ], + ), + ), + Positioned( + left: 2.sp, + bottom: 2.sp, + child: Container( + width: Get.width - 4.sp - 20.sp, + child: circleInfoItem(lists.interest,lists,index), + )) + ], + )), + ); + } + + tipItem() { + bool showTitle = lists.isEmpty; + return Container( + margin: EdgeInsets.only(top: showTitle ? 20.sp : 0, bottom: 0.sp), + // height: 30.sp, + child: Column( + children: [ + if (showTitle) + Container( + margin: EdgeInsets.only(bottom: 8.sp), + child: Image.asset( + getBaseImage('no_result'), + width: 200.sp, + ), + ), + if (showTitle) + Text('还没有您喜欢的圈友发布喊话哦~',style: TextStyle(color: Colors.white,fontSize: 16.sp),), + Container( + margin: EdgeInsets.only(top: 20.sp), + padding: EdgeInsets.only(left: 30.sp,right: 30.sp), + child: Row( + children: [ + Expanded(child: Container(height: 2.sp,color: Colors.white.withOpacity(0.5),)), + Container( + margin: EdgeInsets.only(left: 8.sp,right: 8.sp), + height: 2.sp, + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.5), + borderRadius: BorderRadius.circular(1.sp) + ), + ), + Text('喊话推荐',style: TextStyle(color: Colors.white,fontSize: 17.sp),), + Container( + margin: EdgeInsets.only(left: 8.sp,right: 8.sp), + height: 2.sp, + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.5), + borderRadius: BorderRadius.circular(1.sp) + ), + ), + + Expanded(child: Container(height: 2.sp,color: Colors.white.withOpacity(0.5),)), + ], + ), + ) + ], + ), + ); + } + + circleInfoItem(var bean,Lists list,int index) { + return GestureDetector( + onTap: () { + Get.toNamed(AppRoutes.Signal_circle_list, + arguments: bean['id'].toString()); + }, + child: ClipRRect( + borderRadius: BorderRadius.circular( + 12.sp), + child: Container( + padding: EdgeInsets.only(left: 12.sp, right: 12.sp), + height: 72.sp, + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.fill, + image: + AssetImage(getCircleImage('top_circle_bg')))), + child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: 42.sp, + height: 42.sp, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.0), + gradient: const LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0xFF71F3F2), + Color(0xFFF558FF), + ], + stops: [0.0365, 0.9427], + ), + ), + padding: EdgeInsets.all(1.sp), + child: ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: CachedNetworkImage( + imageUrl:bean['image'], + width: 40.sp, + height: 40.sp, + memCacheHeight: 40, + memCacheWidth: 40, + fit:BoxFit.cover + ), + ), + ), + Expanded( + child: Container( + padding: EdgeInsets.only(left: 8.sp, top: 12.sp), + // alignment: Alignment., + height: 72.sp, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + bean['title'], + style: TextStyle( + color: Colors.white, + fontSize: 18.sp, + fontWeight: FontWeight.w600), + ), + SizedBox( + height: 4.sp, + ), + Text( + // "view_total" -> 21 + '${convertToTenThousand(bean['view_total'])}人看过', + textAlign: TextAlign.left, + style: TextStyle( + color: const Color(0xff03FEFB), + fontSize: 12.sp, + ), + ), + ], + ), + )), + GestureDetector(//加入圈子 + onTap: () async { + CircleLogic cLogic = Get.find(); + if (bean['is_join']) { + var data = await DioManager.instance.get( + url: "/up-service/interest/${bean['id']}",); + if (data["code"] == 200) { + Circle info = Circle.fromJson(data['data']); + Get.bottomSheet( + CircleShare('','',info), isScrollControlled: true, + enableDrag: false + ); + } + } else { + await cLogic.outCircle( + bean['id'].toString(), + bean['is_join']); + bean['is_join'] = !bean['is_join']; + list.interest = bean; + lists[index] = list; + setState(() { + + }); + } + }, + child: Stack( + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('add'), + width: 77.sp, + ), + Text( + !bean['is_join'] ? '申请加入' : '分享有奖', + style: TextStyle( + color: Colors.white, fontSize: 12.sp), + ) + ], + )) + ], + ), + )), + ); + } + + circleWidget(String url, String userId,{double width = 24}) { + return GestureDetector( + onTap: (){ + Get.toNamed(AppRoutes.UserInfoActivity, arguments: userId); + }, + child: Stack( + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('avatar_bg'), + width: width.sp, + ), + ClipOval( + child: CachedNetworkImage( + imageUrl:url??"https://qiniuyun.leyuan666.com/quanzi/avatar/default.png", + width: (width - 1).sp, + height: (width - 1).sp, + fit: BoxFit.cover, + memCacheHeight: width.toInt() - 1, + memCacheWidth: width.toInt() - 1, + ), + ) + ], + )); + } + + void _showOutCircleDialog( + BuildContext context, var controller, var bean) { + showDialog( + context: context, + builder: (BuildContext context) { + return Dialog( + backgroundColor: Colors.transparent, + child: Container( + height: 160.sp, + padding: const EdgeInsets.all(1.0), + child: Stack( + children: [ + Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(10.0), + gradient: const LinearGradient( + colors: [Color(0xFFDD3DF4), Color(0xFF30FFD9)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ), + Container( + margin: EdgeInsets.all(1.sp), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(10.0), + gradient: const LinearGradient( + colors: [Color(0xFF4C3E5F), Color(0xFF324140)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ), + Container( + margin: EdgeInsets.only(top: 24.sp), + child: Column( + children: [ + Center( + child: Text( + "提示", + style: + TextStyle(color: Colors.white, fontSize: 16.sp), + ), + ), + Container( + margin: EdgeInsets.only( + top: 12.sp, left: 14.sp, right: 14.sp), + alignment: Alignment.center, + child: Text( + "是否确认退出该圈子。", + textAlign: TextAlign.center, + style: TextStyle( + color: const Color(0xCCF7FAFA), fontSize: 16.sp), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + Navigator.pop(context); + }, + child: Container( + margin: EdgeInsets.only(top: 30.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + gradient: const LinearGradient( + colors: [ + Color(0x26FFFFFF), + Color(0x26FFFFFF), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + padding: EdgeInsets.only( + top: 10.sp, + bottom: 10.sp, + left: 52.sp, + right: 52.sp), + child: Text( + "否", + style: TextStyle( + color: Colors.white, + fontSize: 12.sp, + ), + ), + ), + ), + SizedBox(width: 24.sp), + GestureDetector( + onTap: () async { + Navigator.pop(context); + await controller + .outCircle(bean['id'].toString(), bean['is_join']); + + }, + child: Container( + margin: EdgeInsets.only(top: 24.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + gradient: const LinearGradient( + colors: [ + Color(0xFF06F9FA), + Color(0xFFDC5BFD), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + padding: EdgeInsets.only( + top: 10.sp, + bottom: 10.sp, + left: 52.sp, + right: 52.sp), + child: Text( + "是", + style: TextStyle( + color: Colors.white, + fontSize: 12.sp, + ), + ), + ), + ) + ], + ) + ], + ), + ) + ], + ), + ), + ); + }, + ); + } + + double contentHeight(String content) { + return calculateTextHeight( + content, 17.sp, FontWeight.w300, Get.width - 64.sp, 100); + } + + void refreshCircleData() async { + var routePath = Get.currentRoute; + if (routePath == AppRoutes.Signal_circle_list) return; + + // var data = await DioManager.instance + // .get(url: 'up-service/interest/${widget.bean.id}'); + // if (data['code'] == 200) { + // widget.bean = Circle.fromJson(data['data']); + // widget.logic.updateCircleInfo(widget.bean); + // setState(() { + // + // }); + // // final logic = Get.put(CircleLogic()); + // // logic.update(); + // + // }else if(data['code'] == 404){ + // var logic = Get.put(CircleLogic()); + // logic.circle.lists.removeAt(logic.state.index); + // logic.update(); + // } + } +} \ No newline at end of file diff --git a/circle_app/lib/app/circle/widgets/vicinity.dart b/circle_app/lib/app/circle/widgets/vicinity.dart index ea4c7d2..1f73826 100644 --- a/circle_app/lib/app/circle/widgets/vicinity.dart +++ b/circle_app/lib/app/circle/widgets/vicinity.dart @@ -248,7 +248,7 @@ class _VicinityState extends State with AutomaticKeepAliveClientMixin margin: EdgeInsets.only(top: 10.sp), // padding: EdgeInsets.only( left: 8.sp, right: 8.sp), width: Get.width, - height: 200.sp, + height: 210.sp, decoration: BoxDecoration( image: DecorationImage( fit: BoxFit.fill, @@ -264,14 +264,12 @@ class _VicinityState extends State with AutomaticKeepAliveClientMixin topLeft: Radius.circular(10.sp), topRight: Radius.circular(10.sp), ), - child: item.images.length == 0 - ? Image( + child: Image( image: AssetImage(getCircleImage("icon_list_null")), width: Get.width, fit: BoxFit.fill, height: 92.sp, ) - : Container(), ), ), Column(children: [ @@ -355,7 +353,7 @@ class _VicinityState extends State with AutomaticKeepAliveClientMixin ), ), Container( - height: 38.sp, // 设置固定高度 + height: 55.sp, // 设置固定高度 width: Get.width, margin: EdgeInsets.symmetric(horizontal: 8.0), child: Align( @@ -363,7 +361,7 @@ class _VicinityState extends State with AutomaticKeepAliveClientMixin child: Text( item.signature, maxLines: 2, - style: TextStyle(color: Colors.white, fontSize: 14.sp), + style: TextStyle(color: Colors.white, fontSize: 18.sp), overflow: TextOverflow.ellipsis, ), ), diff --git a/circle_app/lib/app/dialog/UnlockCallDialog.dart b/circle_app/lib/app/dialog/UnlockCallDialog.dart index e555c60..7f1d72a 100644 --- a/circle_app/lib/app/dialog/UnlockCallDialog.dart +++ b/circle_app/lib/app/dialog/UnlockCallDialog.dart @@ -203,7 +203,7 @@ class UnlockCallDialog extends GetxController { child: Row( children: [ Text( - '¥$amount', + '¥${int.parse(amount)}', style: TextStyle( color: Color(0xffE845FF), fontSize: 16.sp, @@ -213,7 +213,7 @@ class UnlockCallDialog extends GetxController { width: 2.sp, ), Text( - '(原价$oldAmount)', + '(原价${int.parse(oldAmount)})', style: TextStyle( color: Colors.white70, fontSize: 16.sp, diff --git a/circle_app/lib/app/dialog/UpdateDialog.dart b/circle_app/lib/app/dialog/UpdateDialog.dart index ecd9b01..0d6f247 100644 --- a/circle_app/lib/app/dialog/UpdateDialog.dart +++ b/circle_app/lib/app/dialog/UpdateDialog.dart @@ -2,7 +2,7 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_install_app/flutter_install_app.dart'; +// import 'package:flutter_install_app/flutter_install_app.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -260,7 +260,7 @@ class _CustomDialogState extends State { // SmartDialog.dismiss(); print(error); }); - await AppInstaller.installApk(filePath, actionRequired: false); + // await AppInstaller.installApk(filePath, actionRequired: false); } } diff --git a/circle_app/lib/app/home/binding.dart b/circle_app/lib/app/home/binding.dart index 80dd392..b476cb9 100644 --- a/circle_app/lib/app/home/binding.dart +++ b/circle_app/lib/app/home/binding.dart @@ -1,3 +1,4 @@ +import 'package:circle_app/app/circle/logic.dart'; import 'package:get/get.dart'; import 'logic.dart'; @@ -6,5 +7,6 @@ class HomeBinding extends Bindings { @override void dependencies() { Get.lazyPut(() => HomeLogic()); + Get.lazyPut(() => CircleLogic()); } } diff --git a/circle_app/lib/app/home/logic.dart b/circle_app/lib/app/home/logic.dart index 513fa23..f4f9aa6 100644 --- a/circle_app/lib/app/home/logic.dart +++ b/circle_app/lib/app/home/logic.dart @@ -4,6 +4,7 @@ import 'dart:io'; import 'package:circle_app/app/circle/logic.dart'; +import 'package:circle_app/app/like/view.dart'; import 'package:circle_app/app/minefragment/logic.dart'; import 'package:circle_app/main.dart'; import 'package:circle_app/network/api.dart'; @@ -26,25 +27,32 @@ import '../msg/view.dart'; import 'state.dart'; class HomeLogic extends GetxController { - PageController pageController = PageController(initialPage: 1); - int currentIndex = 1; + late TabController tabController; + + int currentIndex = 0; Widget currentPage = Container(); final HomeState state = HomeState(); - final List tabs = []; - var circlePage = CirclePage(); + List tabs = []; static final MessageService _messageService = serviceLocator(); final RxString unreadSIze = "0".obs; + final RxBool showcirlceUnred = false.obs; + + @override void onInit() async { super.onInit(); + getIMData(); - tabs.add(MsgPage()); + + tabs.add(CirclePage()); + tabs.add(LikePage()); + tabs.add(MsgPage()); tabs.add(MinefragmentPage()); EventBusManager.on().listen((event) { @@ -110,6 +118,12 @@ class HomeLogic extends GetxController { _messageService.addSimpleMsgListener(listener: msgListener); + checkVersion(); + } + + + + Future checkVersion() async { var data = await DioManager.instance.get(url: Api.APP_VERSION); var bean = BaseResponse.fromJson( data, (data) => UpdateInfo.fromJson(data)); @@ -174,6 +188,10 @@ class HomeLogic extends GetxController { super.onReady(); FlutterNativeSplash.remove(); + final logic = Get.find(); + logic.loadCirclePeopleData(); + + } void showReportDialog( @@ -206,13 +224,13 @@ class HomeLogic extends GetxController { updateIndex(int index) { currentIndex = index; - if (index == 1) { + if (index == 0) { final logic = Get.put(CircleLogic()); logic.loadCirclePeopleData(); - } else if (index == 2) { + } else if (index == 3) { final logic = Get.put(MinefragmentLogic()); logic.getMode(); - } else { + } else if (index == 2) { getUnreadSize(); } update(); diff --git a/circle_app/lib/app/home/view.dart b/circle_app/lib/app/home/view.dart index 0b63f75..506eeea 100644 --- a/circle_app/lib/app/home/view.dart +++ b/circle_app/lib/app/home/view.dart @@ -1,5 +1,7 @@ - import 'package:circle_app/app/circle/view.dart'; +import 'package:circle_app/app/like/view.dart'; +import 'package:circle_app/app/minefragment/view.dart'; +import 'package:circle_app/app/msg/view.dart'; import 'package:circle_app/util/util.dart'; import 'package:circle_app/view/ExitAppConfirmation.dart'; import 'package:flutter/material.dart'; @@ -16,62 +18,71 @@ class HomePage extends StatefulWidget { } class _HomePageState extends State - with AutomaticKeepAliveClientMixin { + with AutomaticKeepAliveClientMixin,SingleTickerProviderStateMixin { @override bool get wantKeepAlive => true; - final logic = Get.lazyPut(() => HomeLogic()); - final state = Get.find().state; + HomeLogic logic = Get.find(); + @override + void initState() { + // TODO: implement initState + super.initState(); + logic.tabController = TabController(length: 4, vsync: this, initialIndex: 0,animationDuration: Duration.zero); + } @override Widget build(BuildContext context) { - super.build(context); - return GetBuilder(builder: (HomeLogic controller) { - return ExitAppConfirmation(child: Scaffold( - resizeToAvoidBottomInset: false, - backgroundColor: const Color.fromRGBO(15, 10, 31, 1.0), - bottomNavigationBar: Container( - height: 49.sp + MediaQuery.of(context).padding.bottom, - width: Get.width, - // color: Colors.red, - padding: EdgeInsets.only(left: 40.sp, right: 40.sp), - decoration: BoxDecoration( - color: const Color(0xFF423055), - image: DecorationImage( - fit: BoxFit.fill, - image: AssetImage( - getTabbarImage('tabbar_bg'), - ))), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - crossAxisAlignment: CrossAxisAlignment.start, + return ExitAppConfirmation( + child: Scaffold( + resizeToAvoidBottomInset: false, + backgroundColor: const Color.fromRGBO(15, 10, 31, 1.0), + bottomNavigationBar: Container( + height: 49.sp + MediaQuery.of(context).padding.bottom, + width: Get.width, + // color: Colors.red, + padding: EdgeInsets.only(left: 20.sp, right: 20.sp), + decoration: BoxDecoration( + color: const Color(0xFF423055), + image: DecorationImage( + fit: BoxFit.fill, + image: AssetImage( + getTabbarImage('tabbar_bg'), + ))), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + funcItem(0, 'circle', 0 == controller.currentIndex, controller), + funcItem(1, 'like', 1 == controller.currentIndex, controller), + funcItem(2, 'msg', 2 == controller.currentIndex, controller), + funcItem(3, 'mine', 3 == controller.currentIndex, controller), + ], + ), + ), + body: Stack( + fit: StackFit.expand, children: [ - funcItem(0, 'msg', 0 == controller.currentIndex, controller), - funcItem(1, 'circle', 1 == controller.currentIndex, controller), - funcItem(2, 'mine', 2 == controller.currentIndex, controller), + Container( + width: MediaQuery.of(context).size.width, + // height: + // Get.height - 49.sp + MediaQuery.of(context).padding.bottom, + decoration: const BoxDecoration(image: bgWidget), + ), + TabBarView( + physics: const NeverScrollableScrollPhysics(), + controller: logic.tabController, + children: [ + const CirclePage(), + LikePage(), + MsgPage(), + MinefragmentPage() + ], + ) ], ), ), - body: Stack( - children: [ - Container( - width: MediaQuery.of(context).size.width, - height: Get.height - 49.sp + MediaQuery.of(context).padding.bottom, - decoration: const BoxDecoration( - image: bgWidget),), - PageView( - physics: const NeverScrollableScrollPhysics(), - controller: controller.pageController, - onPageChanged: (int index) { - // controller.updateIndex(index); - }, - children: controller.tabs, - - ) - ], - ), - ),); + ); }); } @@ -83,30 +94,46 @@ class _HomePageState extends State behavior: HitTestBehavior.opaque, onTap: () { if (!isSelected) { - controller.pageController.jumpToPage(index); + logic.tabController.animateTo(index, duration: Duration(milliseconds: 0), curve: Curves.ease); controller.updateIndex(index); } }, - child: Stack( - alignment: Alignment.center, - children:[ - Container( - + child: Stack(alignment: Alignment.center, children: [ + Container( margin: EdgeInsets.only(top: 8.sp), child: Center( - child: Image.asset( - isSelected - ? getTabbarImage('${image}_selected') - : getTabbarImage('${image}_normal'), - width: 38.sp, - height: 38.sp, - fit: BoxFit.fill, - excludeFromSemantics: true, - gaplessPlayback: true, - ))), + child: Image.asset( + isSelected + ? getTabbarImage('${image}_selected') + : getTabbarImage('${image}_normal'), + width: 38.sp, + height: 38.sp, + fit: BoxFit.fill, + excludeFromSemantics: true, + gaplessPlayback: true, + ))), + // if (logic.showcirlceUnred.value && index == 1) + Obx(() => Visibility( + visible: index == 1 && controller.showcirlceUnred.value, + child: Positioned( + // right: 4.sp, + top: 10.sp, + child: Container( + + width: 14.sp, + height: 14.sp, + margin: EdgeInsets.only( + left:24.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(7.sp), + gradient: LinearGradient( + colors: controller.showcirlceUnred.value ? [Color(0xFFC343F9), Color(0xFFFB34B2)] : [Color(0xFFC343F9), Color(0xFFFB34B2)]), + border: + Border.all(color: Color(0xFF170730), width: 1.sp))), + ))), // Obx(() => null) Obx(() => Visibility( - visible: index == 0 && controller.unreadSIze != "0", + visible: index == 2 && controller.unreadSIze != "0", child: Positioned( // right: 4.sp, top: 6.sp, diff --git a/circle_app/lib/app/invite/view.dart b/circle_app/lib/app/invite/view.dart index a1e3027..93e4daa 100644 --- a/circle_app/lib/app/invite/view.dart +++ b/circle_app/lib/app/invite/view.dart @@ -487,7 +487,6 @@ void showCodePicker(InviteLogic logic) { alignment: Alignment.center, child: TextField( controller: logic.codeEditingController, - keyboardType: TextInputType.phone, maxLength: 8, textAlign: TextAlign.center, style: TextStyle(color: Colors.white, fontSize: 16.sp), diff --git a/circle_app/lib/app/like/binding.dart b/circle_app/lib/app/like/binding.dart new file mode 100644 index 0000000..db3098d --- /dev/null +++ b/circle_app/lib/app/like/binding.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import 'logic.dart'; + +class LikeBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => LikeLogic()); + } +} diff --git a/circle_app/lib/app/like/logic.dart b/circle_app/lib/app/like/logic.dart new file mode 100644 index 0000000..3880df8 --- /dev/null +++ b/circle_app/lib/app/like/logic.dart @@ -0,0 +1,188 @@ +import 'package:circle_app/app/circle/logic.dart'; +import 'package:circle_app/app/home/logic.dart'; +import 'package:circle_app/app/invite/logic.dart'; +import 'package:circle_app/network/api.dart'; +import 'package:circle_app/network/dio_manager.dart'; +import 'package:circle_app/util/util.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:get/get.dart'; + +class LikeLogic extends GetxController { + int currentIndex = -1; + + int page = 1; + int myPage = 1; + + InterestsBean circle = InterestsBean(lists: []); + InterestsBean mycircle = InterestsBean(lists: []); + + ScrollController leftCtr = ScrollController(); + ScrollController rightCtr = ScrollController(); + ScrollController myCircleCtr = ScrollController(); + + bool isMore = true; + bool isMyMore = true; + bool isLoad = true; + + List hasNewList = []; + + Data? homeData; + @override + void onInit() { + // TODO: implement onInit + super.onInit(); + // leftCtr.addListener(() { + // if (leftCtr.position.pixels == + // leftCtr.position.maxScrollExtent) { + // loadMore(); + // } + // }); + rightCtr.addListener(() { + if (rightCtr.position.pixels == + rightCtr.position.maxScrollExtent) { + loadMore(); + } + }); + // + // myCircleCtr.addListener(() { + // if (myCircleCtr.position.pixels == + // myCircleCtr.position.maxScrollExtent) { + // loadMyMore(); + // } + // }); + loadInviteData(); + loadCircleListData(); + loadMyCircleData(); + } + + loadInviteData() async { + + var data = await DioManager.instance.get(url: Api.inviteMainPage); + if (data['code'] == 200) { + Autogenerated result = Autogenerated.fromJson(data); + + homeData = result.data; + + } + } + + loadCircleListData() async { + var data = await DioManager.instance.get( + url: Api.getCircleInterests, params: {"page": page, 'page_size': 20}); + var bean = BaseResponse.fromJson( + data, (data) => InterestsBean.fromJson(data)); + if (bean.data is InterestsBean && bean.isSuccess()) { + if (page == 1) { + circle = bean.data!; + } else { + circle.lists.addAll(bean.data!.lists); + } + + isLoad = false; + if (circle.lists.length < 20) { + isMore = false; + } + update(); + } + } + + loadMyCircleData() async { + var data = await DioManager.instance + .get(url: Api.getMyCircleAll); + + // var bean = BaseResponse.fromJson( + // data, (data) => InterestsBean.fromJson(data)); + + if (data['code'] == 200) { + List circleList = data['data']; + if (circleList.isNotEmpty) { + List infoList = []; + circleList.forEach((element) { + var info = Circle.fromJson(element); + infoList.add(info); + }); + mycircle.lists = infoList; + if (currentIndex >= mycircle.lists.length - 1) { + currentIndex = mycircle.lists.length -1; + } + + loadCalloutsNew(); + } + } + + update(); + } + + loadMore() { + if (isMore) { + page = page + 1; + loadCircleListData(); + } + } + + void relaodData() { + page = 1; + loadCircleListData(); + } + + loadMyMore() { + if (isMyMore) { + myPage = myPage + 1; + loadMyCircleData(); + } + } + + void relaodMyData() { + myPage = 1; + loadMyCircleData(); + } + + outCircle(String interest_id, bool isStatus) async { + var data = await DioManager.instance.post( + url: "${Api.outCrrcle}$interest_id/join", + params: {"status": isStatus ? "0" : "1"}); + var bean = BaseResponse.fromJson(data, (data) => data); + if (bean.code == 200) { + circle.lists.forEach((element) { + if (element.id.toString() == interest_id.toString()) { + element.isJoin = !isStatus; + } + }); + + + relaodMyData(); + } + showOKToast(bean.msg); + } + + + loadCalloutsNew() async { + List idList = []; + mycircle.lists.forEach((element) { + idList.add(element.id.toString()); + }); + var data = await DioManager.instance.post( + url:Api.calloutsNew, + params: {"interestIds":idList}); + + if (data['code'] == 200) { + hasNewList.clear(); + List infoList = data['data']; + bool isHasNew = false; + if (infoList.isNotEmpty) { + infoList.forEach((element) { + // "hasNew" -> false + hasNewList.add(element['hasNew']); + if (element['hasNew']) { + isHasNew = true; + } + }); + } + HomeLogic logic = Get.find(); + logic.showcirlceUnred.value = isHasNew; + // logic.update(); + // update(); + } + } + +} diff --git a/circle_app/lib/app/like/view.dart b/circle_app/lib/app/like/view.dart new file mode 100644 index 0000000..608b7bf --- /dev/null +++ b/circle_app/lib/app/like/view.dart @@ -0,0 +1,501 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:circle_app/app/circle/logic.dart'; +import 'package:circle_app/app/circle/widgets/info_list_view.dart'; +import 'package:circle_app/app/select_circle/logic.dart'; +import 'package:circle_app/common/Widgets/circle_share.dart'; +import 'package:circle_app/common/Widgets/text_more.dart'; +import 'package:circle_app/router/app_routers.dart'; +import 'package:circle_app/util/util.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import 'logic.dart'; + +class LikePage extends StatelessWidget { + LikePage({Key? key}) : super(key: key); + final ctr = Get.lazyPut(() => LikeLogic()); + final logic = Get.find(); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.transparent, + body: SafeArea( + child: GetBuilder(builder: (logic) { + return logic.isLoad + ? loaddingWidget(true) + : Container( + width: Get.width, + height: Get.height, + child: Row( + children: [ + Container( + width: 65.sp, + child: Column( + children: [ + leftItem('', logic.currentIndex == -1, false, -1), + Container( + alignment: Alignment.center, + height: 20, + child: Container( + width: 33.sp, + height: 1.sp, + color: Color(0x4DFFFFFF), + )), + Expanded( + child: MediaQuery.removePadding( + removeTop: true, + context: context, + child: ListView.builder( + controller: logic.myCircleCtr, + itemBuilder: (context, index) { + return leftItem( + logic.mycircle.lists[index].title, + logic.currentIndex == index, + logic.hasNewList.length > index + ? logic.hasNewList[index] + : false, + index); + }, + itemCount: logic.mycircle.lists.length, + ))) + ], + )), + Expanded( + child: Container( + child: logic.currentIndex == -1 + ? circleInfoListView() + : InfoListView( + logic.currentIndex, + logic.mycircle.lists[logic.currentIndex], + logic, + key: ValueKey('${logic.mycircle.lists[logic.currentIndex].id.toString() + logic.currentIndex.toString()}'), + ))) + ], + ), + ); + }), + ), + ); + } + + circleInfoListView() { + return Stack( + fit: StackFit.expand, + children: [ + RefreshIndicator( + onRefresh: () async { + logic.relaodData(); + }, + child: ListView.builder( + controller: logic.rightCtr, + itemBuilder: (context, index) { + return circleInfoItem(logic.circle.lists[index]); + }, + itemCount: logic.circle.lists.length, + )), + Positioned( + bottom: 36.sp, + right: 10.sp, + child: GestureDetector( + onTap: () async { + var data = await Get.toNamed( + AppRoutes.Call_out, + ); + }, + child: Image.asset( + getCircleImage('send_msg'), + width: 60.sp, + ))) + ], + ); + } + + circleInfoItem(Circle bean) { + List urlList = bean.lastJoinUsers; + List widgets = []; + int i = 0; + // print(urlList); + if (null != urlList) { + urlList.forEach((element) { + if (widgets.length > 2) { + return; + } + widgets.add(Positioned( + left: 15.sp * i, + child: circleWidget( + element.avatar! ?? + "https://qiniuyun.leyuan666.com/quanzi/avatar/default.png", + element.id.toString()), + )); + i++; + }); + } + return GestureDetector( + onTap: () { + // if (bean.isJoin) { + Get.toNamed(AppRoutes.Signal_circle_list, arguments: bean.id); + // } + }, + child: Container( + margin: EdgeInsets.only(bottom: 10.sp), + child: Column( + children: [ + ClipRRect( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10.sp), + topRight: Radius.circular(10.sp)), + child: Container( + padding: EdgeInsets.only(left: 12.sp, right: 12.sp), + height: 72.sp, + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.fill, + image: AssetImage(getCircleImage('top_circle_bg')))), + child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: 42.sp, + height: 42.sp, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.0), + gradient: const LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0xFF71F3F2), + Color(0xFFF558FF), + ], + stops: [0.0365, 0.9427], + ), + ), + padding: EdgeInsets.all(1.sp), + child: ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: CachedNetworkImage( + imageUrl: bean.image, + width: 40.sp, + height: 40.sp, + memCacheHeight: 40, + memCacheWidth: 40, + fit: BoxFit.cover), + ), + ), + Expanded( + child: Container( + padding: EdgeInsets.only(left: 8.sp, top: 12.sp), + // alignment: Alignment., + height: 72.sp, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + bean.title, + style: TextStyle( + color: Colors.white, + fontSize: 18.sp, + fontWeight: FontWeight.w600), + ), + SizedBox( + height: 4.sp, + ), + Text( + '${convertToTenThousand(bean.viewTotal)}人看过', + textAlign: TextAlign.left, + style: TextStyle( + color: const Color(0xff03FEFB), + fontSize: 12.sp, + ), + ), + ], + ), + )), + GestureDetector( + //加入圈子 + onTap: () async { + if (bean.isJoin) { + Get.bottomSheet(CircleShare('', '', bean), + isScrollControlled: true, enableDrag: false); + } else { + await logic.outCircle( + bean.id.toString(), bean.isJoin); + } + }, + child: Stack( + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('add'), + width: 77.sp, + ), + Text( + !bean.isJoin ? '申请加入' : '分享有奖', + style: TextStyle( + color: Colors.white, fontSize: 12.sp), + ) + ], + )) + ], + ), + )), + Container( + padding: EdgeInsets.only(left: 12.sp, right: 12.sp), + // height:urlList.length==0?47.sp: 118.sp, + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.fill, + image: AssetImage(getCircleImage('circle_desc')))), + child: Container( + margin: EdgeInsets.only(top: 10.sp, bottom: 10.sp), + child: Column( + children: [ + Container( + margin: EdgeInsets.only(bottom: 7.sp), + width: Get.width - 80.sp, + // height: 50.sp, + child: HideText( + text: bean.intro, + maxWidth: Get.width - 89.sp, + additionText: '查看更多', + maxLines: 3, + style: + TextStyle(color: Colors.white, fontSize: 14.sp), + additionStyle: TextStyle( + color: const Color(0xFFFF4DF6), fontSize: 14.sp), + onTap: () { + _showTextContentDialog( + Get.context!, bean.intro, bean.title); + }, + )), + urlList.length == 0 + ? Container() + : Row( + children: [ + SizedBox( + height: 30.sp, + width: + 30.0.sp + 14.sp * (widgets.length - 1.sp), + child: Stack( + alignment: Alignment.center, + children: widgets, + ), + ), + SizedBox( + width: 4.sp, + ), + Text( + '${convertToTenThousand(bean.joinTotal)}圈友加入', + style: TextStyle( + color: Colors.white, fontSize: 12.sp), + ), + SizedBox( + width: 4.sp, + ), + // GestureDetector( + // onTap: () { + // // Get.bottomSheet( + // // CircleShare(logic.homeData!.inviteCode!,logic.homeData!.link!,bean), isScrollControlled: true, + // // enableDrag: false + // // ); + // }, + // behavior: HitTestBehavior.opaque, + // child: Container( + // height: 30.sp, + // alignment: Alignment.center, + // child: Image.asset( + // getCircleImage('play'), + // width: 20.sp, + // ), + // ), + // ) + ], + ), + ], + ), + ), + ), + ], + ), + ), + ); + } + + circleWidget(String url, String userId, {double width = 24}) { + return GestureDetector( + onTap: () { + Get.toNamed(AppRoutes.UserInfoActivity, arguments: userId); + }, + child: Stack( + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('avatar_bg'), + width: width.sp, + ), + ClipOval( + child: CachedNetworkImage( + imageUrl: url ?? + "https://qiniuyun.leyuan666.com/quanzi/avatar/default.png", + width: (width - 1).sp, + height: (width - 1).sp, + fit: BoxFit.cover, + memCacheHeight: width.toInt() - 1, + memCacheWidth: width.toInt() - 1, + ), + ) + ], + )); + } + + leftItem(String text, bool isSelcted, bool isUnread, int index) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () async { + logic.currentIndex = index; + + if (index >= 0) { + logic.hasNewList[index] = false; + logic.update(); + Future.delayed(Duration(seconds: 1), () { + logic.loadCalloutsNew(); + }); + } else { + logic.update(); + } + }, + child: Container( + width: 65.sp, + height: 65.sp, + color: isSelcted ? Colors.white.withOpacity(0.3) : Colors.transparent, + child: Stack( + alignment: Alignment.center, + children: [ + if (text.isEmpty) + Image.asset( + getCircleImage('circile_all_icon'), + width: 55.sp, + ), + if (text.isNotEmpty) + Container( + margin: EdgeInsets.all(6.sp), + // padding: EdgeInsets.only(left: 4.sp), + alignment: Alignment.center, + padding: EdgeInsets.all(6.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(7.sp), + gradient: LinearGradient( + colors: [Color(0xFF3F6967), Color(0xFF5C3769)])), + child: Text( + text, + maxLines: 2, + style: TextStyle( + color: Colors.white, + fontSize: 13.sp, + overflow: TextOverflow.ellipsis, + fontWeight: FontWeight.w600), + textAlign: TextAlign.center, + ), + ), + if (isUnread) + Positioned( + right: 6.sp, + top: 6.sp, + child: Container( + width: 15.sp, + height: 15.sp, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: LinearGradient( + colors: [Color(0xFFC343F9), Color(0xFFFB34B2)]), + border: + Border.all(color: Color(0xFF170730), width: 1.sp)), + )) + ], + ), + ), + ); + } + + void _showTextContentDialog(BuildContext context, String msg, String title) { + showDialog( + context: context, + builder: (BuildContext context) { + return Dialog( + backgroundColor: Colors.transparent, + child: Container( + height: 300.sp, + padding: const EdgeInsets.all(1.0), + child: Stack( + children: [ + Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(10.0), + gradient: const LinearGradient( + colors: [Color(0xFFDD3DF4), Color(0xFF30FFD9)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ), + Container( + margin: EdgeInsets.all(1.sp), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(10.0), + gradient: const LinearGradient( + colors: [Color(0xFF4C3E5F), Color(0xFF324140)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ), + Positioned( + top: 15, + left: 0, + right: 0, + child: Center( + child: Text(title, + style: TextStyle( + color: const Color(0xFFF7FAFA), fontSize: 16.sp)), + )), + Container( + margin: EdgeInsets.only(top: 24.sp, bottom: 24.sp), + child: Container( + margin: + EdgeInsets.only(top: 12.sp, left: 14.sp, right: 14.sp), + alignment: Alignment.center, + child: SingleChildScrollView( + child: Text( + msg, + textAlign: TextAlign.center, + style: TextStyle( + color: const Color(0xCCF7FAFA), fontSize: 16.sp), + ), + ), + ), + ), + Positioned( + top: 8.sp, + right: 10.sp, + child: GestureDetector( + onTap: () { + Get.back(); + }, + child: Icon( + Icons.close, + color: Colors.white, + size: 20.sp, + ), + )), + ], + ), + ), + ); + }, + ); + } + +} diff --git a/circle_app/lib/app/login/complete_material/logic.dart b/circle_app/lib/app/login/complete_material/logic.dart index 473096c..ba5ad10 100644 --- a/circle_app/lib/app/login/complete_material/logic.dart +++ b/circle_app/lib/app/login/complete_material/logic.dart @@ -247,7 +247,7 @@ class Complete_materialLogic extends GetxController { } if (state.wxEditingController.text.isNotEmpty && !isPass) { - RegExp wxReg = RegExp(r'^[a-zA-Z][-_a-zA-Z0-9]{5,19}$'); + RegExp wxReg = RegExp(r'^[-_a-zA-Z][-_a-zA-Z0-9]{5,19}$'); if (!wxReg.hasMatch(state.wxEditingController.text)) { showOKToast('请输入正确的微信号'); return; diff --git a/circle_app/lib/app/msg/sys_notify_list/view.dart b/circle_app/lib/app/msg/sys_notify_list/view.dart index 30774ad..2de154a 100644 --- a/circle_app/lib/app/msg/sys_notify_list/view.dart +++ b/circle_app/lib/app/msg/sys_notify_list/view.dart @@ -119,8 +119,8 @@ class Sys_notify_listPage extends StatelessWidget { break; case "my_main": final homeLogic = Get.put(HomeLogic()); - homeLogic.pageController.jumpToPage(2); - homeLogic.updateIndex(2); + homeLogic.tabController.animateTo(3); + homeLogic.updateIndex(3); Get.back(); diff --git a/circle_app/lib/app/msg/view.dart b/circle_app/lib/app/msg/view.dart index dde3471..4ad3b14 100644 --- a/circle_app/lib/app/msg/view.dart +++ b/circle_app/lib/app/msg/view.dart @@ -20,7 +20,7 @@ import 'package:tencent_cloud_chat_uikit/ui/controller/tim_uikit_conversation_co import '../../util/eventBus.dart'; import 'TIMUIKitConversation/tim_uikit_conversation.dart'; import 'logic.dart'; -const bgWidget = DecorationImage( +const msgBgWidget = DecorationImage( fit: BoxFit.fill, image: AssetImage('assets/images/base/home_back.png')); class MsgPage extends StatelessWidget { diff --git a/circle_app/lib/app/my_circle/view.dart b/circle_app/lib/app/my_circle/view.dart index 3951160..b23fb0a 100644 --- a/circle_app/lib/app/my_circle/view.dart +++ b/circle_app/lib/app/my_circle/view.dart @@ -1,7 +1,10 @@ +import 'package:cached_network_image/cached_network_image.dart'; import 'package:circle_app/app/circle/logic.dart'; import 'package:circle_app/app/circle/widgets/info_list_view.dart'; import 'package:circle_app/app/my_circle/logic.dart'; import 'package:circle_app/app/select_circle/logic.dart'; +import 'package:circle_app/common/Widgets/circle_share.dart'; +import 'package:circle_app/common/Widgets/text_more.dart'; import 'package:circle_app/components/my_app_bar.dart'; import 'package:circle_app/router/app_routers.dart'; import 'package:circle_app/util/util.dart'; @@ -12,7 +15,6 @@ import 'package:get/get.dart'; import '../../util/eventBus.dart'; - class My_circlePage extends StatefulWidget { My_circlePage({Key? key}) : super(key: key); @override @@ -29,92 +31,324 @@ class _My_circlePageState extends State final state = Get.find().state; - var getContext; @override Widget build(BuildContext context) { getContext = context; - return Container( - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height, - decoration: BoxDecoration( - color: Color(0xFF423055), - image: DecorationImage( - fit: BoxFit.fill, - image: AssetImage(getBaseImage('home_back')))), - child: Scaffold( - backgroundColor: Colors.transparent, - body: SafeArea( - child: GetBuilder(builder: (MyCircleLogic controller) { - return Stack( + return Container( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height, + decoration: BoxDecoration( + color: Color(0xFF423055), + image: DecorationImage( + fit: BoxFit.fill, + image: AssetImage(getBaseImage('home_back')))), + child: Scaffold( + backgroundColor: Colors.transparent, + body: SafeArea( + child: GetBuilder(builder: (MyCircleLogic controller) { + return Stack( + children: [ + Container( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height, + child: Container( + child: Column(children: [ + backNavigatorItem(), + // Text(controller.state.msg), + //组件使用 + Expanded( + child: logic.circle.lists.isEmpty + ? !logic.isMore + ? noResultWidget() + : loaddingWidget(logic.isMore) + : ListView.builder( + // controller: logic.rightCtr, + itemBuilder: (context, index) { + var bean = logic.circle.lists[index]; + return GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + + Get.toNamed(AppRoutes.Signal_circle_list, arguments: bean.id); + + }, + child: circleInfoItemWidget( + logic.circle.lists[index])); + }, + itemCount: logic.circle.lists.length, + )) + // Swiper( + // itemBuilder: (BuildContext context, int index) { + // var bean = logic.circle.lists[index]; + // // final GlobalKey infoListViewKey = GlobalKey(); + // // MyinfoListViewKey = infoListViewKey; + // return InfoListView( + // index, + // bean, + // controller + // ); + // }, + // index: controller.state.index, + // itemCount: logic.circle.lists.length, + // viewportFraction: 0.93, + // // scale: 0.9, + // loop: false, + // onIndexChanged: (index) { + // controller.state.index = index; + // if (index == logic.circle.lists.length - 1 && controller.isMore) { + // + // logic.loadMore(); + // } + // + // }, + // // pagination: new SwiperPagination(),//如果不填则不显示指示点 + // // control: new SwiperControl(),//如果不填则不显示左右按钮 + // ) + ]), + ), + ), + ], + ); + }), + ), + )); + } + + var MyinfoListViewKey; + + circleInfoItemWidget(Circle bean) { + List urlList = bean.lastJoinUsers; + List widgets = []; + int i = 0; + // print(urlList); + if (null != urlList) { + urlList.forEach((element) { + if (widgets.length > 2) { + return; + } + widgets.add(Positioned( + left: 15.sp * i, + child: circleWidget( + element.avatar! ?? + "https://qiniuyun.leyuan666.com/quanzi/avatar/default.png", + ), + )); + i++; + }); + } + return Container( + margin: EdgeInsets.only(bottom: 10.sp, left: 10.sp, right: 10.sp), + child: Column( + children: [ + ClipRRect( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10.sp), + topRight: Radius.circular(10.sp)), + child: Container( + padding: EdgeInsets.only(left: 12.sp, right: 12.sp), + height: 72.sp, + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.fill, + image: AssetImage(getCircleImage('top_circle_bg')))), + child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height, - child: Container( - child: Column(children: [ - backNavigatorItem(), - // Text(controller.state.msg), - //组件使用 - Expanded( - child: logic.circle.lists.isEmpty ? !logic.isMore ? noResultWidget() : loaddingWidget(logic.isMore) : Swiper( - itemBuilder: (BuildContext context, int index) { - var bean = logic.circle.lists[index]; - // final GlobalKey infoListViewKey = GlobalKey(); - // MyinfoListViewKey = infoListViewKey; - return InfoListView( - index, - bean, - controller - ); - }, - index: controller.state.index, - itemCount: logic.circle.lists.length, - viewportFraction: 0.93, - // scale: 0.9, - loop: false, - onIndexChanged: (index) { - controller.state.index = index; - if (index == logic.circle.lists.length - 1 && controller.isMore) { - - logic.loadMore(); - } - - }, - // pagination: new SwiperPagination(),//如果不填则不显示指示点 - // control: new SwiperControl(),//如果不填则不显示左右按钮 - )) - ]), + width: 42.sp, + height: 42.sp, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.0), + gradient: const LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0xFF71F3F2), + Color(0xFFF558FF), + ], + stops: [0.0365, 0.9427], + ), + ), + padding: EdgeInsets.all(1.sp), + child: ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: CachedNetworkImage( + imageUrl: bean.image, + width: 40.sp, + height: 40.sp, + memCacheHeight: 40, + memCacheWidth: 40, + fit: BoxFit.cover), ), ), + Expanded( + child: Container( + padding: EdgeInsets.only(left: 8.sp, top: 12.sp), + // alignment: Alignment., + height: 72.sp, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + bean.title, + style: TextStyle( + color: Colors.white, + fontSize: 18.sp, + fontWeight: FontWeight.w600), + ), + SizedBox( + height: 4.sp, + ), + Text( + '${convertToTenThousand(bean.viewTotal)}人看过', + textAlign: TextAlign.left, + style: TextStyle( + color: const Color(0xff03FEFB), + fontSize: 12.sp, + ), + ), + ], + ), + )), + GestureDetector( + //加入圈子 + onTap: () async { + if (bean.isJoin) { + Get.bottomSheet( + CircleShare('','',bean), isScrollControlled: true, + enableDrag: false + ); + } else { + await logic.outCircle( + bean.id.toString(), bean.isJoin); + } + }, + child: Stack( + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('add'), + width: 77.sp, + ), + Text( + !bean.isJoin ? '申请加入' : '分享有奖', + style: TextStyle( + color: Colors.white, fontSize: 12.sp), + ) + ], + )) ], - ); - }), + ), + )), + Container( + padding: EdgeInsets.only(left: 12.sp, right: 12.sp), + // height:urlList.length==0?47.sp: 118.sp, + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.fill, + image: AssetImage(getCircleImage('circle_desc')))), + child: Container( + margin: EdgeInsets.only(top: 10.sp, bottom: 10.sp), + child: Column( + children: [ + Container( + margin: EdgeInsets.only(bottom: 7.sp), + width: Get.width - 20.sp, + // height: 50.sp, + child: HideText( + text: bean.intro, + maxWidth: Get.width - 50.sp, + additionText: '查看更多', + maxLines: 3, + style: + TextStyle(color: Colors.white, fontSize: 17.sp), + additionStyle: TextStyle( + color: const Color(0xFFFF4DF6), fontSize: 17.sp), + onTap: () { + _showTextContentDialog( + Get.context!, + bean.intro, + ); + }, + )), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + // showToast("点个鸡毛,星哥还没做"); + // Get.toNamed(AppRoutes.FriendsActivity,arguments: '3'); + }, + child: urlList.length == 0 + ? Container() + : Row( + children: [ + SizedBox( + height: 30.sp, + width: + 30.0.sp + 14.sp * (widgets.length - 1.sp), + child: Stack( + alignment: Alignment.center, + children: widgets, + ), + ), + SizedBox( + width: 4.sp, + ), + Text( + '${convertToTenThousand(bean.joinTotal)}圈友加入', + style: TextStyle( + color: Colors.white, fontSize: 12.sp), + ), + SizedBox( + width: 4.sp, + ), + // GestureDetector( + // onTap: () { + // // Get.bottomSheet( + // // CircleShare(logic.homeData!.inviteCode!,logic.homeData!.link!,bean), isScrollControlled: true, + // // enableDrag: false + // // ); + // }, + // behavior: HitTestBehavior.opaque, + // child: Container( + // height: 30.sp, + // alignment: Alignment.center, + // child: Image.asset( + // getCircleImage('play'), + // width: 20.sp, + // ), + // ), + // ) + ], + ), + ), + ], + ), ), - )); - + ), + ], + ), + ); } - var MyinfoListViewKey; backNavigatorItem() { return MyAppBar( centerTitle: '我的圈子', - onCenterTitlePressed: (){ + onCenterTitlePressed: () { EventBusManager.fire(ScrollToTop()); }, - actionWdiget: const Text( - "发布喊话", - style: TextStyle(color: Colors.white), + actionWdiget: Image.asset( + getCircleImage('callout_icon'), + width: 75.sp, ), - onPressed: () async{ + onPressed: () 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}); - // MyinfoListViewKey.currentState?.loadCallOutListData(); + numbers.add(MyConfigData(logic.getCircleIndex().id.toString(), + logic.getCircleIndex().title!, false)); + var data = await Get.toNamed(AppRoutes.Call_out, + arguments: {'numbers': numbers}); + // MyinfoListViewKey.currentState?.loadCallOutListData(); // logic.refresh(); // logic.update(); }, @@ -146,7 +380,6 @@ class _My_circlePageState extends State Positioned( left: 0, child: Container( - width: 30.sp * widgets.length, height: 44.sp, child: Stack( @@ -177,7 +410,8 @@ class _My_circlePageState extends State right: 0, child: GestureDetector( onTap: () { - Get.toNamed(AppRoutes.MyCircle,arguments: '',preventDuplicates:false); + Get.toNamed(AppRoutes.MyCircle, + arguments: '', preventDuplicates: false); }, child: Image.asset( getCircleImage('my_circle'), @@ -192,26 +426,24 @@ class _My_circlePageState extends State circleWidget(String url, {double width = 30}) { return GestureDetector( child: Stack( - alignment: Alignment.center, - children: [ - Image.asset( - getCircleImage('avatar_bg'), - width: width.sp, - ), - ClipOval( - child: Image.network( - url, - width: (width - 1).sp, - height: (width - 1).sp, - fit: BoxFit.fill, - ), - ) - ], - )); + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('avatar_bg'), + width: width.sp, + ), + ClipOval( + child: Image.network( + url, + width: (width - 1).sp, + height: (width - 1).sp, + fit: BoxFit.fill, + ), + ) + ], + )); } - - void _showTextContentDialog(BuildContext context, String msg) { showDialog( context: context, @@ -272,8 +504,7 @@ class _My_circlePageState extends State ); } - void _showOutCircleDialog( - BuildContext context, CircleLogic controller, Circle bean) { + void _showOutCircleDialog(BuildContext context, var controller, Circle bean) { showDialog( context: context, builder: (BuildContext context) { @@ -315,7 +546,7 @@ class _My_circlePageState extends State child: Text( "提示", style: - TextStyle(color: Colors.white, fontSize: 16.sp), + TextStyle(color: Colors.white, fontSize: 16.sp), ), ), Container( @@ -410,4 +641,3 @@ class _My_circlePageState extends State ); } } - diff --git a/circle_app/lib/app/select_circle/logic.dart b/circle_app/lib/app/select_circle/logic.dart index e520eaf..5b19eb9 100644 --- a/circle_app/lib/app/select_circle/logic.dart +++ b/circle_app/lib/app/select_circle/logic.dart @@ -7,41 +7,41 @@ import 'state.dart'; class Select_circleLogic extends GetxController { late Map interestMap = Get.arguments['interestMap']; bool isRodio = Get.arguments['isRodio']; - List selectCircle = Get.arguments['selectCircle']; + List selectCircle = Get.arguments['selectCircle']; var selectIndex = -1; @override void onInit() async { - if(isRodio){ + if (isRodio) { List> entries = interestMap.entries.toList(); for (var entry in entries.asMap().entries) { - MyConfigData bean = MyConfigData(entry.value.key, entry.value.value, false); - if(selectCircle.isEmpty){ + MyConfigData bean = + MyConfigData(entry.value.key, entry.value.value, false); + if (selectCircle.isEmpty) { arrList.add(bean); - }else{ + } else { selectCircle.forEach((element) { - if(entry.value.key==element.id){ + if (entry.value.key == element.id) { bean.isSelect = true; selectIndex = entry.key; } arrList.add(bean); }); } - } - }else{ + } else { interestMap.forEach((key, value) { - MyConfigData bean = MyConfigData(key, value, false); + MyConfigData bean = MyConfigData(key, value, false); selectCircle.forEach((element) { - if(key==element.id){ + if (key == element.id) { bean.isSelect = true; } }); arrList.add(bean); }); } -print(arrList.length.toString()); + print(arrList.length.toString()); update(); } diff --git a/circle_app/lib/app/signal_circle_list/view.dart b/circle_app/lib/app/signal_circle_list/view.dart index 62abae2..56b966a 100644 --- a/circle_app/lib/app/signal_circle_list/view.dart +++ b/circle_app/lib/app/signal_circle_list/view.dart @@ -1,6 +1,8 @@ import 'package:circle_app/app/circle/logic.dart'; import 'package:circle_app/app/circle/widgets/info_list_view.dart'; +import 'package:circle_app/app/select_circle/logic.dart'; import 'package:circle_app/components/my_app_bar.dart'; +import 'package:circle_app/router/app_routers.dart'; import 'package:circle_app/util/util.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -28,7 +30,21 @@ class Signal_circle_listPage extends StatelessWidget { backgroundColor: Colors.transparent, appBar: MyAppBar( centerTitle: logic.circle?.title ?? '', - + actionWdiget: Image.asset( + getCircleImage('callout_icon'), + width: 75.sp, + ), + onPressed: () async{ + List numbers = []; + numbers.add(MyConfigData( + controller.circle!.id.toString(), + controller.circle!.title, + false)); + var data = await Get.toNamed(AppRoutes.Call_out, arguments: {'numbers': numbers}); + // MyinfoListViewKey.currentState?.loadCallOutListData(); + // logic.refresh(); + // logic.update(); + }, ), body: Container( padding: EdgeInsets.only(left: 15.sp, right: 15.sp), diff --git a/circle_app/lib/common/Widgets/base_tip_widget.dart b/circle_app/lib/common/Widgets/base_tip_widget.dart index 8b2eeac..daed097 100644 --- a/circle_app/lib/common/Widgets/base_tip_widget.dart +++ b/circle_app/lib/common/Widgets/base_tip_widget.dart @@ -262,9 +262,11 @@ typedef void MyCallback(bool payResult); showJoinCiclePiker(String cicleId, String pirce, String oldPrice, int type, MyCallback payResult,String iosItem) { String title = ['解锁圈子才能发布喊话', '解锁圈子才能查看主页', '解锁圈子才能主动私聊'][type]; + int intP = double.parse(pirce).toInt(); + int intoldPrice = double.parse(oldPrice).toInt(); return Get.bottomSheet( - joiinCircileTipWdiget(cicleId, pirce, oldPrice, title, payResult,iosItem: iosItem), - isScrollControlled: true, + joiinCircileTipWdiget(cicleId,intP.toString(), intoldPrice.toString(), title, payResult,iosItem: iosItem), + isScrollControlled: true, enableDrag: false); } diff --git a/circle_app/lib/common/Widgets/circle_share.dart b/circle_app/lib/common/Widgets/circle_share.dart new file mode 100644 index 0000000..6ef3c9b --- /dev/null +++ b/circle_app/lib/common/Widgets/circle_share.dart @@ -0,0 +1,735 @@ +import 'dart:io'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:circle_app/app/circle/logic.dart'; +import 'package:circle_app/app/invite/logic.dart'; +import 'package:circle_app/app/minefragment/logic.dart'; +import 'package:circle_app/common/Widgets/text_more.dart'; +import 'package:circle_app/network/api.dart'; +import 'package:circle_app/network/dio_manager.dart'; +import 'package:circle_app/util/util.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:get/get.dart'; +import 'package:get/get_core/src/get_main.dart'; +import 'package:image_gallery_saver/image_gallery_saver.dart'; +import 'dart:ui' as ui; +import 'package:fluwx/fluwx.dart' as fluwx; +import 'package:path_provider/path_provider.dart'; +import 'package:qr_flutter/qr_flutter.dart'; + + +class CircleShare extends StatefulWidget { + Circle bean; + String code; + String link; + CircleShare(this.code, this.link,this.bean); + @override + _CircleShareState createState() => new _CircleShareState(); + +} + +class _CircleShareState extends State { + // TODO: add state variables and methods + GlobalKey _globalKey = GlobalKey(); + + MinefragmentLogic logic = Get.find(); + + + @override + void initState() { + // TODO: implement initState + super.initState(); + loadInviteData(); + } + + loadInviteData() async { + + var data = await DioManager.instance.get(url: Api.inviteMainPage); + if (data['code'] == 200) { + Autogenerated result = Autogenerated.fromJson(data); + + Data homeData = result.data!; + widget.code = homeData.inviteCode!; + + widget.link = homeData.link!; + setState(() { + + }); + + } + } + + @override + Widget build(BuildContext context) { + // TODO: add widget build method + return Scaffold( + backgroundColor: Colors.transparent, + body: Container( + child: Column( + children: [ + Expanded(child: Container()), + Container( + width: Get.width - 40.sp, + // height: Get.height - Get.bottomBarHeight - 164.sp - 10.sp, + child:SingleChildScrollView( + child: RepaintBoundary( + key: _globalKey, + child: Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(getCircleImage("open_vip_bg")), + fit: BoxFit.fill, + ), + ), + child: Column( + children: [ + Container( + width: Get.width, + height: 65.sp, + margin: EdgeInsets.only(left: 15.sp, top: 20.sp,right: 15.sp), + child: Row( + children: [ + Center( + child: Stack( + alignment: Alignment.center, + children: [ + Container( + width: 47.sp, + height: 47.sp, + decoration: const BoxDecoration( + shape: BoxShape.circle, + gradient: LinearGradient( + colors: [ + Color(0xFFDD3DF4), + Color(0xFF30FFD9) + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ), + SizedBox( + width: 46.sp, + height: 46.sp, + child: _buildAvatar1(logic), + ) + ], + ), + ), + Expanded( + child: Container( + padding: EdgeInsets.only(left: 10.sp), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + _buildNameRow(logic), + SizedBox(height: 10.sp), + _buildInfoRow(logic), + ], + ), + ), + ), + Image.asset( + getBaseImage("ic_launcher"), + width: 65.sp, + height: 65.sp, + ) + ], + ), + ), + // Expanded( + // child: + Container( + padding: EdgeInsets.only(left: 10.sp,right: 10.sp), + // color: Colors.red, + // height: 310.sp, + child: Column( + children: [ + SizedBox( + height: 5.sp, + ), + Container( + padding: EdgeInsets.only(left: 15.sp,right: 15.sp), + child: Image.asset( + getMineImage('share_title'), + ), + ), + SizedBox( + height: 10.sp, + ), + circleInfoItem(widget.bean) + ], + ), + ), + Container( + // height: 90.sp, + // color: Color(0xFF334141), + alignment: Alignment.center, + // color: Colors.yellow, + // width: Get.width-40.sp, + margin: EdgeInsets.only(bottom: 15.sp,top: 10.sp), + padding: EdgeInsets.only(left: 15.sp, right: 15.sp), + child: Row( + + children: [ + Expanded( + child: Container( + // color: Colors.red, + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Container( + // color: Colors.blue, + child: Row( + children: [ + Text( + '专属邀请码', + style: TextStyle( + color: Colors.white, + fontSize: 18.sp), + ), + SizedBox( + width: 8.sp, + ), + Container( + alignment: Alignment.center, + padding: EdgeInsets.only( + left: 10.sp, right: 10.sp), + height: 25.sp, + decoration: BoxDecoration( + // color: Color(0xFFDC5BFD), + gradient: + const LinearGradient( + colors: [ + Color(0xFF0DF5F7), + Color(0xFFD263FB) + ], + begin: + Alignment.centerLeft, + end: + Alignment.centerRight, + ), + borderRadius: + BorderRadius.circular( + 12.5.sp)), + child: Text( + widget.code, + style: TextStyle( + color: Colors.black, + fontSize: 12.sp), + ), + ) + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 10.sp), + width: Get.width - 200.sp, + child: Text( + '扫码或长按识别下载APP,认识更多小众圈子里的人,给生活带来更多乐趣~', + style: TextStyle( + color: Colors.white, + fontSize: 15.sp)), + ) + ], + ), + ), + ), + // Image.asset(getBaseImage("ic_launcher"),width: 80.sp,height: 80.sp,) + Stack( + alignment: Alignment.center, + children: [ + Container( + color: Colors.white, + width: 90.sp, + height: 90.sp, + ), + QrImageView( + data: widget.link, + padding: EdgeInsets.zero, + version: QrVersions.auto, + size: 80.sp, + gapless: false, + // backgroundColor: Colors.black, + ) + ], + ) + ], + ), + ) + ], + ), + )) + ), + ), + SafeArea( + top: false, + child: Container( + height: 164.sp, + width: Get.width, + color: Color(0xFF292247), + child: Column( + children: [ + Expanded( + child: Container( + padding: EdgeInsets.only( + top: 15.sp, left: 15.sp, right: 15.sp), + alignment: Alignment.center, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + shareAction('wx', '微信', () { + shareWxData(1); + }), + shareAction('wxq', '朋友圈', () { + shareWxData(2); + }), + shareAction('qq', 'QQ', () { + copyInviteText(logic.name); + }), + shareAction('wb', '微博', () { + copyInviteText(logic.name); + }), + shareAction('hb', '保存海报', () { + _saveLocalImage(); + }), + ], + ), + )), + Container( + height: 1.sp, + color: Color(0x33FFFFFF), + ), + GestureDetector( + onTap: () { + Get.back(); + }, + child: Container( + height: 67.sp, + alignment: Alignment.center, + child: Text( + '取消', + style: TextStyle( + color: Colors.white, fontSize: 14.sp), + ), + ), + ) + ], + ), + )) + ], + ), + ), + ); + } + + Widget _buildAvatar1(MinefragmentLogic logic) { + return ClipOval( + child: GestureDetector( + onTap: () { + if (logic.userInfoBean != null) { + var imgList = []; + imgList.add(logic.userInfoBean!.avatar); + // Get.toNamed(AppRoutes.Swiper,arguments:imgList); + // Get.toNamed(AppRoutes.Swiper, arguments: { + // 'imaglist': imgList, + // 'index': 0 + // }); + } + }, + child: logic.userInfoBean == null + ? SizedBox( + width: 63.sp, + height: 63.sp, + ) + : CachedNetworkImage( + fit: BoxFit.cover, + placeholder: null, + imageUrl: logic.avatar, + width: 63.sp, + height: 63.sp, + ), + ), + ); + } + + Widget _buildNameRow(MinefragmentLogic logic) { + return Container( + margin: EdgeInsets.only(top: 6.sp), + child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + logic.name, + style: TextStyle( + color: const Color.fromRGBO(247, 250, 250, 1.0), + fontSize: 16.sp, + ), + ), + SizedBox( + width: 4.sp, + ), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + gradient: const LinearGradient( + colors: [ + Color.fromRGBO(141, 255, 248, 1.0), + Color.fromRGBO(181, 211, 255, 1.0), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + padding: EdgeInsets.only( + top: 2.sp, bottom: 2.sp, left: 10.sp, right: 10.sp), + child: Text( + logic.ageMsg, + style: TextStyle( + color: Colors.black, + fontSize: 10.sp, + ), + ), + ), + ], + ), + ); + } + + Widget _buildInfoRow(MinefragmentLogic logic) { + return Row( + children: [ + Text('邀请您加入', + style: TextStyle( + color: Colors.white, + fontSize: 12.sp, + )), + Text('【微乐园APP】', + style: TextStyle( + color: Color(0xFF0DF5F7), + fontSize: 12.sp, + )), + ], + ); + } + circleWidget(String url, String userId, {double width = 24}) { + return Stack( + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('avatar_bg'), + width: width.sp, + ), + ClipOval( + child: CachedNetworkImage( + imageUrl: url ?? + "https://qiniuyun.leyuan666.com/quanzi/avatar/default.png", + width: (width - 1).sp, + height: (width - 1).sp, + fit: BoxFit.cover, + memCacheHeight: width.toInt() - 1, + memCacheWidth: width.toInt() - 1, + ), + ) + ], + ); + } + circleInfoItem(Circle bean) { + List urlList = bean.lastJoinUsers; + List widgets = []; + int i = 0; + // print(urlList); + if (null != urlList) { + urlList.forEach((element) { + if (widgets.length > 2) { + return; + } + widgets.add(Positioned( + left: 15.sp * i, + child: circleWidget( + element.avatar! ?? + "https://qiniuyun.leyuan666.com/quanzi/avatar/default.png", + element.id.toString()), + )); + i++; + }); + } + return Container( + margin: EdgeInsets.only(bottom: 10.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.sp), + gradient: LinearGradient(colors: [Color(0xFF261240),Color(0xFF132C40),]) + ), + child: Column( + children: [ + ClipRRect( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10.sp), + topRight: Radius.circular(10.sp)), + child: Container( + padding: EdgeInsets.only(left: 12.sp, right: 12.sp), + height: 72.sp, + decoration: BoxDecoration( + + gradient: LinearGradient(colors: [Color(0xFF261240),Color(0xFF132C40),]), + + ), + child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: 42.sp, + height: 42.sp, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.0), + gradient: const LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0xFF71F3F2), + Color(0xFFF558FF), + ], + stops: [0.0365, 0.9427], + ), + ), + padding: EdgeInsets.all(1.sp), + child: ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: CachedNetworkImage( + imageUrl: bean.image, + width: 40.sp, + height: 40.sp, + memCacheHeight: 40, + memCacheWidth: 40, + fit: BoxFit.cover), + ), + ), + Expanded( + child: Container( + padding: EdgeInsets.only(left: 8.sp, top: 12.sp), + // alignment: Alignment., + height: 72.sp, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + bean.title, + style: TextStyle( + color: Colors.white, + fontSize: 18.sp, + fontWeight: FontWeight.w600), + ), + SizedBox( + height: 4.sp, + ), + Text( + '${convertToTenThousand(bean.viewTotal)}人看过', + textAlign: TextAlign.left, + style: TextStyle( + color: const Color(0xff03FEFB), + fontSize: 12.sp, + ), + ), + ], + ), + )), + + Stack( + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('add'), + width: 77.sp, + ), + Text( + !bean.isJoin ? '申请加入' : '分享有奖', + style: TextStyle( + color: Colors.white, fontSize: 12.sp), + ) + ], + ) + ], + ), + )), + Container( + padding: EdgeInsets.only(left: 12.sp, right: 12.sp), + // height:urlList.length==0?47.sp: 118.sp, + decoration: BoxDecoration( + + ), + child: Container( + margin: EdgeInsets.only(top: 10.sp, bottom: 10.sp), + child: Column( + children: [ + Container( + margin: EdgeInsets.only(bottom: 7.sp), + width: Get.width - 80.sp, + // height: 50.sp, + child: HideText( + text: bean.intro, + maxWidth: Get.width - 84.sp, + additionText: '查看更多', + maxLines: 3, + style: TextStyle(color: Colors.white, fontSize: 14.sp), + additionStyle: TextStyle( + color: const Color(0xFFFF4DF6), fontSize: 14.sp), + onTap: () { + + }, + )), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + // showToast("点个鸡毛,星哥还没做"); + // Get.toNamed(AppRoutes.FriendsActivity,arguments: '3'); + }, + child: urlList.length == 0 + ? Container() + : Row( + children: [ + SizedBox( + height: 30.sp, + width: + 30.0.sp + 14.sp * (widgets.length - 1.sp), + child: Stack( + alignment: Alignment.center, + children: widgets, + ), + ), + SizedBox( + width: 4.sp, + ), + Text( + '${convertToTenThousand(bean.joinTotal)}圈友加入', + style: TextStyle( + color: Colors.white, fontSize: 12.sp), + ), + SizedBox( + width: 4.sp, + ), + // GestureDetector( + // onTap: () { + // Get.bottomSheet( + // CircleShare('code','link,',bean), isScrollControlled: true, + // enableDrag: false + // ); + // }, + // behavior: HitTestBehavior.opaque, + // child: Container( + // height: 30.sp, + // alignment: Alignment.center, + // child: Image.asset( + // getCircleImage('play'), + // width: 20.sp, + // ), + // ), + // ) + ], + ), + ), + ], + ), + ), + ), + ], + ), + ); + } + + shareAction(String img, String name, GestureTapCallback onTap) { + return GestureDetector( + onTap: onTap, + child: Container( + child: Column( + children: [ + Image.asset( + getMineImage(img), + width: 40.sp, + ), + SizedBox( + height: 10.sp, + ), + Text( + name, + style: TextStyle(color: Colors.white, fontSize: 12.sp), + ) + ], + ), + ), + ); + } + + _saveLocalImage() async { + RenderRepaintBoundary boundary = + _globalKey.currentContext!.findRenderObject() as RenderRepaintBoundary; + ui.Image image = await boundary.toImage(pixelRatio: ui.window.devicePixelRatio); + ByteData? byteData = + await (image.toByteData(format: ui.ImageByteFormat.png)); + if (byteData != null) { + final result = + await ImageGallerySaver.saveImage(byteData.buffer.asUint8List()); + print(result); + // isSuccess + if (result['isSuccess']) { + showOKToast('保存成功'); + } else { + showOKToast('保存失败,请检查相册权限是否开启'); + } + } + } + + copyInviteText( + String username, + ) { + Clipboard.setData(ClipboardData( + text: '【${username}】邀请你加入“微乐园”,邀请码为${widget.code},点击进入${(widget.link!) + + '?code=${widget.code}'}')); + showOKToast('您已成功复制分享链接,前往对应平台粘贴发送即可~'); + } + /** + * 分享图片到微信, + * file=本地路径 + * url=网络地址 + * asset=内置在app的资源图片 + * scene=分享场景,1好友会话,2朋友圈,3收藏 + */ + void shareWxData(int scene) async { + + SmartDialog.showLoading(msg:'正在生成分享图片...'); + RenderRepaintBoundary boundary = + _globalKey.currentContext!.findRenderObject() as RenderRepaintBoundary; + ui.Image image = await boundary.toImage(pixelRatio: ui.window.devicePixelRatio); + ByteData? byteData = + await (image.toByteData(format: ui.ImageByteFormat.png)); + String filePath = ''; + if (byteData != null) { + Uint8List pngBytes = byteData!.buffer.asUint8List(); + Directory directory = await getApplicationDocumentsDirectory(); + filePath = '${directory.path}/widget_image.png'; + File imageFile = File(filePath); + imageFile.writeAsBytesSync(pngBytes); + } + SmartDialog.dismiss(); + fluwx.WeChatScene wxScene = fluwx.WeChatScene.SESSION; + if (scene == 2) { + wxScene = fluwx.WeChatScene.TIMELINE; + } + fluwx.WeChatShareImageModel? model; + + if (filePath.isNotEmpty) { + model = fluwx.WeChatShareImageModel(fluwx.WeChatImage.file(File(filePath)), + title: '', description: '', scene: wxScene); + } + if (model != null) { + fluwx.shareToWeChat(model!); + } + + } +} 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 d90a09d..da26590 100644 --- a/circle_app/lib/common/Widgets/open_vip_tip/view.dart +++ b/circle_app/lib/common/Widgets/open_vip_tip/view.dart @@ -321,14 +321,14 @@ class Open_vip_tipPage extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - controller.priceBean[index].amount.toString(), + '${controller.priceBean[index].amount.toInt()}', style: TextStyle(color: Colors.white, fontSize: 14.sp), ), SizedBox( width: 4.sp, ), Text( - "${controller.priceBean[index].oldAmount}元", + "${controller.priceBean[index].oldAmount.toInt()}元", style: TextStyle( color: Colors.white70, fontSize: 10.sp, diff --git a/circle_app/lib/common/Widgets/text_more.dart b/circle_app/lib/common/Widgets/text_more.dart index 7c670f2..8541735 100644 --- a/circle_app/lib/common/Widgets/text_more.dart +++ b/circle_app/lib/common/Widgets/text_more.dart @@ -11,7 +11,8 @@ class HideText extends StatefulWidget { required this.style, //正常字样式 required this.additionText, //附加字,如点击查看更多 this.additionStyle, //附加字的样式 - this.maxLines = 3, //行数,不传 默认为3 + this.maxLines = 3, //行数,不传 默认为3 + required this.maxWidth, this.additionUrl, //点击附加字跳转URL this.additionParams, this.onTap,//点击附加字跳转时携带的参数 @@ -22,6 +23,7 @@ class HideText extends StatefulWidget { final String? additionText; final TextStyle? additionStyle; final int? maxLines; + final double maxWidth; final String? additionUrl; GestureTapCallback? onTap; final Map? additionParams; @@ -72,7 +74,7 @@ class _HideTextState extends State { children: children ), textDirection: TextDirection.ltr) - ..layout(maxWidth: Get.width - 60.sp); //若新功能宽度不一致,可尝试修改, + ..layout(maxWidth: widget.maxWidth); //若新功能宽度不一致,可尝试修改, //UIUtils.screenWidth(context)是自定义的获取屏幕宽度的方法 } diff --git a/circle_app/lib/network/api.dart b/circle_app/lib/network/api.dart index 606a66e..49070bf 100644 --- a/circle_app/lib/network/api.dart +++ b/circle_app/lib/network/api.dart @@ -248,7 +248,10 @@ class Api { // /up-service/my/interests /up-service/interest/statistics + static const getMyCircleInterests = 'up-service/my/interests'; + //我的所有圈子 + static const getMyCircleAll = '/up-service/my/interests/all'; //缘分匹配 static const getMatch = 'msg-service/im/chat/match'; //系统通知 @@ -297,6 +300,9 @@ class Api { //重置密码 static const resetPassword = '/user-service/register/user/password/reset'; + //获取多个圈子是否有新喊话 + static const calloutsNew = '/up-service/interests/callouts/new'; + } \ No newline at end of file diff --git a/circle_app/lib/view/notice.dart b/circle_app/lib/view/notice.dart index 617033c..421d5ce 100644 --- a/circle_app/lib/view/notice.dart +++ b/circle_app/lib/view/notice.dart @@ -57,7 +57,7 @@ void showFloatingButtonOverlay( Row( children: [ Container( - width: 70.sp, + // width: 70.sp, child: Text( nickname, overflow: TextOverflow.ellipsis,