From af5d2b53f1a4f439b73c785f1b9aa3ce50e9b409 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=90=8C?= <494089941@qq.com> Date: Fri, 10 Jun 2022 14:59:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BB=E9=A1=B5=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- analysis_options.yaml | 1 + assets/icons/personal_select.png | Bin 0 -> 1760 bytes assets/icons/personal_unselect.png | Bin 0 -> 1601 bytes assets/icons/work_stage_select.png | Bin 0 -> 1735 bytes assets/icons/work_stage_unselect.png | Bin 0 -> 1053 bytes assets/images/app_title.png | Bin 0 -> 15066 bytes assets/images/home_bg.png | Bin 0 -> 28665 bytes lib/constants/app_theme.dart | 58 +++++++--- lib/extensions/list_ext.dart | 38 +++++++ lib/extensions/num_ext.dart | 8 ++ lib/gen/assets.gen.dart | 95 ++++++++++++++++ lib/main.dart | 2 +- lib/ui/home/home_page.dart | 47 ++++++++ lib/ui/login/login_page.dart | 45 +++++++- lib/ui/personal/personal_page.dart | 16 +++ lib/ui/tab_navigator.dart | 103 +++++++++++++++++- lib/widget/buttons/cloud_bottom_button.dart | 4 +- lib/widget/scaffold/cloud_scaffold.dart | 4 +- .../text_filed/account_input_text_field.dart | 22 ++++ pubspec.yaml | 6 +- 20 files changed, 424 insertions(+), 25 deletions(-) create mode 100644 assets/icons/personal_select.png create mode 100644 assets/icons/personal_unselect.png create mode 100644 assets/icons/work_stage_select.png create mode 100644 assets/icons/work_stage_unselect.png create mode 100644 assets/images/app_title.png create mode 100644 assets/images/home_bg.png create mode 100644 lib/extensions/list_ext.dart create mode 100644 lib/extensions/num_ext.dart create mode 100644 lib/gen/assets.gen.dart create mode 100644 lib/ui/home/home_page.dart create mode 100644 lib/ui/personal/personal_page.dart create mode 100644 lib/widget/text_filed/account_input_text_field.dart diff --git a/analysis_options.yaml b/analysis_options.yaml index 9172093..b443051 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -43,6 +43,7 @@ linter: prefer_function_declarations_over_variables: true prefer_interpolation_to_compose_strings: true prefer_null_aware_operators: true + avoid_slow_async_io : true # avoid_print: false # Uncomment to disable the `avoid_print` rule # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule diff --git a/assets/icons/personal_select.png b/assets/icons/personal_select.png new file mode 100644 index 0000000000000000000000000000000000000000..0cbe8090f415a854bb99d0ccb2eb1f45eab12527 GIT binary patch literal 1760 zcmV<61|Ru}P)Px*nn^@KRA@u(nSW?iWf;ew=XvjToqFALv(4$;q>#``2>e4tvke0av{IvlG%JK4 z4Jwj|KrIn}P1g?#i~JQ@YEmdvL@9w*ifEB!ZR&D*)%j~`nzVcG8_)aW+;i`CJ$LTh zILW;*cDDDN_r9O^`@GMugK&#~@D}HTJmCLb;k<%*1p~eVc@qt|K%UFXy@K;3jkw%4 z0t)1CL0AST+llB*T*`e17WVzqbA{c!A!mT&=E>06OXsE_;!H#+MMOXWKuCZHfW+5u z7%}ng-Zx5r=q5+T$8!QWbXK&C3Pa0)@Gb?Tz)*qlZxW<34E{fZ6Vm4DyCciDJce<< zL460jWA^zz5R0ut#40iX3XP84(&IH55d=@Fhr0Mk*(NC%VUFd?v+LbU4Snu_oI2D9_|ZlWC)I!hKrE<{Hb zP+~X&mLVnDNm6TwXm4~=<>6d`{da)5Ch(X)_X_3#bGrlGQ*hj&-az3o0CX=wq9OrM zta1|0F-=mfQZ*YQI3r`1no=rpu4;;6l>~?cBD8^kGYDcY^oZ|?uCBaxv)gcUfDioK z3*tSWLW$D=Al&JfJCLT5P?bWmT(UW;O0sQ%tg>&N>8MtQsV<0ULr9i?+`JaAcNMhj zfa8wU03}u+$SRJ=c7jaT?v7eYv&n#|80jjpZ1+voj;>0C2%9hwd+Egbs*_!T>>6P0 z(Q3rR8j#SZvoCQ&y2qWWUX?{jlht4*5pZWU=006Q*@Rv7c+SN_Vn*wSm%pP!5 zOA+?GzClW?;fE}Y&8yOtbdRgG+qR)nj9Y~rO;(ppdK0v=X(r3ZI|RQ+n+ME*T^P#- zGJC+f#%ECCbM8qqnWep_!+6TMw3P&VBh%@2a@S;urFuBL8Lot#2$n|I56r5)m>uAR z#xVYaUx9=OFD8>Ib_UkjE~luOVzOFU)z7ibVqGKZrj+Wls+P#PQ@2+>2=g%ErDAq~ zDU)t;3=f_(Pu#z6=D0j&FD z4oaGye%{g*v*W#s5MFqs7)l~s$=>+GYM#CrhgDx(hFC(!PX*kh2-`?7RczsS?h{5A;wnA%LJo%o& z>B6b9%6L^%AhWUnU!UJP_%*M&vjl9cmw;ot>s-8^*C}4|?5UQbb1wC}4yPk7=$ngM zs$TU45Ney2BEbD_rMeOats~0jd37&)PN!FD5(73@6H9d)gucDBt!l0>fK=DCI3b}f zUG6T&!L-%f==o$QVdbQ0?;9_xLWkUS<@1`C{Q<0PTqFU)c0TknpPK?Ln!>r5T=*rhN%G&E(jH{P3DrV@+J7m5DiJJc2QN7g{K(9%HJf4*o z4Kje&+VX&2I~4Tsyn;bj$ZLIh1-*7C=;OD%g8u?ut7u3tkD>Aa0000Px)`$RTRh1d2eP{wq1PpzBij~X-I_-4oZ|!Wz5t z?i=6WBy(Z@nRo8F-_Jew*SQzrJTG{j^Fb5v{~qCH1e+0T@E&Lm(FPAtth{ z2FtQ$5z#aN@BknLfB{7ODGbBCrBdlotje=6s2iZ;I5%0AwStH)t)>qVewXs+%?n)anbwJm3A5%)* z9|=89M4Nrz|7r~3w(Gig5z+EdplhX+AEybKDxl*yvk>vcNZ=vcwx22#3gv2oJ zO7%oT`BWH&-GhUJzorG5CSZm!wgUhr1Hducw!7otMj$xnlZogp0O$aK{Zh)u8xGKQ z-CLDX8zNyVrIgKd9x3J1i7Jm{oEjiw zY_Fa}MAYN^{vA*dv5EW+FJLP2B)TgmBKUB%+%UaT*cn zc@`jIVdTof_x&SDMJKUO70_`U$FeM)^3+_EQf1%wOG)?9x@;4jot+nkVR$9wdbFd& zfS%`F6zyA=MUDah_znOLD5d_&X0wB}_O`AU1VINPPC~@%i0FEqA4XfwQKi%>-}nDW z;y)2!E|;4W1c6S4+^CV=nM~%Dfq{X(B#oNdwzs$ET3TB45l&xDX|1~RmP#p)n)*lr z*vc4t0|2J$j1zqHO<2HkQoa+{ju9Z|d?OLf zM#RHHhrC{6k-6s1SW9(r7(7&RTa!#CcBS6NOep|ReXY5kSx8t04baZ%` zOh(Vy(|edfITZxK{BpTmjI(tdX8|Iv*3(4@F;lPT)#{i69*kD6^`=_`=Uk^mQ{n_i z-;bImxub8;5plKR4VEDJ8m%r)Ngwk zMBE^R&~xjY75%V^h?}&4wzjr8y}i9vhqVzPV{E^kPek-3BK~mB=>EO2n@U6rw1(E! z*13IseO32DQ$YPvq;I?$s${d-JM;N`e;Pw{Hxacp6deF$GMPnj2YsUmHX2wGJx#zQ zz14`e%?LJPRFY_FMleZlHKJ`Zf{hrJB%1yK6S`_w4Gz!c00000NkvXXu0mjfIyK$r literal 0 HcmV?d00001 diff --git a/assets/icons/work_stage_select.png b/assets/icons/work_stage_select.png new file mode 100644 index 0000000000000000000000000000000000000000..52a259854130726ae46988c1cd49754d8b9184a9 GIT binary patch literal 1735 zcmV;&1~~bNP)Px*fk{L`RA@u(nSW@NRT#&g=XtMpn{&Fh%0#5HB14pfz{<*%VzvrNmXt_HMTXRV zm_*LBsogj1m;Dv=M}HJVP!UAf=Gd?pO4$$0e*WRY#+v4I+AwF!drzG6p7XxvyzhIv zciXu##~sLa-)Hx@&v|})pXa#<6Z{J&I3E-NFLncO$$p*t{z^+ z2=I6!`N6mA@LyYJ|KB+m#Dj}=_E(fA%Rfbg#fShz*u~h{`&#R(2MY~ZaKM^ftTK@q zY6W0769E7s5dU8h4>*a^<-6D8sX{^)6tL#i!AprzI{+*|M9wDvAs}&2(m`M)%UbKP zzfh0`1FU)Z%oUJ<4gfY6Nx^B5@);rhoJp4~-P43e3jtXWz&l<%JBwku6Odg;zUR36 zxYxKBJy7wQ|4exJdd92jsmEqnAN6M2K~54W*xr269w@a~e;qB!u@7An6s9;MNtS zk&8L(s)f^K#M4PHyoqp_zspR94LXH@4&QtxXf#4lPNO+zTmCtCwBJz-zU7iui zPjxPhpq6Q&VyU3+8M+xbG~ z4S3D^KW_yFU7{H=3Wn-L_)$vC)x@BMuF#99J;>XrU0tHePyT))%AfM1QpATf- zfU}=G+5!w;h;%5zgL>uDevYl2R_xn4o+)p!3V8Js$5H^$Y*a%9rb$6Ad+cRIq$E08 znNovp=f?8QRspYkoCC6EBVQ;8#h`kcBa!N4f+jn#3t5QqepqV4IZB9b=d+dpXFYl> zg~$QJ;TRWkIXxh!db1f&t(urFWFZn#AwBH3azyT4`+$8Z#-KU4^$VVNp0_=(yI(w4 zVK+o)uI&>!=-sUBJhaZm7v+#$Zv?#jjOjzON{yN)&C3Ktx2xGU;3Iu0rgCru+9wxG z^7eU0W)8u+U34@chF|Rx^^Qi`odN*PSksqcm}&NkMQFDY*G%h`akTb0Z;LP`ci;1t zJve<$Zwi@|30eKr3NQ#+xo3%)-2KXEz=o=5R=LpIIPP6?_ivqQHwQ0U-J3!Hql)TH zvR++-!PQ(a`BO)XJgD7_Y_22nq4br1cbozMRzK96A|Vqo1FXMX%2HX!U{^WnU8Zac zk=!r0S@vM{s$NqELoJ%w!Nga;=+rSvsX@m*u){LoC3PGyBXm#?ClylSnO^~eDyWBC zP$A7Ksham(c2$9i&^@rD(ryk;tLt$IV3R-GW?MrD&(h~C$sVjcHDeIw=I$7WPo9}J z3D1292#a-zh)V~r(Lnc`lx@J3Ju*b&DxVpWgtYaKcW3O#jTZdI4fQ9tFi3AVhvo1t zM};)G-@RlRu;PK96bhkN^Ix!f*DIX2c7Rjh(Cf(9UqlW7|Dc7lI3AEAABbn%hA6EPPo(GJ+B7`#IqiD7G6yHT+~&=R{Czl_PP4t;Z(e>lA2@G%oZw$Yz>D3%MGqD|IL>dN7^36c dK{@}t{{R4*JxJ@wze@lB002ovPDHLkV1foCJr4i? literal 0 HcmV?d00001 diff --git a/assets/icons/work_stage_unselect.png b/assets/icons/work_stage_unselect.png new file mode 100644 index 0000000000000000000000000000000000000000..103b8b7d6c68810d99d4aed2ac621f5a8634e611 GIT binary patch literal 1053 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�Hx=GQhD9)ZFJ5|>+ z)nwHAPsJti+uS2I&Bcj^E+n;ThB953tML(w&aJ#a-c$$7n;2gao?x4JViC_ wd?89_=d6l8iizxC?)mO%n&f34B$KA`|E*T3{5Z>0`v3p{07*qoM6N<$g5i2~$^ZZW literal 0 HcmV?d00001 diff --git a/assets/images/home_bg.png b/assets/images/home_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..c51a213e5892b7c2d41764d7dc310167ef35ef45 GIT binary patch literal 28665 zcmXV1c|276`?t$pQr4lpC}dy8Qj{fI$kk#}Nw|^`<6w-XEVtCCtCBP($#!)umpF`F zManK?Im}FAFr3MHFqYrx`}+Mgy_%OZGv_>?=Xr0>gY(X|QsPSDe0+RT_I797`1k~1 zK0bcC9U|!e$dnS_p)dTQZnjo@#hohCe0;&>_GeCCh!~z54f^Z#P~_2#1x~I1l2+tr zJs-axl$$LtU&ifgI;5r)9;?T}(rFBRxVB_J4Fvf_^kGg!uiWkPl%F}8)VE6R1YlJ;fINvL6 z|JHRmH<$E{=qu08e;U*4gZ8DHR;^@Z{iNuwhb)<OZLlKHO66BleV(STVk0x{$EcGf|}J$f?j@Q%Kd- zt*n4mYKHXou+)m*`)$YRpe*HGPq$;DE0+hiu~ne7I5eecmtN}6fW zr(nuOOxNTGN-(CuxIXsAt9$vzI;tb(<>jGX`Ns^&b+pil2pv`G`E;aJ{%E@C%!-%z z-AfZ!xb@*1RS&=K?tApr>vad$YjfrcBXV<}jP};L7-f59J@!~|?ApieQr`~`>&-3N zs9u{BX>MB^GunTx`L8bKzuQ>;&USYGkN9M}oEV|CT^hOCZz)+6?PRyM92-4e*f(jW z*CEre-tV^+@?qn$A^|s%&!(<_Yaq>a_nEG*j2-@)^8zwn`Zk80@O8bqcXs{Xqn5`f zhts;8L)RX#ZxyFzMZ|FbZfCC5?fSCL4ArAEqJD%DtBRoLjm5MP{h7c#FVcqJk)iim z1TD+0<}r~kA6jF>x$WcLFTMVmede9{wQTb?W^<^n#B<1GJ<b3 zC$+Uc@+W)cbH4ZMuaCPnX!c8lX&sH=tgY${4mMvV3&^kS=Q5rvPmB}#L!o2Tug^-- z)!SRAqU)k?loC(w=!;!nSEsdSgUmO}KhK&iHXo|8!RI{J%3{6HfHFAAlr!WzVMdoO&02X2OA!t7l9;{h^qNCmFC zBsaL6D*?}Nyr65`)F~{d}<8 zq_D#YXwLxQwm%zhpaBr-8 z9F{rug-jEL6bDTpHL0%GZ!aAJx!>b?QUWV;vf~;m@H$6hT$VE;3w?bQCfl;v@eijH z3zL#~ha@=~*u%FxmI%A!Oco3v4?Z9kECHn8;PNSUjq()qak z7s#}bHU0I$#`i>=8unKQdjKH6Q+yth*u05LTCiv)ku2{wb<}maEFMV_TdpdSQ~e7d zKx@hT;y@HN;I>VB#KJ4yFD89C=t?U^JEG2T?eaPqE1F|9Nf0?Ny{Z8A(U}s~G)Z8K z^!q+~fT2$iA=ob|)mi;r(O1EOZ7~`}4KCq!ilCLn4~PKd)gvspFNBR-K4J>T5s!d0 zQ#hz;bRZ->{GTs9A^GXmEUmez1?N^Q`tIU+Q3xx6_@!KW=V0FxvYlxEYVP;VzkSp+jjJAKcNr8QU=bBjAG z>#wy{L)M+l2QK`8bgE|S0r&qME`B7>#+MKIlt5H`Ja2#EuWgp6=wV2dh4((LQyf}& z5KmQUK9j}|D@`rw3c*W(*ga$4-+EAvFk!)E6}%@}%=*GZbGP!Fi8~-4SwVonly$V(fvl}V%t*?YE<92)Z^lb^sdI`>+B#j$bg@%@eFSk3sD*4KKOhamvbj*YB36ZL#( zq@!hXc@%rJyG03#Eab$IOa) zmNzF{R?$*_eY%t#M_c}OPqn3PV>kuaLINW$jkZB9M0`AXx}9p}@T&cP0$v*JJW?U`4% zBF9dgF1F4tW@?2E`hvWK&PD_S=Lu%Kt7H1GibJl-!^Miol^2_1{D^*z?#8B}fkwGM zp1rLZ@Wx0-LlE@C{I46F$kCOB80y**y^&Rk0MsfpH!cn<&FUW%Am~gWA)x#OeM(DD zUkBf?x!NVvgqyg$W`G$c(VuX|p!wm>q$dXX`n#E&2K$_OQy&*iujA=!PS!VATQ9o*MTV-6 z?1h!M8-~=>e4YJM4URiirICA@ZiEi7N(`9(`Mn?CU@M(iBMNGpL%6^*=;eP;HF;rp zDLfP3;F?YH$|h#8I(x=UKpwe$$^m`bs0lZByaai{xcmCsKMd@q zg0+uBxbY*|`21`dw8Rf{Zl`Y4;M0q%_>r0b0nXC$lp_%XGX5I0&y&EbVfNw9sX%_f zQ+_D4rA}ylmG5_r-nmz!&EyFo=Jh2s33&Z(&Y5cGJK*Bn0Tak$ioSZ|yHO(L)*-O3 zn~deY=b;nGD|`5v`gMa=Z<$)xarbE2{fEIt ziqC(|=6U0H?pJ9;L0wH)SZS0r1CHHvJhBDUOK5~x3XlgdP= zbvYTE$eYNw5Cr=!V35Z?+TZq#iNZ5P|4QSqgDlm1;Uj@P9CZ5Aru-XSe)OPavtwKk z$V!Z(Ni3G(jYta2WTWX#$OMXvW_I!io7x)~K#?_kKp)vKMFdf3b2w-c$D2I>-_ta8 zs#Ey=jQD|&n@Luxc)tJ%IE;!;drc^EFIqZ->NdVJ&6Ll6U%#A<$J$CTwJfh*UKK}w zKsKHpo9fSp46yE8c`Xhid~lzcp1n3R=0PKF9LMFr_h@8oXwM+yP_@zyAZqhf>yHa! zu(wgd0aH=Pq@QHtd+WT`JEqz-6$~J}7&ze*=0z;!of;K|#X0)LX|5)NSScW@yY7d{ zPX>Icb+m#CYD4O;tIS%jE(OV#=FaUWG3&pE{9KEF>yV>srttg{*)>Bmb#`lMNk500 zC7npq@3RmE>Qae{^A#8P;o`ax9De)myruK66H*Xx4osamTje|(>&5;xTX)RBo)RAUc=m%ttZlS2n5y}7g;2#pYa^NqD48xg>vZbG z77D%Z^yP=?Cx~@{cA5At_Sc|t_WIwgE9P!q7$oCa_g0PXym~UvW-a2C0=T%gT%8f# zSU2{FXBb~61#55}-;nSD_i62wrMR1Sz`l}DGjI7@QSy7>$_#{)WnX5zT*J1apS@3$ zDdlK6JDK-MgTS57n>RwXh0q6N21U+%tM!`(9sE7%0fxGbn+rmmE@wTXMR*G22p5Iz z58MIeU)ST-j@Ms*AOY93ICC4^#s+#QzzAfrx&9)jrK@BS`M~N4VdJ&`d1(r(peK5} zL-waBdaqhXMF;_Tb$g*m!=c>cVM2aAte7Gz+cXSv0pFk%*ZN^+MF~EitB9Ul9KK;I z*u}+N9$tUej}^T%MW%_+I^Q;tBthP7nIXGYoOhQP5-2pM0;frD{Os>%=S8INjLm#w zE(|T-upK6N;=*5@2ZPIYDNmPK;PAT!UId+3OMZk2M-hKznsaCiNvoRK*;H4KG#@H7 zh4V6y;wF-#O@J|zBz;r2iDG5B2a*u*+YLD_4yvTB>lmKYc55Y39{=Z+s*=`It+ios zyM%cEao>_K947hMKzzKs&FJTSNoJN1>|MJ}*{z{hl`?b;-2Op}jq(!48#UJLi}3pk zt#u(}I^J;)RN}Eu6xw9L_o7Dd?CIlBzs z%h8D=mgDo$JHzk=xrJUw0(Qe;$%?Nevhew=aXqKTO${+yGfHf}Lc=W+u+Ra|*dfIM zY0P4)RxiiUIYW>Uvl6OjUy&loymKErs&tnoi1(KNg*HK(1GWTdFtoI_kuv`9)^P!N zgJ)837@ek_{qfjXxW3u^XFua2SR!gx6`C6E0tQERen@V_byRSk46VGwGc=o=7Zx+o zsh*>|)R$=5ab-M3{Rk#PBNK-z9dKc`w{rn3*V5)`A0nb)kM|IaMe;2d< zYBmn{Pu;lfclw^s!Jg^srm13ZZ?kPwX_tq@&%^s#8|%KfDsCy%+pc>hz||5QSxCJf zhg%tuoDM#cKokq7e7c8~N+#~&N1FdOWW|i~os(M1V>y@Isp%qg?-pJC!z)}YcAijov-y~LNpD`5qIgZF>-LWE`fTpLu{l$0n9?j(t zc>GwU7-EQp_v7jFXR%CGejsYw>1(IH%6!TI`iO)r1?S*J(ky6n`(2E|!(x8H5vB6N}R* zQQOAZaipSe&E=ApAB(VH)9?KTeOj7PWb?C?96bFRO1g|Rth4K9@%d|>JU)&8Fw&mZW&E0Rt&eo`BpRXb{EM@OMwEv3tx%1vKW?=h@-wz&gNDjU&pJB-C zl+URYM!dCEv))YafoLZ+tPeJBx&SfrU^C5G@`w7*kwo6<7+saufB&jCI>5p=T-9{* zaIH$wIMQ8`j?Y&-=dTtWE*>5;EeHgJ+03*Z?{;zPpt*x3p2;WcKJESYAGs6mjh^Ra z5_y?PJi|nCtpsn~)NCDc)r>=^^ z%fWRH0-%vN@Z9|QGkinmFIW(WqG>?^wp(rwRvhlH-J#92wKh|3j0yu+YJ`CGTDf0K zABvNHmZC-y@JMsdjfzK+&K*}vpY*16*Hu1Fj)1QNoX5Fy#5dwlM{vLNkDP4 z%q+P0*Aui{_z`ND7<{BrCb5Lqj7#l2Ul9m4d~$XdhB6beRM%ixShgK=twaV;-!G~= z-8wM?_Tg?CL&4>DHiBfp(8kR3Ti!=@ptyPutW&L8%80@2Ydr;tb`ltB=x7FZz-Dp8 z6g-<(1Bk)vWh0Uc`_X5%)<_B3bx9u9khiyDb^5_Zf~}Vv@$8c0O_booX~8v94Dh__ z+=?;m%uX=<2DMyy3zgP-x2QRYZyVG{vv^1_SF%^ z*!xqilbGUg@{mudssQjI<(vQB8M6Xkc(zwV)RzDwZ!i%M(ohTI#JNF_hZM7Bw=HrD@p9{Ii@w7F533~i1e|{fOq-QkhP7E@i3#; z|LBPEIe+bQ(M7*>6#EJ!lcS69Tx%3GibC!!bzjKD;-2Tw|H=-<_J~CzZU*GELJDSj zb71h9W=g9(T(elrES|r5A!6whQ4;dAv2un8@2%{=bL9OHwqqR4b%0r0czWhKiZO*kIg zCA3g9;p+r0_9&{gA>wf638lGA$z_^vr2=#98*K+7J7f{kL`ky9V&4;mmfzE|h$SN- z+6o5_-_D-}`*>sT#Q?PeRPtK#=5yrwP9m;Wwa%@hVZ#9@+R#IER`I#c*?T;*X1}sA zBQO)M&R;u--6M>wu`?2}v5zks@4hu=9bXrCkxv5THEsU!aq2udBYYXKKPo$;1*(mm z*j1b(|9W_DjyMV{4nVQvqYTTf??s3E{r16jYcCZGP;IWEVNtm?^3@c`j^iB?ejr4Y zfTrnwu-YGMuM)x)7by36QIV7*2GG&Sg?&nJRnh%Sw=igJ|EVJ%Wr`BQp|#M7INCG` zG7Q_|G~-B49mNiMbA1ZkF@@hI#9_KX_f@NCS^DOoxyI4T5}MFr)#ZEGv(@$R3>f%2 z_~sNySA1S}`l*$^2<*=1I|b4#R6d45xb4f##RwAbzx`iLHGHtM?MP!$w~Vfi+K*$9 zQ$)#7hzmb*5Q)X#OHu>nbTxALslFHT5@=+r>hkfJ`6}ny@QEv}`9o_1^M5d7&VF7$ zJ(+#yK9On)hgJ_BfSi0#;Uf}$hCY}B8w1Sg>ec2^;6jqtWrJpl=1mV#gHbK*qq}}- zo$Ycy{<5KCvM|?`T--dW-)T*yZb=>iIWoHIEt0WRj=m(kyP}+t_Ajj%J6kNAFWiD{ zjXnki^T7eEEZTUdYYcAnGJ~l)9FiJOlbZZpOj$Sd(Y{R%gE);i%3D+WvRISqU|^f0 z&Qkpz^1F@)$;3>&5h}SNG6$I!1OCBcur>czr{>Y+jmlkbMt*wlb!)^Wk3%BB_aHiD zB~Wrk9Sb+%fjQ3DQ82iiG{)om-F4!K0IS~af3K#n(#$9RVZvp#|H(e}O_Wx{KlS9a zv`c$34&jgH7zA7HLUq_nkAWzx9BeVJ(Yb5y-Iq_N1ruCaaj(|At3L4obpJ;-v?N-) zjo2LqG}sF2%j$JtsgY5yu23VD&;!Y4)%(8o>5>7~V{9juT}43J7%JFcKsv=2iRax? zeE6$_`uf$O->eujEdj-nysp9#Z7udr~5SWR!S5EwxBj zUll!?!@R2XY|pOXd+5obT9J0X=*O$+mNE*m#sx;UDK^yls1ZFSI4r(MU}N>2iAt7A zzEbH@cpsjvrse2!eB|gXjb`^NYa{wLuOnjzqomdQ9V7p9)E$s9+`4|~QyU0AzP$=I_sa(zE8^!ZDs3L)M^q(P0%5A`)| zx_BSI-Wi&E&I#mfY1O_Xt5u($uc%>t{%O2JkodhJLD^0Mj^+hDcpbV=|P ziznX_u5ZddK3U$$9tdioxbZ>K~M{=ifnK@Sn|%KoUnAVk{wz=tmpMRwMX zFtc)6I&-$NbP|jNkiW<%ly$;{|4%RrY#i+m@h-X3N9LV82zgXeUkm3Yba>(EdMiOq zxOIAhgNIu)Wm0L#d{QaJB^l-RH^9Y6ymaLM{yJR%rp6*AWS8t1>g}}%M(yUfTMNmn z3FnuLbKyhm|A^#61vSFzl%ph6B|^=xVK|Ecn;(>uT6;M1|CqCqo9#M;4UrfV>sCrq z)?~)p@y>?5g2+gcaOKPz?mRLF_A!PI@2xq@PSh<)Pwk`cY12+Cd-?V0LER%@=G{6W zTIU~P$iKevw0mnKH$@et0Ft>pggcMk1M&7<@w{V#(6s7cHOt~3bYeIMv*WO_U2#M# zp5DNP^yc(w#G}ghX`%x;ta@uETpdhQfgD~h&VD;043*5*621I#j*;!J<>S-cnUDq-a}TJ=>`03pbVtZX&m ztWc+JkxUcgpekBW8C@96lr~&Ay^?nnLa4~kLn;f!^z8Fg{uhCNWSD7tLrN0B$oN`v z${@J+Q=T0rp|$?%H-67-ybQ&U9-Houif>%T<`;Va452y(G0v))vE?_hH;Y7*JIMGf^8x6WfjI`C2+L zg&#kVC18zo(Q*bGdm}Vu)Q~Wl>#EpC)>po*y?W*QkMClgU+8yqrd(7#<4L-PE#nt& zeqqIY5uA(GPX?AqELbni5*c0>d>{}P)S@6t{<`f=U>(Q2l3d{ps>8-c>1_e z@5{&fF+NINPo1w3nklEet;ghHv-GyB6JZ={Z_q(+IU9wz2IXmwY+E<)Wsel=SiFxb ze(D_D_g*c^Ml$xb!1m(>PTCvv@+cAqMwVZHkhzA+!MK)CemIV%4Vet{#F3EaGwVX| z_?k5FI6gmF=P~M0AwwrlLM49}kVe0j9AP_T}Gaq~do)3^-KKSXj zTO%qoiNOs^TRA=r$7TbFl5Mt<}Yu1`{cLDc@4oH$B%u)DM4V%;@Gd9<;ohBS@7ki#>6eKSbHqdEm* z*H9!SF=;ZJ?{E3jNXdQ2NuX)-t_H}ttz`^N7v?K_)QBL1u8Q@-ITCR3=+#4D=+e12 z=>6-1_shO?Z!{O-%0ijWk}K9!%ayunrs@LwnE)&~?KW9zacJnKgu8p=Xy^r$HfX4` zI-hFgN??#fcq8~oxe#8Pwyt-vL;@gCQ5AbI#6<|W(u&GqOFAlW?<3+vGEFC0`d7?- z!UOj(DEPVFsD}9Dx~WtmG5gopNhr4%{Ja_~J_QY9pR z>%8PZ`v0t16b8tEepBe7L7kw`HtiEo$xifNdToNRW($rm8Yz19Ud^zKg$TSsJOpw| z0-r2~DAjiyVr2Cig$0Zc@~nvyz@{Dj1vnf?;L z%kMcnRkw`{JB1QK)OIL3v}eHYn${^)`XO9Bw)Nv>yEdGVjZ=DlDYD_CiIWcXJgBx0 z_fQ#*IWN!be4~m2ZWSua-$fX35Z%JcJG{x1)ZV0VAy@I6{rfutx=1MGWukM>y$b$$yZZB0b;Dvl>7{JCYW1&-8A zm@w}Q-}o;89EoYbp{^?H?j5jo>$n{b6up(#5<^ghLr*pY+t$d@3mkFaR}5llyyB23 zxnhPdaYMnrMw&3Jib0B-H%p42oys4|aMA=D2KIxC{_o}Q@3v>%;S5ucMl_sw)cG!n z_V0Mi{UD=&`#jA76LLIFVy04V#{5tMO@bTvo%ct&_;ldU8uh@RJgw(lvFZmQZBL}y z6g~jq6ud8h$zjl8Q0>}Ad8j{vfyV=H+sNhMiU9U zo2}JQ3@x^xyr-G2I80ZVqMz{5w#d;oEJ(pE{mF5|)KLoO;>z|rm>hT^1E=U~^!b4f z<=<5nQltUpPJSe&1-DL=lR$28Kk8%d^U9Eh*x8Hon?Ab>QrWgXH6lQkr;&x(UP)wO z-Nr;Wr_TfIGAnk}0NooM^tgY3<;UJRd=W?fB(}wRj96VY(@ivW*$K5C?heo&<}{N0 zUp_T5Pfps>vLeb_`D`$6NYXI}AN+Q_cyUGO=UgM@21PBe9{@uoQ8RP=*;shf=!YpiIUi5^qzQzR zU~!b>jX3mww|P5m@ao(ZH95!Ri)%4Y3KxN9xx{4vA-lM5a2{0S-+LccOh-6hHB`8^ zpAUBv;#zlA`O&jb-V|(M4xd=`0FCY&z_AqUz6yS7(iyDB)eU?`c|}cF&-y zU;4>0QIKOkYydg=qi4R4tV3WrXV=HR3c%**=AC`6)FNk|rsa#`arQfmYYbHa*55F( zj<;=SWgEN@gNrF)(ZHy^h4{gZ&FpM{BbND2Sns@NwVm#Y^5cLT7m}r>9HE0Mdl4dx=(PWjLkw zTuZOFkgb^}u(X0as`n_2UdqGVk{8z(kwNBh}^yEhdm=@oRThJJY znGf+jUOUHhs!!q8Fd-j@OaEI5_EX*H%F+LmvGQe^HnF@DeUumdBIiEH&UrYVr_%{; z0K^@8?bQF{g8UeL(wem;T2idSqZav*dm{iyiuUbH6Ru5;-M~^zih4}YDUmu7(u~vm zBe(1{YIm%!cQPZEoDIUL5dmRIsqN=W`)-@=tuy3Dsf_*6os5b_kKc~ ztiZTla;N1~?P)E>&d=A~PE(R0swk{s^tH8cii6_X6h{-NYUqc1)RlX@xidMsqH&B? zqhxHV1RSOF=V|BspBR7={6xzH11Mf{)|;3j<6fV$&UTo0;J+aMUbga#*QJw_BOx+k zu^nZ8UTXVZUF@#mRQEaC-H@jI!z<5ybsb1NxT(SU59LGcovEoDe1S`8Ol|^57KV?s zxtw&_*OiUxCu65<&F_YTG`(|N?Y=Ismi%4t2(@Y7oSNEj*$Sygc6OE6`lOLBNm1t4rt zeK@U=#Af~-J`{@50XjjheHsmtp_mGFk>pBT6&pv@;1@j^{wTBHiqC0m)L#T+HE&$V zvj<1^)|?BSueoA54T)YG7^tp%{0yvN7IPuj3EVDtotTpgr={DL+*nso zGv{_}Ea*vW-8~-N&Wc&wBL8(Eu{@}mq{LrbIVX-=T~4HNOll;7RGjyJVUS1rhl3g^ z!bm*;88j1;DL!>}-62R*`uZyoKbTBQTCZy7x&|o2#k0>!3UeC5ci~GubiRSP2T|$D zEK>!4)THtct7xBwOp9vVU=!+zMCYNIzvG8Hx5t06Tq$VcC~|SK$JJHEHC?Zo_yh$J ztY4O@l$#!Yd*^N>mCvKz6WL`!{_qQrXqLs7B2lrk(X!wo{&naRPHVtx2Y+pm){k1X za&@Ox2o7?So(`+S*SM(l)p#_Zc(f`oI5UMxR26M=LhO%qqIM$w>GYd}(`R}IB@^cq zlD|hhnzoRy`5KEGCf3z*ZxA-$=Hy&uK`)HKMKp$>&n=TCGSFDbDXosTeI|sFw+$~d zd{72{^2#hG^XAc=LmN77@(h~0(x6moBCT@|E3nv(vXxh!SxCdIv%ZMJ*_@qLdWhfB z_?qz>i^0_%9i`p9oW{-7(FW|faY4is6Yh<=MrihG#H!zrwKdmMqO!J9eZN1EXWJsn zwk9v%k1jC|IWxgMSL@QdA1wN6KOmB}VT`)q3Z|%opXd7O24bcq31fKh|t11Ou%6U%&{OLzSn z{Puj{3ACg4&2G}oYywtypi0D2JvJ>!)8!Hi7K}U!711g67J{{$(l>)W883IAjWnJi zxg7scCv9uOMI#n#*nhMYF20<=?LG)7mP8frksgkz-U8 zkp|kzLu=ByPEF?FSnE;W{5L-tbWf0X;J2WvhjJtOQA{|gZU%ITtG}-L_|hNX@rpjj z{R~6M+jrMK#$k}?ySz_s-ptbNlF!f%J7qlEbzg&3ap*gC0!^+COHSh5IyKWsQW_xT z(?eTu!+(_7gIuK*C$=5R9~org_v>uMGpEhpjTcvi%qm06xzepssBkLUi$ZE{^SPMK z0~vFu2q#@wa5hn@dGlO{*Ejv%v>Q#gDIfR<-l+}Y(qM!4mic$}1iOf;Pa+82&U5p_ zpZa-{b;UZ`M`U3QZ;;pHN|Co*^|qb7HA3o+3AH?~d>Hydz{o?M$ui`b*UBXPO~OU1 zI-!ly+SikLCe_TX(;@HV(w?t?%1MDv{~UeaY0?pLOJ&@^+G+yg6z)BMFb{ zSGDw?qvldG?%+w)i_~`;JBxc&P#25ooU>nxM9RFjNwKF#TguI=vx;+`6o)6W@Qeez z@?eisXkIoz{^jV*PK-E#+VTXIy-;0DdcXYJ_n7n6_i757iM?C{Lr>Y8`MDKqr}ru$rA%8BeYA`jVD%H67AASs<2GzR{PY5t?@v>vHr;3 zCQ{hDRpvgO^HoiwrsG>0_kXh-7b)~KrQp@(d?=__XJ*3OIw%j(FU~Zgp2e-%Q^Y$c zoA#E9C|1F1pTiGV>MkYHlJ4#p##QHxp=c;`#R>IFE*4-}F?uKE7?rICVn~n#q(0_O zZvWMi=IEb~{TwC*%Y}GeI$GcPhs!efv3R{3{!Hfm8M*0^J%YM9+6qtu!xl^qho)DaRra6}4($ZNTt{M0=3d&u zoW^~YML8~48Lod~q`C6GFC^7|ihR-{TW`t&gZ%ZWVA3_?2(wrRHpLf;fesRG)@W8} zOb4G1v+?PBpHC(bGcl;cN3q;GmpVVT7xD>Tn8rf#Xz4B-|5TNF3|!P74GC6)``)WE zao$EZt~TLPKk>nHEfkB+C6y>M+m_9TzK?G8Fr8b&+?sK(q|^px!Pdrl4&L)5GS#fT z7i#sm+ek_M+@0nmkAY?1Ir0gkoQgpZASLrUVogj@t-;{$>yh3W>fKIdO{3Vu-I|eQ z$5{3AQwoU@Xf?!yFA;5}7n+`iTHWflsIW$3TxWkX>y#&I|DjEneXewIXWMqiN?}WE z=ygK|*7FDDofx?7uoi7bG!hk6j7n(1aW^}2p5o+TIZowBtuj~KwpIw$t$O`sVqYg2 zT5b~he6F-NFGM>vQ7luVa96CxTsqv(J@z>%Tbs+Xvc2AB_eebeb^V2)>9&+@!_+la zr;b+BYm3Rd`=I3}?9xwHD#q9gFT;QJ1cckCrII3?Tiewu1O*r#=mkKd&2=3-J68Lh zB|;7Fx$c95?RYLwl?N`>!7z4hU z#G~(X=TzLozB}RBCrhv`cU}filW9dh&e^a48r7$Tr=Y2(`W#&ge7@+3#|b4g=AF#b zT~fa-vC3m7_NaC*L~8XJKHksG$6u4dr#j4v=JjI;$|!X*`Gzao-yl?rGJg!5Bg;8~ zmY?aYenZV>a&k}vJ4cr{t}9AMcLNw?UXxhi9teX007*MhXri@SN0|()FQW-swfv{y z_4Am*>KT4u`o7IEC=!*5fCcTnqV(yYnh1jmK`yOPPYx~)lAm5l>8+nCWU0ml>r6?DHJdsegQm$Rd*PE&k~a5Ww~%sb!Z0;wSe-tX&nxwXR5ek!-^YYO-ifyU zV>o><^O~n9EIY;%Kx#^=CGic_jO)~oJt5S$q z;x|rIn@NC2<9S6Qjhv}n6scA(l0V9BmIBLi^s1R!l=H*BAhFpDgNEXLjUlIT?frP8 z?7E$Mvllu|6L~f_z`zPLK@s{sxsk%9kL>|zlQrsgM-PhZaSWb$DwyQexOvep{DoNJ zhHg{cAXZmOxW=Zs-eR47FirBy-2TYd+EDJzIO4A<$9>SA{^eYB#O6H3%($VEiCeoE zyFu)NpZwP5^+bRWAR)XVG*j{p-G^y-_C)~cVYWH0lIrp4d?<&FZdgl+|7&a>${7;| zMu=dW#m?H}KQ|ZHPm0~a5p=!XtJxZoNauJ&x7QSP;ADM+{gdqB$~SFswkebBQqapMB!Loyn==GFnM zlP)L6Y&|+LhlUCsv8NtM%pQQepR(Y~rKVplZErXTuf9n@mrB;UGtkJYVt{9c90hrD z|6Mc-e)R>N288DKpjKSiKTbFf#^wAXyt;>fpwjNI%Kg~AaQ5QN{u~{2qi5=NO_wAQ zP5nlR0}NNiF{gB9y-AgxV-y@F;?Y|ED(x(3$C}q73DJ`cSVXt!3JM=RPgu>HF)% zkH=L@4f%&EyY+03B7HWW35Q7dEAr^qz@z43S9gea7|1zR!1;=XV$mFkZECxJ?G;>!WSX{V9U3{+S`(nUNUL#frHW~^=q~NeB$`eY&t$o}n)ET)fa90wtUc77r2Kpb3 zi>hR=Ih*tbVOG!x{;dHtMJr1-dB!z;@;fSS2#$Qt zc$GkO-H%JW3JBw=@#~3mh%_os@*L5`11fhNWvQN2N|S{3O_;?w^{EGF`>I9~cu78c zy&nqAK=`Won7efe8fup6CkmuY_Uns6Yk}`Cxd9TbXb0i;vz9Ojy4q4)YWomU!x&^vmSdLvM4k!XGfS@CHS@sM*T0??wO(jH(2*gqwWnbttzDRC zJe%wI%jxvh3yNoLl%DrIon$Ag`d6JE^}As6D#bhW(5?NmfiHd`_)j`VtXq9*cf~rA zWj^BgP!;sw`^6`VrTG>+IwbA+*MfwBnwFI2>iYMBzYRamuezbb1-#i$&VGXizx8f| zUheaq`RSo7WPqDs&ZC-PX6ZCg=Nj zvd3*k@RfHnDVy0(6u>Hq+_4fGwJv~FK8NfbLcdl4svK-b3Y6Vn<=lk;2&8$?r zdSH~Mj1o``d<>$e{3z^}Cc3`2{IpvVdAbwTCUSJH;^j@@G}!d9ODlzxDg)(5#2)73 z%DXYmW#O7}=aQoLBH>JQU2-Q9PwNk1cU`|nt9WTB0#~~GlJOAXfThuw+3a?^)!n5CT{FX=!X7mu!t z;f#aPWe0R&XYTN;{B$#Jx(7;`3LIHw4dH)+yi;`1f69Fh+;P+vhq&STXeiY$urrUfH8#eo zzRks~yb4HfbhbKOUw~#yx7+I&<`tKt7uDU--r`k%>Bg8a5_{q%pi)eyMzt5x zHgj4jk=B3Ok`vDjHDEbgo_Kj{%>5L_0&pc=Q+VoNI$6HA8Zg`3c}=OVY}27>^a~LS zI`Sj5J#Cz3N@~U`)1u-&s*x_TUvj`?SiDakns&s_l`fKr%6OxAT(T7@eRKtt+Q(Hx zBRY6L-yD=Ol&*sCY{gv>ssC`1L;z)1C0~4aSu$p!RV{5@Wf!Y7!9L6KIq?}Yi_lqV za8bIpKauUD9XhV9syCO7-$vxOW`8+WZqJsA!Lt46k_y~hdk^dKHsK$>l>VLIg zf0fKR?$Q&X?L473$DgAs#~9G(1B`x}o1zU}mo1s2w-LBbta6y`d!)d$E@xC*+?XwP zcv|_Nf|~$YGnTVdbWc&VP6+om=ZQJl_DoLD+im{_$JV23{eE8 z)BA#~f~MUz4At&u$I-n51>k7?q!t|e#@nHZSMhfxd}ITD%UH=$NLvmx!?VlKp1#Zx(@p&<3Rw)QhV`jB+$?wL@$45u_do@dri zr~B>xejT`8FM~&>!4h!{@|@g)vjXf|(dZ!^vuvfnW2M}1!T{cFw0){k7d>W*w;|&v z{Os&e*drC+UvealXxD1)`LNGr?%%E>me3wB=zOpQ+#7%H2L#ag_<^6`47xcZJ#XZFyVBTb5%M_$*wE@U$U#-4IMGm-x; zZx-YRZ${j>6=>7<*1hg43J1}1SIO+mKGx*eGMwZWrHn6WIOwwb$!|i=D4ga>P_Hv? z(R0Z}jf%9vMpDfx>@Lp9rz6@lAz)8pDD~LOJ`URN1!8m;o%gBz-k4lQcau`|Ev(_~ zOmEHjJ6|m8WV2%b;5Br8JXun2ho^Tb)9QTD@?@j&BUEI2#tR$FOrZ4#p+9QA-lM7R zPAkQl!Y$GYns})M1Lk`j7cvk-W_{3Uxle`-q~iAf8qNLIcK~DNMw_Gu_GL)FqihRF zV0q^5tL05J-0!mEcRt9w0$uU*LUU=jtH*kZ7sab%nq(HVK;AnYFmqpUt*1frInC;o(#p$I>D-IP(0b67Lki-3N8&~D3e1G+sUFL>*@vH}?GsW+cX;NrZ zhvBaX(+n!(D>}f?kBBf_>6$QT2jVn%UGT@R|| zk_;=IdF{8uTFs5w9mrWgvxPscapr{-h(Nw7)Ty>eX3SG3cGDHGB~c z0q|TKKExs3NT$tK3_}tkWab0tDJd-YqVnk%EZbl0pA;2S-&PwLzVgNOTo8-VX98r> z#loV{8?UB5D`wb)BOHgh;1|6vi#3kvkCuW1U=dL(bvKt$?z! zm}$*^L`%;BY{}5D0KxC3lYpyY*kGqLr@rsG^SQK01;V5J~CxybIr5p`eKN{?9Z#Iq|r@v%S+Xym}Z|3ukRodOl?hy<3L5FV$|H*p{SEp zEyGFlfio`Tn*i+fD`?y@=Amv_{CUE!1i7C^M*y!*Wu@Q6I>sg1lwJ&cZj0hdigI`8t zO`Z9dLRsDi?PHkU^`vbMl#bNgG`B9kaa8uLZY5mM8QB!|!@m zh!AlrDXrd+(9d$+YaO-HhbKE`GC;a>cqFkuc^-GTf^B@(-?2|y0iIr-(Nzy>%0zhK z8m)=PtZOD5m0}EVZlC1uH8={zZAM5T_4*}_+%4`J!LH1sdXJS_vP(Ne z0q3{4_+C?|_MIqsrB?k5lA~NL&HUM@p+Zq&ExwtSObRejSL<%wTpTnF)Ho;(8~&EsqPs18IG?0|%~r$EFG_r(SEiw4UaK zJKf`68#Z8cD}HJ-%>eMTN1FBb9Zm*%5u_IaQPf1zNQ>eZyOdvj(_4Frb|^6D8x{W= zm4zCO`?)_nmAI=vzQ<5$UdhmZU9kYXR5_`7r{&2K>8_%!F&;MM_)qTyF3246=?I+jN!FZ_In zX^lPLcXI@LKjpaEuVORPu-e2P;64J#WTq!LjgjvO!d0XiOPY5CwHfnf`u4llhQgYH z`#;mq?G?t?-`-K+`l(wiee-16P@ZR_M1Z15<2m76V>^HeT#0=L{cu4%svWQG@{1yN zq*2%l5(E0YiR{;VwtO2`*M*{TZRR8F>|XaW~(G;>{#*>4ARH9QxX z+!$v4m}$7IRZ2-4#Dh$A<3(9 zPeA$cR3140Nq_CHgA!0lV_>fsbLH&(&wF}W7k&6)MUf5@pl+edm?eFgMAK^x!83p! zI>N-$Q$R%LQwfkP&%QzR$b?~MvEqdQP_0Gff1r^|MVN$kT za~Bb?9d=0r*%vJF4h-UHAOUrpi;#TC#Q}Z+$d$z={-M@sWp#ag-GY&*Bmf^IL$cAc zm;4_2MKR;y4egu^40t%c;zOBD!dVC9Oa8;5NhK2nC)5sDcW^L%T?`t2YqV`*3OM4f z&@cLX925v)19>)D~`{!dLQ26m7O*`q-$)&ZN!mGg&TMhHGnzVN zLjM}DVVBs4`303HH|i?JbxmF@E=evhn~8tWNzMvVLe^S5KnZ=pptG^M$Fsb)FgaO6}0Zgh@3<5+&=LA^|raCxm!KJk>+N1b|1De;RkwUu^@ddD12RIy{rGXmTtaY0iAF z+tP2_NZyy$N$`0x2u_tPEsKnJgU7 z!e4f`#DQm2PY!?5KkzZxDV9b`20Gqms2FY`v~Dn|LnA{P?F|)pgl=U z)T-*ZAe5=0^|0~fPCsmbqx?50Y+;425_B}Mi;M>lF@w5dzsc<*9`~{bR|rc(DiN$^ z96$>?+XA7c+AE__qkn%Ig>Bpi@;jf@9U@(R{JheqOXP^CKvZ$K+#|WTpSf`MeDo1ag7&%Ly;E6L|J&7ApD7u z*^=|~S7#1uF0`P@Ey;FUjo92+CNZ*doTHsH-!E(X)-Asu>@LF~=Fa6FfCoRsx_1;VDK^ZWW)1Dg_HG@JW zu2rk|FEH546y()Fn$*C^u4Uc4#pRceGBpDD`cy8@Y7uahE!k-q4)5%V`F-5Pn*>Eb zbxtrz8mlK?voymq0^sBPweO85i}2E$8-Tb=RH)(ft9gh72#f zIPzn(xB!NT5^#192xw`K0i>GFJK^_@Vq6|QWR|rgCy@;HE}S6o?{e&*r5mRg2teBl$Mtti^=d#`;(eIxUucDw;n!7V+(_)G_2M_8Vc){d`QqS?pJ) z62tziRWy7Ui^ye_JT*|y6a9S5@XYDpP;cMIEybEqyLu7;GmsDY`E0aQ6hdkMnE~N~ zzZ4!3u6J|qG%5F+iPCeq@}Ihz%XNBIhm)P;W3sbz)D2@)%?SmhX9b^E+CDjrr2E=8 zR@)Ftgs6|WQ7@Lr1MduAu=$C)gDRgs-E2H|D5uR0Sa%~UBgDH>1hQ0}Z5Wkj_RBNO z^fk&A*TIJPS`bY_otCQ0#1P$}uy2PqK??XE0`WNfHW0V~&KjPVDC*~U zw65=?*QYM~I`Ym<0W93j@5-!h?5e{3{k)94g_(8Xi=|aQ2Wt*({*dLP z!+|*D?A|M0sh3gHHwGlz)Y_c+U?-f90X^Iovey+~3zL)o?kxPcm_L0sLdm zt>bph^5=J_ZcN4h5DonfFD`o$0Y4)6R1B%Fp>VtJTOMSR3%(}nodX6|LzPjXe*nG} zm`P6vwS(^!aZl*)1&1{JKwPyb!|E)t&Pk8(mdGbJfORs~1F{NnSS?Q~N^kk~{$Mf+ zkLj`qDrz0~3ScA)!%{!g0n-2rh%PXdlPGAem^&Oh+46Z0lqquLO-#b41O?de)?t(V z#glR2R4)ay>Nna_FuvZr0DoW777)H)2nj1DJ?26-xw63#HKxfZ4F?iWgYr%!ur2_^ zK~8n!@S|{Vi!_3Z8&Cy%y@2ps$G23x|3xp)(*!xzP}ht3@ZOU1e+k41dNeRQfY4am zDV3!?^K2ooWa#2QjuD|#!&kVOUMHVsI2s|U9i*0r!_4BV9uX7vcj$c|FX#+eY=RW8 zRPO`lgmADuV99UR8BAPkW8nlR!O||*q5aAPB>kO&G}^a7)SBapFi7geg@;Jy>^^EJ zn@+y1EDMlnjF$WRD_-6FA#-0Ceu@9EaTl@S`pj^u5!3U9pFMZGmDz_FYkMjCcporyZ09u@xOA}6!vM|>RiwCCn>y9Wn@ zul;?Hw0_;t_Sn)!OW>^OFv!%g06c8YgfRiz87|@pf@5}s7X6+!B2>{0Xiv%9u;%`X zIwuxmJ^SznbB~xl4{w89>a~V=k@v0+QL|zeDdQ>bJ%Cl7!_E+w>|7YULVW{O4udkC zB1u;~q=CQZbVDv_RFL6#9}uTXM#Zg9AMs+_n9BMTxNl zk?-OVwftJso^6u7eXu;kUP;uJkD>4iT|ms}eL_EXY7|fG2Ev($x!~s*<8o1kr*jiG z(eY|kGvS9?N$2u3F8~V60YQ;$=Yqk0Z3bY|%x*fQSVguqK7{(LRAEG|a;H+9`DW~V zAQLCNu%1|{w{6e@@YR3121&v9CS<205_zSA7Xw4QbbF7gZnLj9F!R8FY*}(Ou@wvc zrP(raYcB6PUc^BE20c9o&^$o0!CK5=cOCis=dJEv1&CcKmi+a)uovIvA;9jhPHEkz zb;gfmC{x^=+R6i&nJ$)oa_7@md&T9VvA)@CfOIAG#kB9n<%Snqi-Qk&O5U7(;b9bX zTZI_o6usQtcqrWV7jvS!5m#I@oFi^p>rjsK8Ilp+v4o1<$Q@Q8u?eI>`Qp7af_@u>|{D{!I z%vrZxWA~E(Q*~ma^U&6xv&ok@boVwe@A-Lt2~e1SDGlr^NAo2U?gfTB=w_@120v!y zWbY3r6|WCfBNWo1S2i0J`H_zwzjSD+-Lyfn2c7X6N%LaY*@#1P{@ea;nITEVV?7Ty ziZ%F-S$hk^Cd`a4bQ4uUlX!K2XSKAQ+{`ez77NqTGf(tz16e&X)B9bN#E^_c?CTWF zuk+&ldph$Xm-YU@pTxxEghvd(SLcxt$$eTUmm zrBi`I^@&LzITtLvpe>NqEZGqN;5?H%w=;TS)Q_UBgVjd5oCqT^Tf66uw+J9q;UPVz zNOq(|t9GRp2+C#yEhF`6ZxH-f1kz&PX(%cYg8=vc`r=V~^>#ol2VyonNQ!9X(;WDw z2&~ME3GA|R)4bF)q^yexkc#&^cIXNS$c-1rQniOAxB@Z~fgG2U>zJ!k1WBC+$cN}0 z;`>?`sg;@Pela#ex4NGMQQLVLTa_$M=$jF#_S)-9Ifjwa6ihu2?V__fYeMK zU&LM}j$t*)&+rRC1;;?t2hh1Ihij(C0(`wqARCYLz|SUG&a%=;uW3%_(v@@Ra8I#a zPfc5=6+qB-8FxzEvhxdInE3JlK}PhXe}kz$eB^`_!)RNr&4p~1w+XTM;nb0iTM}fW z9c2snXLTz_nA5M8mX>JWi!w&ssL1s{=mENKjl9=?D=^D2dzZ z7#)jdt%|VURDr`~AAe}6f5f(TS~Eqou6plRt-9r=A9V#+rs~+=t_WN`4bBxTXAr{$ zL3($Hn&H>L1$#}TNN^z=z^aQOYCvhO^0)4`OEb2Xc8P=;(hRT+8M%B4b*V(hB(v6K z_FP6aS0-lk8G%?|10Nw-<=Py&z)z#@YUx+)OvB{~)P;FN+f%6RJWyAi|2=|@X5jO9 zf>`%EO&vy_HU@dbIbVL^ejhJUVHiMvL%LPB6eh*+ai&?+J5bZ%iYGMQ6pS6dZ(|ICDheM?=a>9r2mD((4 z=m{daZ)zR5M&wvHt_6WlShbr;HeE;)Y>n;s6rDKQp#+`=r&OQxh?2 z4f#s=x)~9WaeE*RhErP*+DsuCKsuC#D+C+ig)@Xqb4>+WwUFHBd*g)M#A%>CY6H2D=EK<8{e=}gNY!r*2et^3_)XL_n7`TU;xBiB z%kmxOd0zES8}ZzuQsde$Sum9goXZ+FxJwBlK1J%nhD) z{V~P#7hylx{U$ab6MN3Ma&%Ha>syV0T#^6}^|BZ^2iBf({~I6~o9*Nj3w1C=7j7fEI|8N;cTg02dN`P{SYWu&FE2kZvF~}4C>?|soRWny%{N5*tASWl=P|MR#jz_@*{d}K zRf#7Qu%BAqNIxeQj_<2%ivkh5WYNRBv5DNE32P0Jy)&x9=u7!^a3n#Z4QNLt&_Ghq z_pwi|C{<)g(<#7FyKK^Q$KC({oRNNDK_G4fd3KfcjI@1%HQNa`7(B-YbTa@3p~=Lh z#h*lhY(6}&X}xHO1&RcEMy1cw`aT{*@5!YSkhk<|nh1VPn z%K&tT?RK_`*Xb*FH&a5A%;acTNzb$z@lXIA_EM_Y4wg+k2SUo|^Y7BHESn6mhQ>eJ zHv58TcR>8z#J$XnNA!~j+wqdJv}0UI>Z5|}Z`ODBisSAb6bGPLwdSZJ8`I@RL0p3a z9Xqh$a}vAGg!IYHJ|wt!VCNi!%$BLp4@AF$fMM z-GBC_l7G!>TLHcYVKO8i9G$+XjeIm=;Wz_FbL|aVG8D#?&x3Po8%L*Kv)Jmp*32c7 ziIb#Z%{hrOJp=Fm0@JxTc+P=f)8+(-?~bc8*+<`MdHLb{oM^X0FZqE#AHh~~x=QQ2 zZ@s^K@~y8nS?Ae`@8zp?*l*59p@AazF3uIUU*KcR{wN-bHb%&^2rX< zg8;Bpy|S`b82K2J`6gm6aa5C`_>`l6)l~uWX!Z!Tt}~qK8HPIa2Vkv!2|=V4>%1x{ zEEe~D((dLAKm61U?ED3$ATy)@6;Q|>1TiaqJ%m^B1@A7TSt%&{qGXN+NVeaZPPEm~ zm&vGfZv$W|qd+@m2G{87i+;Dh5d>ZWX$G4a_9h0i=PUp>;@pj~a$wMFiYinQ>C2A@wI=k3J=&v8~Su3ae@ZV)N8z?}3}tg#`yXYJJ7__wBwmSk$4e zpU$aPd!v=e-lAIrId>9g5e zD@U9n<{#A?NPQ5gGvFNtwaxH6GCYWV)0p3Vd6y**;uUvtPMu~jvQ)_(Kz?i=6zxh* z+Cq%!(^39wWTG^4^o^?n?avB~`a;h1YD=y0y$l@zWK$O1JA%}q^?hR>P`WpAd-I5f zy=W>e0PF4=;DLxiQp&PIKRhH_OivU`UH>J0WN%=JZ+`X&PQQAl*cuTteV#|%}UeYa2`_*}jG+V%;s zS>Z>kc8E?@ZZN4yVu-TYg`*Mr<@5|rc%$E_W0U&gnbGdxNV=qd(i!lF#RUb#)w19wxCu0Ex*)*X_N`{tXjGpL!>Dy7S&? zE&_}3O~2Er*YP~iWnL#iCXNp|kpJ&rB@l%wIFa&^Hv36_zX8HkHKPXYJ)M5)+e8*J z)Hn43iPhg*33{r+?&3w4Fc6j@TkrWU$uK%nmgHsujf|}=7Ql-UL1df6D(~(fh(#N6 z$!ApseQU-{4Kr7sMZG;5`>sp?WW3YOwq6Xr!Y%^q$4i!WigL?CJg2S3wpS)v-$a}7 zVh9H88^m3=_z|Avvu#EY)xFE;h%ne(+zn4{KA1WWOQZg>h#$>>&~DWy=b=C zW0fwZFP$3rlJ4D`ugTNt#_Z>9=6(IUwL09${#Fc#tFG-!z?Au6iYB-q(fU;SB12h+ zHxtYjlZ!Vqq$T+=p6IM$;JJ}`j)*tU>&WrjDR@qZC=J(Opwl)~g5&hJ8ozPfk*@Lj z>hBK%PlpoO9H>3?P4h&O?6lCEx!~mpQXd?28c%z*;l2aX*>Q%@!UGt%I(KFksc$$| zHx?ak;(j!=v5r>lLTC{{r~0ZO`g(|c{&`khJ%1_BD1Hfvq;-P;7L!we9QhJ%ZSQz;DLw`O;~{ zx<`q^`8z?bO0eU#=4?&;TM^^{7v}If8hMn3yRNcd7F6hNGp+gt9MpSSw_LXa*W=WJ zK@!t{7}jGsOgWH#CXQfspBL7(MHg)$AtYZ91}fYP@!h{Nfj7G!cuaVL&t?v7=_K`i zO?(1^1Q#jbkMf~?4{Fx_hFzE(Bqe$uGtopBwUDX7^ush^b$*owfSQ zG5hmCYy|B!JfN;oZ<9l1Ii4p=u_$`rLoS#mw^}3A*b1BLsx_v^K>cHts^9$Fz!pIt zV%9vlW#5}_1UyV?$cdwlVm6$e>(Eu}cV$=qnTc<~GTa1P(NC2&02$7;PbuGUQlKzU z2>3w@#IqJPGBfeDHm?2!tFB3c`X)eywc7vtE7W+gQFafkCsEKXwdY)1gB}y@Is?vm z&Nhm!;HrS*?^4k9)8)yj*K&b0vN;R)K|)E2X8Jo&ki&uO5HfcIC$|#!!!mbQdtkL7 z(7sdkfIep1KNK6{5_o5HJ-TdTc|aGSZ3iCzYU@B7XTrB|W9sd|r=Y8@tDnTaVlR`R<<@7_+#zX}3Y;SK9?%guWxk_P<{Vxsb#C6j}Y!P4;wh zYf=_^7Z?RlT~(Ld*bogHppv}$}>d__uyU8}xswJld4sZ~lmZko6y(40d?7CjVbPy585s)s|CV8?uFBylMY!fd0o@SEuklovoz6 z|F6paQ;F60{!fn=Mt>Dm;`;LEz32-1yDYR*{;Sqt@%~+D(C)rJx3Agk+STfcvDW1O z_BOO@{;SCNJHKyPwfuke-k)25ZU58V+3oZ{Z$+p1KW_!o?Dv2Gv;WhoKV|){=Kufq g|JotPYFEPEB1ODYS<^}2xBNKFO|1_W8=sB%U*wA9wg3PC literal 0 HcmV?d00001 diff --git a/lib/constants/app_theme.dart b/lib/constants/app_theme.dart index f08b073..6d36279 100644 --- a/lib/constants/app_theme.dart +++ b/lib/constants/app_theme.dart @@ -164,16 +164,33 @@ class MyAppStyle extends ThemeExtension { final BoxDecoration? bottomButtonDecoration; final TextStyle? bottomButtonText; + ///输入框提示文字 + final TextStyle? hintText; + + ///浅黑色 (用于没有焦点的文字或者线条等 + final Color? lightDark; + + ///标题文字 + final TextStyle? titleText; + @override - MyAppStyle copyWith( - {Color? mainColor, - TextStyle? bottomButtonText, - BoxDecoration? bottomButtonDecoration}) { + MyAppStyle copyWith({ + Color? mainColor, + TextStyle? bottomButtonText, + BoxDecoration? bottomButtonDecoration, + TextStyle? hintText, + Color? lightDark, + TextStyle? titleText, + }) { return MyAppStyle( - mainColor: mainColor ?? this.mainColor, - bottomButtonDecoration: - bottomButtonDecoration ?? this.bottomButtonDecoration, - bottomButtonText: bottomButtonText ?? this.bottomButtonText); + mainColor: mainColor ?? this.mainColor, + bottomButtonDecoration: + bottomButtonDecoration ?? this.bottomButtonDecoration, + bottomButtonText: bottomButtonText ?? this.bottomButtonText, + hintText: hintText ?? this.hintText, + lightDark: lightDark ?? this.lightDark, + titleText: titleText ?? this.titleText, + ); } @override @@ -187,6 +204,9 @@ class MyAppStyle extends ThemeExtension { bottomButtonDecoration, other.bottomButtonDecoration, t), bottomButtonText: TextStyle.lerp(bottomButtonText, other.bottomButtonText, t), + hintText: TextStyle.lerp(hintText, other.hintText, t), + lightDark: Color.lerp(lightDark, other.lightDark, t), + titleText: TextStyle.lerp(titleText, other.titleText, t), ); } @@ -194,19 +214,27 @@ class MyAppStyle extends ThemeExtension { this.bottomButtonText, this.mainColor, this.bottomButtonDecoration, + this.hintText, + this.lightDark, + this.titleText, }); MyAppStyle.def() : mainColor = Colors.blue, - bottomButtonDecoration = - BoxDecoration( + bottomButtonDecoration = BoxDecoration( gradient: const LinearGradient( begin: Alignment.centerLeft, end: Alignment.centerRight, - colors: [Color(0xFF0593FF), Color(0xFF027AFF)]), - borderRadius: BorderRadius.circular(8.w)), + colors: [Color(0xFF0593FF), Color(0xFF027AFF)]), + borderRadius: BorderRadius.circular(4.w)), bottomButtonText = TextStyle( - fontSize: 30.sp, - color: const Color(0xFF333333), - ); + fontSize: 14.sp, + color: const Color(0xFFFFFFFF), + ), + hintText = TextStyle(fontSize: 18.sp, color: const Color(0xFFCCCCCC)), + lightDark = const Color(0xFFCCCCCC), + titleText = TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.bold, + color: const Color(0xFF111111)); } diff --git a/lib/extensions/list_ext.dart b/lib/extensions/list_ext.dart new file mode 100644 index 0000000..7b26015 --- /dev/null +++ b/lib/extensions/list_ext.dart @@ -0,0 +1,38 @@ + +extension ListExt on List { + List sep(T sep) => _sepIterable(sep).toList(); + + Iterable _sepIterable(T separate) sync* { + final it = iterator; + if (!it.moveNext()) return; + yield it.current; + while (it.moveNext()) { + yield separate; + yield it.current; + } + } +} + +extension OddListExt on List { + List oddList() { + List newList = []; + for (var element in this) { + if (indexOf(element).isEven) { + newList.add(element); + } + } + return newList; + } +} + +extension EvenListExt on List { + List evenList() { + List newList = []; + forEach((element) { + if (indexOf(element).isOdd) { + newList.add(element); + } + }); + return newList; + } +} diff --git a/lib/extensions/num_ext.dart b/lib/extensions/num_ext.dart new file mode 100644 index 0000000..08e20c2 --- /dev/null +++ b/lib/extensions/num_ext.dart @@ -0,0 +1,8 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +extension NumExt on num { + Widget get wb => SizedBox(width: w); + + Widget get hb => SizedBox(height: w); +} diff --git a/lib/gen/assets.gen.dart b/lib/gen/assets.gen.dart new file mode 100644 index 0000000..b210e6b --- /dev/null +++ b/lib/gen/assets.gen.dart @@ -0,0 +1,95 @@ +/// GENERATED CODE - DO NOT MODIFY BY HAND +/// ***************************************************** +/// FlutterGen +/// ***************************************************** + +// ignore_for_file: directives_ordering,unnecessary_import + +import 'package:flutter/widgets.dart'; + +class $AssetsIconsGen { + const $AssetsIconsGen(); + + /// File path: assets/icons/personal_select.png + AssetGenImage get personalSelect => + const AssetGenImage('assets/icons/personal_select.png'); + + /// File path: assets/icons/personal_unselect.png + AssetGenImage get personalUnselect => + const AssetGenImage('assets/icons/personal_unselect.png'); + + /// File path: assets/icons/work_stage_select.png + AssetGenImage get workStageSelect => + const AssetGenImage('assets/icons/work_stage_select.png'); + + /// File path: assets/icons/work_stage_unselect.png + AssetGenImage get workStageUnselect => + const AssetGenImage('assets/icons/work_stage_unselect.png'); +} + +class $AssetsImagesGen { + const $AssetsImagesGen(); + + /// File path: assets/images/app_title.png + AssetGenImage get appTitle => + const AssetGenImage('assets/images/app_title.png'); + + /// File path: assets/images/home_bg.png + AssetGenImage get homeBg => const AssetGenImage('assets/images/home_bg.png'); +} + +class Assets { + Assets._(); + + static const $AssetsIconsGen icons = $AssetsIconsGen(); + static const $AssetsImagesGen images = $AssetsImagesGen(); +} + +class AssetGenImage extends AssetImage { + const AssetGenImage(String assetName) : super(assetName); + + Image image({ + Key? key, + ImageFrameBuilder? frameBuilder, + ImageLoadingBuilder? loadingBuilder, + ImageErrorWidgetBuilder? errorBuilder, + String? semanticLabel, + bool excludeFromSemantics = false, + double? width, + double? height, + Color? color, + BlendMode? colorBlendMode, + BoxFit? fit, + AlignmentGeometry alignment = Alignment.center, + ImageRepeat repeat = ImageRepeat.noRepeat, + Rect? centerSlice, + bool matchTextDirection = false, + bool gaplessPlayback = false, + bool isAntiAlias = false, + FilterQuality filterQuality = FilterQuality.low, + }) { + return Image( + key: key, + image: this, + frameBuilder: frameBuilder, + loadingBuilder: loadingBuilder, + errorBuilder: errorBuilder, + semanticLabel: semanticLabel, + excludeFromSemantics: excludeFromSemantics, + width: width, + height: height, + color: color, + colorBlendMode: colorBlendMode, + fit: fit, + alignment: alignment, + repeat: repeat, + centerSlice: centerSlice, + matchTextDirection: matchTextDirection, + gaplessPlayback: gaplessPlayback, + isAntiAlias: isAntiAlias, + filterQuality: filterQuality, + ); + } + + String get path => assetName; +} diff --git a/lib/main.dart b/lib/main.dart index 427fe9e..e2531fe 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -50,7 +50,7 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (context) => UserProvider()), ], child: ScreenUtilInit( - designSize: const Size(750, 1334), + designSize: const Size(375, 812), builder: (context) => GestureDetector( onTap: () { //点击输入框外部隐藏键盘⌨️ diff --git a/lib/ui/home/home_page.dart b/lib/ui/home/home_page.dart new file mode 100644 index 0000000..8e40539 --- /dev/null +++ b/lib/ui/home/home_page.dart @@ -0,0 +1,47 @@ +import 'package:cloud_car_internal/gen/assets.gen.dart'; +import 'package:cloud_car_internal/utils/user_tool.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class HomePage extends StatefulWidget { + const HomePage({super.key}); + + @override + _HomePageState createState() => _HomePageState(); +} + +class _HomePageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: Colors.transparent, + title: Row( + children: [ + Text( + 'HI,张三', + style: UserTool.myAppStyle.titleText, + ) + ], + ), + centerTitle: false, + ), + extendBody: true, + extendBodyBehindAppBar: true, + body: Stack( + children: [ + Assets.images.homeBg + .image(fit: BoxFit.fill, width: double.infinity, height: 200.w), + CustomScrollView( + slivers: [ + SliverGrid.count( + crossAxisCount: 4, + children: [], + ), + ], + ), + ], + ), + ); + } +} diff --git a/lib/ui/login/login_page.dart b/lib/ui/login/login_page.dart index 2f7a6fb..a0695f9 100644 --- a/lib/ui/login/login_page.dart +++ b/lib/ui/login/login_page.dart @@ -1,4 +1,12 @@ +import 'package:cloud_car_internal/extensions/num_ext.dart'; +import 'package:cloud_car_internal/gen/assets.gen.dart'; +import 'package:cloud_car_internal/ui/tab_navigator.dart'; +import 'package:cloud_car_internal/widget/buttons/cloud_bottom_button.dart'; +import 'package:cloud_car_internal/widget/scaffold/cloud_scaffold.dart'; +import 'package:cloud_car_internal/widget/text_filed/account_input_text_field.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; class LoginPage extends StatefulWidget { const LoginPage({super.key}); @@ -10,6 +18,41 @@ class LoginPage extends StatefulWidget { class _LoginPageState extends State { @override Widget build(BuildContext context) { - return Container(); + return CloudScaffold( + appbar: AppBar( + title: const Text(''), + backgroundColor: const Color(0xFFF9F9F9), + ), + body: SafeArea( + child: Column( + children: [ + 40.hb, + Assets.images.appTitle.image(width: 150.w, height: 30.w), + 70.hb, + Padding( + padding: EdgeInsets.symmetric(horizontal: 32.w), + child: AccountInputTextField( + hintText: '请输入账号', + onChange: (text) {}, + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 32.w), + child: AccountInputTextField( + hintText: '请输入密码', + onChange: (text) {}, + ), + ), + 48.hb, + CloudBottomButton( + onTap: () { + Get.offAll(const TabNavigator()); + }, + text: '登录', + ), + ], + ), + ), + ); } } diff --git a/lib/ui/personal/personal_page.dart b/lib/ui/personal/personal_page.dart new file mode 100644 index 0000000..3d0331c --- /dev/null +++ b/lib/ui/personal/personal_page.dart @@ -0,0 +1,16 @@ +import 'package:cloud_car_internal/widget/scaffold/cloud_scaffold.dart'; +import 'package:flutter/material.dart'; + +class PersonalPage extends StatefulWidget { + const PersonalPage({super.key}); + + @override + _PersonalPageState createState() => _PersonalPageState(); +} + +class _PersonalPageState extends State { + @override + Widget build(BuildContext context) { + return CloudScaffold(); + } +} diff --git a/lib/ui/tab_navigator.dart b/lib/ui/tab_navigator.dart index d071ba3..623c265 100644 --- a/lib/ui/tab_navigator.dart +++ b/lib/ui/tab_navigator.dart @@ -1,15 +1,112 @@ +import 'package:bot_toast/bot_toast.dart'; +import 'package:cloud_car_internal/gen/assets.gen.dart'; +import 'package:cloud_car_internal/ui/personal/personal_page.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +import '../utils/user_tool.dart'; +import 'home/home_page.dart'; class TabNavigator extends StatefulWidget { - const TabNavigator({super.key}); + final int? index; + + const TabNavigator({ + super.key, + this.index, + }); @override _TabNavigatorState createState() => _TabNavigatorState(); } -class _TabNavigatorState extends State { +class _TabNavigatorState extends State + with SingleTickerProviderStateMixin { + TabController? _tabController; + int _currentIndex = 0; + DateTime? _lastPressed; + + //页面列表 + List get _pages => [ + const HomePage(), + const PersonalPage(), + ]; + + @override + void initState() { + super.initState(); + + _tabController = TabController( + length: _pages.length, vsync: this, initialIndex: widget.index ?? 0); + } + + _buildBottomBar( + String title, + String unselected, + String selected, + ) { + return BottomNavigationBarItem( + icon: Image.asset( + unselected, + height: 44.w, + width: 44.w, + //color: Colors.black38, + ), + activeIcon: Image.asset( + selected, + height: 44.w, + width: 44.w, + ), + label: title, + ); + } + + late bool isOpen = UserTool.userProvider.userInfo.level < 0; + @override Widget build(BuildContext context) { - return Container(); + //底部导航来 + List bottomNav = [ + _buildBottomBar( + '工作台', + Assets.icons.workStageUnselect.path, + Assets.icons.workStageSelect.path, + ), + _buildBottomBar( + '我的', + Assets.icons.personalUnselect.path, + Assets.icons.personalSelect.path, + ), + ]; + return Scaffold( + body: WillPopScope( + onWillPop: () async { + if (_lastPressed == null || + DateTime.now().difference(_lastPressed!) > + const Duration(seconds: 1)) { + //两次点击间隔超过1秒重新计算 + _lastPressed = DateTime.now(); + BotToast.showText(text: '再点击一次返回退出'); + return false; + } + //否则关闭app + return true; + }, + child: TabBarView( + controller: _tabController, + physics: const NeverScrollableScrollPhysics(), + children: _pages, + ), + ), + bottomNavigationBar: BottomNavigationBar( + items: bottomNav, + backgroundColor: Colors.white, + currentIndex: _currentIndex, + selectedFontSize: 12.sp, + unselectedFontSize: 12.sp, + onTap: (index) { + _tabController!.animateTo(index, curve: Curves.easeInOutCubic); + setState(() => _currentIndex = index); + }), + ); } } diff --git a/lib/widget/buttons/cloud_bottom_button.dart b/lib/widget/buttons/cloud_bottom_button.dart index f2f2e38..f69ecad 100644 --- a/lib/widget/buttons/cloud_bottom_button.dart +++ b/lib/widget/buttons/cloud_bottom_button.dart @@ -25,8 +25,8 @@ class _CloudBottomButtonState extends State { color:Colors.transparent, child: Container( alignment: Alignment.center, - padding: EdgeInsets.symmetric(vertical: 15.w), - margin: EdgeInsets.symmetric(horizontal: 32.w), + padding: EdgeInsets.symmetric(vertical: 10.w), + margin: EdgeInsets.symmetric(horizontal:16.w), decoration:widget.decoration?? UserTool.myAppStyle.bottomButtonDecoration!, child: Text( widget.text, diff --git a/lib/widget/scaffold/cloud_scaffold.dart b/lib/widget/scaffold/cloud_scaffold.dart index 9479d03..a804145 100644 --- a/lib/widget/scaffold/cloud_scaffold.dart +++ b/lib/widget/scaffold/cloud_scaffold.dart @@ -49,7 +49,7 @@ class CloudScaffold extends StatelessWidget { extendBody: extendBody, body: body, appBar: PreferredSize( - preferredSize: Size.fromHeight(176.w), + preferredSize: Size.fromHeight(88.w), child: title == null ? appbar! : AppBar( @@ -62,7 +62,7 @@ class CloudScaffold extends StatelessWidget { style: TextStyle( color: Colors.black, fontWeight: FontWeight.bold, - fontSize: 32.sp), + fontSize: 16.sp), ), actions: actions, ), diff --git a/lib/widget/text_filed/account_input_text_field.dart b/lib/widget/text_filed/account_input_text_field.dart new file mode 100644 index 0000000..7cc228b --- /dev/null +++ b/lib/widget/text_filed/account_input_text_field.dart @@ -0,0 +1,22 @@ +import 'package:cloud_car_internal/utils/user_tool.dart'; +import 'package:flutter/material.dart'; + +class AccountInputTextField extends StatelessWidget { + final String hintText; + final Function(String) onChange; + + const AccountInputTextField( + {super.key, required this.hintText, required this.onChange}); + + @override + Widget build(BuildContext context) { + return TextField( + onChanged: onChange, + decoration: InputDecoration( + border: UnderlineInputBorder( + borderSide: BorderSide(color: UserTool.myAppStyle.lightDark!)), + hintText: hintText, + hintStyle: UserTool.myAppStyle.hintText), + ); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 3d83238..e5ca20d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -83,4 +83,8 @@ dev_dependencies: flutter: uses-material-design: true - + generate: true + assets: + - assets/ + - assets/icons/ + - assets/images/