From 658da282fe687ec2247652de928fb11162282fc8 Mon Sep 17 00:00:00 2001 From: fmk Date: Thu, 8 Jul 2021 17:37:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../image/2x/icon_permission_location_bg.png | Bin 0 -> 17328 bytes .../image/3x/icon_permission_location_bg.png | Bin 0 -> 32946 bytes assets/image/icon_permission_location_bg.png | Bin 0 -> 7644 bytes ios/Runner.xcodeproj/project.pbxproj | 3 - lib/generated/intl/messages_en.dart | 2 + lib/generated/intl/messages_zh_CN.dart | 2 + lib/generated/intl/messages_zh_TW.dart | 2 + lib/generated/l10n.dart | 20 + .../integral_store_details_page.dart | 88 ++- lib/l10n/intl_en.arb | 2 + lib/l10n/intl_zh_CN.arb | 2 + lib/l10n/intl_zh_TW.arb | 2 + lib/order/exchange_order_page.dart | 51 +- lib/retrofit/data/activity.g.dart | 44 ++ lib/retrofit/data/address.g.dart | 40 ++ lib/retrofit/data/banner.g.dart | 38 ++ lib/retrofit/data/base_data.g.dart | 30 + lib/retrofit/data/brand_data.g.dart | 33 + lib/retrofit/data/coupon.g.dart | 64 ++ lib/retrofit/data/coupon_vo.g.dart | 67 ++ lib/retrofit/data/data_type.g.dart | 18 + lib/retrofit/data/delivery_info.g.dart | 30 + lib/retrofit/data/exchange_order.g.dart | 45 ++ lib/retrofit/data/exchange_order_goods.g.dart | 53 ++ lib/retrofit/data/member_rank.g.dart | 33 + lib/retrofit/data/page.g.dart | 30 + lib/retrofit/data/promotion.g.dart | 67 ++ lib/retrofit/data/sign_in.g.dart | 46 ++ lib/retrofit/data/sign_info.g.dart | 32 + lib/retrofit/data/store.g.dart | 76 +++ lib/retrofit/data/store_info.g.dart | 93 +++ lib/retrofit/data/store_type.g.dart | 18 + lib/retrofit/data/task.g.dart | 42 ++ lib/retrofit/data/upload_result.g.dart | 67 ++ lib/retrofit/data/user_entity.g.dart | 39 ++ lib/retrofit/data/user_info.g.dart | 48 ++ lib/retrofit/data/verify_code.g.dart | 33 + lib/retrofit/retrofit_api.g.dart | 617 ++++++++++++++++++ lib/union/union_page.dart | 179 +++-- lib/view_widget/loading_view.dart | 1 + lib/view_widget/request_permission.dart | 123 ++++ pubspec.lock | 9 +- pubspec.yaml | 2 + 43 files changed, 2075 insertions(+), 116 deletions(-) create mode 100644 assets/image/2x/icon_permission_location_bg.png create mode 100644 assets/image/3x/icon_permission_location_bg.png create mode 100644 assets/image/icon_permission_location_bg.png create mode 100644 lib/retrofit/data/activity.g.dart create mode 100644 lib/retrofit/data/address.g.dart create mode 100644 lib/retrofit/data/banner.g.dart create mode 100644 lib/retrofit/data/base_data.g.dart create mode 100644 lib/retrofit/data/brand_data.g.dart create mode 100644 lib/retrofit/data/coupon.g.dart create mode 100644 lib/retrofit/data/coupon_vo.g.dart create mode 100644 lib/retrofit/data/data_type.g.dart create mode 100644 lib/retrofit/data/delivery_info.g.dart create mode 100644 lib/retrofit/data/exchange_order.g.dart create mode 100644 lib/retrofit/data/exchange_order_goods.g.dart create mode 100644 lib/retrofit/data/member_rank.g.dart create mode 100644 lib/retrofit/data/page.g.dart create mode 100644 lib/retrofit/data/promotion.g.dart create mode 100644 lib/retrofit/data/sign_in.g.dart create mode 100644 lib/retrofit/data/sign_info.g.dart create mode 100644 lib/retrofit/data/store.g.dart create mode 100644 lib/retrofit/data/store_info.g.dart create mode 100644 lib/retrofit/data/store_type.g.dart create mode 100644 lib/retrofit/data/task.g.dart create mode 100644 lib/retrofit/data/upload_result.g.dart create mode 100644 lib/retrofit/data/user_entity.g.dart create mode 100644 lib/retrofit/data/user_info.g.dart create mode 100644 lib/retrofit/data/verify_code.g.dart create mode 100644 lib/retrofit/retrofit_api.g.dart create mode 100644 lib/view_widget/request_permission.dart diff --git a/assets/image/2x/icon_permission_location_bg.png b/assets/image/2x/icon_permission_location_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..18d4d4538644ee98f26b34184bf99569775f1cfa GIT binary patch literal 17328 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 O07}o)5!JF5ul@&=O(FpR literal 0 HcmV?d00001 diff --git a/assets/image/3x/icon_permission_location_bg.png b/assets/image/3x/icon_permission_location_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..b992f9a34ed13ba94e58833998ee3710fcfc54e6 GIT binary patch literal 32946 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∼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

xN^*{(Kx9A1BbY zP8M@SrAc{^A9KpgIcO)w$6G<){bl_Qw`a<<$_#DAGXk`^K%jW*YT|MjSn1(MP+*}x zU(xr;h>5S=$Rz}B2qy{VB!Ahm=phnnG#Sz(4CCv0+=3M%6as^Mb}ex) z;Z)QZF*aTd#&^#*6vHJnzsw8~qf8OdY5SbRcYz2WXa(EPF!zZY*R?f4)ha#fDF$NP z#(tU0^PA`#M>)A_+qgR}+S zVV>`)mk5XBU)0@2XR7GG4_8Z*5Uyxx@g;?t@Q};@Jf9z+lEW~=5OeQ+F&i=$_s}3WIo&u7yc14T z^ZPi@JDi-BM!*n4X);pjE|~POS4Ou(-<8|tm?iuHyXnK6!*MpoT^ItXhz+MUX(})J zTfcc&)W5;U5_1wUp3tli)D(hg0oah{tgLy5ZzW1Npc!&G(2SgbGAn2XOPWL6eaHB{ zRq~e*6R#MI9b1-pdsNaOT@1Myd+P;CRrv!aup_t!G7+^vxVpcgLBiEN{%SX5yAr&A z);iRLFn;d{6!^wLRrEtmGa+(D0sTeJLZ2X2u7etyRR_Yf(I7eJOW6|bm`1kx3kSp! z^~SO0m<5H*?Cij3`7Pqm_Vv)e0>?KBrTSR}AjlST{LJ2d`wq~o*?bvgWg3R)=Dk{W ztfkF`NLggjOBH5aRG{GQiPGIbRCPo+QMhA6FMxPE-SR-j!0x@@S9XK`;5KZCJRx@Y zJ4j*E2Bht2k)RCGY=u%!M#y%M=Ke4MUV<%XbXZg}$3BNe9v&E|RY7%Ab6VtV3MUY3 zLk!}DusY?vIWWBe30aqv0iRdTqVHF+mE%?0QMuJ@0Kr9n$J1Gj>zXGL%EOPXW)sMa z+l!Bn-&9pu|MHw=_91v~dI>>O%~NtQ5XI|oT{{&vm=&Mab7L7}TecfAa|^+_1*+VMeKTZK-g&t-ME1`gyn^n)-wShJo`J%r>W zf7Gm>p?VQ3+rbFfoVhP$BB~joMxpQsZ+EukJlKf+dy5pS)%Qj&usi1gHPq6Ag4vCV`Rq4gw{M!g6au3d zmCh*GPXa&I>;-1)L?rE8vK=4L&fJhbE(CmE(#29I3~^Eu(gR&ikh?&l_!3jlURk^a zW_Ox=NBL$#PA1qt2(FgeImO(&EHN~&RP);W{QP?G=_-lQ9|GfZ=@6DI0?a!S=)6a+ zgBP{OmZ#NK``Of=qGY$`Cl-qEMy}W(ZP&MBB9sVS2=d)6b7e_XteFB!2mux~80We9 zuZi#TnXsDeUI7N3DVmokw4FV{e77Y$Uc(DJ#ON(#jJo`xt1j0e2X!-1v8(yCRJ~i7 zqhm$?Ab?V(FMjN_M6=EdmK-?d{&)n5fyCZqzIuiadM_F#_t^jK}t&KyH6M} z%*X>)QyFNdhzx4bexRKo{O2v^_{JJRyMVSVJ!clxi=e literal 0 HcmV?d00001 diff --git a/assets/image/icon_permission_location_bg.png b/assets/image/icon_permission_location_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..340115218b486c20572be639dfa2885a9d7eb261 GIT binary patch literal 7644 zcmW-mbyyVd*T#o*0fAjo8kdwtKuUV)MnXV9Y3W8na)qS@zS1Ef9nyky2-3A6-O?-# zvc$W;_m7#mu9@q)&-2WjdCuqDPn3?9GBF`7Apiixswyx&%(WhKgn{reXVlSp7yvL7 zsKVs*KbRky5q;1{Hkj`Zv+#GT=UJ1n$~lHITPF#r!UDfG8csCM$OjlC5#%qMn7V#^ zgVrmktTYd3L(W_}AcsTR8r*8y8gj?D+M;Fu64bAm6gtC)abb*WUuLuFj+*4z<9j}5 zi6;zeh@sK9WLa%9=IE8+%Y*)T$EViD1i09rYI!U^A+~WszKkfq)^lO-TO8m86*cvP z&rF4JWZiJ!RMumbPTb$or+ekqRGJyWyCibpL9n}XP|$tL;NW1p^@d@!xpQeriC8Wo z1-gz^j=Vuk?Y>N-%od0n5W_Z>v+r05W&{?a5i%5tCu3^51o+{0ziR{ef!p~lkG2Z^ z(F#!?$beX0c-N|T66=VwtLww^yexntXC2&A&Iyqsv~ z+thTjDabl@Jg6hsz||GSOGM2#eOQ=ZSvj)2wA7Y?kccWFg)Hz=4Y3zb%|#m;c`ko&m#d&2Pp^1pUQmq~|xR+L7f(3*1~>T)=8;7fWXccIQSuC*#yl%~uwe z%%36h=)m^k=;&w{O>Z7M3gMuR6#~FlHR=59=H})?sljS*ga^Aoe#dv&&#r9A#R41f zZ2nox(=>}jO1+#n+ZH-V7qYtt0Qr2*Dw@N~k;_=+P96Dbi;i|NetuLy81o-%V{^9X z^}pAZxhH0lenir_s7S>C2qyeu}=+&I!8NZ8Ff;Kew*SE^;1(jAxIB%7%yre+?@qjzy`u5=8h&9a2vLa(QMFH|u_6qu2er9x z{PK_kYmM39Rv7M2WMpJK3~foLHRjS|9x{M%k2s(~W=VB;5Z{>m4fILYVm(Cr-19Fj*1jZ@3)z#I(+A$=rW?-_< zuvs82gaDsz8IOS!)IYDP>WIn2E3K9tTMZ(RO0Smqe18iUn?29dGEIZ!3-m3S$um9M zwk+9BRxho`$?psGFhRH#2P;y^L22;OsCUof^rJBo`KFS7;em~nJT5M%QIv?0BB-Qz zR%fooj2Rq9#BX7}XBf>dP@9<{0*t_RuRyvImtrStyQ2@Z_9>Nb7)`_I z|DyfR7>x~a*-lxx-$}>xfA;_SO6>bZm4UKBiI5@%M$!aJMXgN#q4pi)pW{I662;DD zSvPiO4V7o=<9MK8maiSmA*46EhvRYFORU@k6un$*1RDB>ae~7z$IB?@Jjnf{;^yc3$)SQ9$QLT zfuaQ!a0I{|6b2N)Nm%zEJtrnsIwwWSJVa?NjYv2dgy4*!ns#^)*9fJy1FwDsK0qq z;fcoEm_FKIhEz0IB4lh(5J5 zp~Q_k&vlJB#FZF5$tdDWi?D@tB_DqQe)A`yBVd3ttMoa;0HJ~C;6-_?CvTmFU^J4mb2Sqbw$ zqDa9(&27J}iY8UCC5j0cqF^t8&SrOc4l>ci@hBnBbrfv+wV`3-b4apyd1~yCq~SRf z`;9g0vxYtP5Sa@q#x{qANfG7xJzDisarGTp=C__=^vZ0iwQN<{esd816Pg=qIDUvl zN=nKyMYYA*rsj*Wu`rKf6NUZ+)cOVZL_D&m#_4{FSgQ-_1cSF~e3p02gpG5n zpEjEsRy=k@eu=-0Af{tqaB6g=prX3}QCsWL+i?36)ovQNIgluczPVvE{r|9spmb7`50&c@2rbfLaLIl-J0)U6MQ;Q)-3iZwz@ zm)N1QQ9MINGcz;y&&}o%_qK)ed{N70PgN&ShI6lcVjH-1$3gM z84=f`)D|tMj3CokoSJ=k&gC@7q!lNT3<CJ{^H9a?M;jfrQvupXLy5mYWSxJXbjjQ`|2}h}wNx+|d+$D03%#Yq60-^; z`P5GB5x_K^kKnHYR(*6Sm}c^oOAi82ZK=M;t6h>1_b;5$l3xbdX6eY`f3*|~CNdE_ z)HSa)-s%a3qS5H5{QRznRjQazq_;BrZelY=0gIBr+aiQQ)CfP;erBMfFh zO84t=9!+a}Jc%e&dTwRKbvw>t{dqXUEuP$UYtPz;@|Hd`QV`t~-YvXZBg6=9j@~|( z;Myqn6|Y8JwOpH#XVE#FI_WL+%QCxVaz-bVelg@rxqwqx1^f zi_F6g;H|@{aXqUl%FxJYY%MOXuI~;EU980aj+@@`4mFXnI^u}0EgT7L$`K??biS@k(M1q1)oK^l z3<;w12KT3PbMN4mnK0gkrtRPDyU-bqAxdBm^ZX07+>J*CN^ z^AAcDox^k`0QG4pr_LZwDMMZ>AwUv4@VRD9LRrD>h0excY(==iLWS<}G)sN)i7s$k zWU_eP9!2Mqaw&YTzo5x}r#x`jX69_+sq3NvX~EDZ3=FSxdO_Ebgt&5EP+_7rXie-rA1V<@dI+On8j$z*?|J_a(5uGg0I_EJ}#%aB!$VQ>#e{CDjAT@ zypy)}*rl}vSb<<^agm3|ti@}zH;Vi$YJd+UZ)9XNTVq^jOOu2~kLM}GVKV2baf(dW z*WQGq>#M4&Do-^vwfU@^U$c;7y>DOHW(%H}JuzSVs9qT;;W1iF$1lrWCawDPt4zew zvUc&5E&KjWp!EGlrH(^*pJj7fQBg#KSY-4O{4e)#ety0qtEvgt(CH^YK(I!x9Ld#h zS<~^mw$*3xhdb}9B8|DKdK|SqZ*T73ge? zm3520{Hgf=1F%aOQ;umBXGrgD!9Cadb7)p#C{4ZP#UgBBs#GvR_orARsZj4S524Jv z&TZcw-8kpOL2v)PdFIbWJvwlsMS;3TQebuBOJRsG>E5GZt2M#iAIEq9eDpzo~ zxqZY|5(eYOw1YE+3qBrq3Xvpc&UJHIVl2x)eNjtxS?)^HyY3wkz+OiL0UxP|pZSDC zG1UK3}rdmwdm7c%=d%YvUjs$k=8o%bWGlOM<+n2zd`S za%nC9%n^3-2?iS*8yP{eTa1F5?CYWy;xN~UjF%DfPns%Q`tJBcj+tnk%qSgBH>bIM zkRKT+reQl*E5X4@NC%roX?1>$Hu4mzwNi2^;F_*Ax0l5YRvgK` z{+Q{kRc-?(RXV^pBpl z3MO9+4V+}^V^UXFM^<}AzMEadl%NGXy+hg2G6H+WKZhS9Sa2yZgfJ|6)X>n-!nh?a z6(`EPI%RUN!}C06&0;x!$ksH5q2O70#`uK&v^LDLY);&-QOn%p@n_3p169kNDwsIz zWiG=>98fU7ai7V)9aP95h1bv3#A_yW9N5v&;2p&b3NYhKW$%dkV6k0cZaIeHbHb7L znKUx}^V=essBAt$=vi^}c%lk?iA=%0hde6HK|C>fy!0MSrW%jnW*~`t`n0OdbWt1V z<~0f7fCu!%<)He#aj`>9{r&xen%vg9OQ_m-_Rm{Ta$%2zcb{JSmHh63#A%i0M~^cw zFsvx_=5=YXdaeIff+qb|kJpE5-2|iQNghe=F$D`&T9uv%2SorD$dXzn-4?MwKO9y~ z;W*W?bfQOwa$rk(WK`QNVy6j1AP2dXKc+vV^0L;p5&$@IoJcC%7M`8U_98=Rqb+@i z1XLisbz6{pCayuG#E?>LiziAZBKIjO zXS13;{@-fz^YaJ&@eHQFHVtWYY?h~n{+d)$nKxz?^>G3>%+vQlyQNPk%qa6DB_tY| z*ITb+Gk#!cGz7(y%jB>_rC*osvGZC~adC5_!yCIac@NKpr6WRC#>+B+%kU73$D;Lx z=gq6kys-NE#>UIMwRw*!rxviaKNc3dV^b6(>Cd*N_sHa!(=reS{g-h!(9U$k2RThmO?3~` z+xdXKP4^YN&nW!P4Vw6R%4mWVKU2CK@ikM0%=yL7h9YU058YK3JJzbiD-NvAPfqF? zR0l_fuWX-*7+21WM^`3zUM~`z({gF$JY&B9QM^)H=G-U5M3lCUVZZMShy0_tG7mT| z)u+33?Ar^4HqR%rO_F`s=N^0p4ks$L{oe_h_)nAFBmi!zW#7W%Gv#ys@niat78j=% z&hx^Ug>~4c`Hf?F8?g}%0sjv13#@bKI6m_tC%FrCMSXCq&g<6(Z`}J#(F+p5?i=hk zA#Y``&BGk!H5r%Cg`!GIyRQ^?;^X5v!0tPLh7eXiyXGDacBhKZPL-O-K)7PG;{`Z` znVFyVXbu;EwO1`7pH&q>!Nhk3fulM+Z5s1Qd5s1T3EH^RqmP_(TBj|>yM1c;s7F^a z?mis(RhWk6cWM0L^;+k8UrfhfDamACT*3V;hN{{5jF#4YaJmT`7rZWP6+dES$P+VO z@V}|eC!deiQQTpW^wHquo;$%KyqwCqU`l+v;T$mo@Y-~K2TJNnLdVUfJ&q6EQ zS?S}AJhAxX1D{{X{m8|LWV0-f9q|==Zd(NJ#Ny^6*k%j)Za=1}U7G9c4dMj5 zoX=pFk&dQmew?p=KgAIf9Ziz$IV%4Ck)e_1PM2{;E)?0@rNSymE+*)A>vli>+gm&h z(X)1)NcH)nG*fWEG#B#ZSET8$>VI$V4sWv5xt$FX{BM`=sXr|hoVgj1#%LE=O%-Y8 z*1YDqBGWbJq53Hs*U`-W|2V(+n&(&hW1LK(Z~TTyX6nhdXFkR$+l7QwR;+0iKj-(& zi3*qVmhI7c`=Zi3>4|sinfkyFdPpV$!O{OvV^Zl-JmsgO`7;9~C8mD1)vH4YzozTH zWZ|pmysCv<8mT8AEzcJR+JJoB+#<-gzwLILHdkOpG*{Eh(#J=CI>^pgqa|Z|D7wdl>cC zkzJU3q1m&z$Fj!lZ5Pcg3O>7t<9wnASIx=Im6`TAJ;epgy~XH_p!rA5`;#=);v?z@ z|F%A5V!8Q9cobNq-d7hNzc#o{?AmDxZtY7o_kZTPH(g4EC?SIse;?z4`luwGE18)s zb&4u;Qe-?;B|Ga8Ofv`}hf9m31%>4LyUX+Q zKpeH?goF>2{y>Jw9m4r78HS=>Ywss`-t-CE3xln`&6I-O}Cp3i`II&ve$_1e1F zdZd8w_MfxR;1en1l!wQ_0}`y8-M zyfe2O@$bV!7#Dpo5g3`?MvlEO)4*=a;Z-L!cla8TOCnN#OkP>Rd#l!u`Gtu9Qf9_n zF!%&Zmx4F}k}sJTHGoUgG_>af*mvzinHBA2A6Ys-bu9u6YqXOY-}~GDEB(T)cz8{#wWA-g13QjI@!fn zOAV)`bBI@FVd<-qWG)nxV>es3)*62DB}iXBZ}0)(D-7U;z}6@%G-@A+G@ z=qXsvL@~|z+}76CY&?d8G>lU?{%&uRIy<%e{7FPaNQl`Oh-)UKUyv&9lj3CxmFh3r zpH487!fjZ{cuC*9!ovj?u#T{m#F!alIWocbM*kjXv>lSETUaptIlK%<%2L+z6CMT{EmW0v|ARIaJ9v7fJ;T-U|##yB>4&lSuY zwvYw1j+1>>=~A|>@i~Vq2$#N}HgWY&P|(3T1?1~c2aC;~OtmJJ+({F*O_Qyyt%8CI z{pi2vEw0L8!A3ni@;_J>cf=WUhIul;02 zm;5I8B_60{+{zJ;Ad|RS9k&<6l8`#GVCIq>W%*j%6StiCOD*I{+|Dl4h0KKdiA+`R z+`4(Z3MtO&Zt1k=bTIA>21q^*hWyoj|Ajq|nD#!DHBq5yZ9I?$)t7%jI)5c zAyA1}1R7XXP)+iorlv+^h`Fz0#j$5kuCwP+lE`pywVeE-E5~QaGGwu2gSfLYw-X~P z-D+9oz>Va(bp7J6USc*jws$NZIs3L=RL`ChNOix3K_OcIem(n7JT!4;an&L6UIF$d z29c2Z-+yjlEOlA9n3?qGu+YYtKLU7R=ej-xkM*Jyh{-2LFzwEm?Rad3%RKA300#PD zK?DHD2O?V!Sd_hiv9YlNyYs-`MooEAA&H+phg@LXwIEn)I*X(22j&Fk^;h(X4j4pG z7IIRbdErWC(lzchSNqL=@V{qS2K!U=Kj;8k$b{^qE=~*_L4W0n18v6;jCqcP_g=}T zagpy95oIq3DzTTl(gUb~<7dj^9nV1DaFkqc zsFft}XAEQNjQ;3Z-Kjld4@>eJ_!1*gX^MNM2Li2dRYFwFOiawP029Z^Ql% DVE)T< literal 0 HcmV?d00001 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index aa8ab932..6fdc7cc3 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -744,7 +744,6 @@ OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", - "-l\"TOCropViewController\"", "-l\"Toast\"", "-l\"amap_flutter_location\"", "-l\"amap_flutter_map\"", @@ -942,7 +941,6 @@ OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", - "-l\"TOCropViewController\"", "-l\"Toast\"", "-l\"amap_flutter_location\"", "-l\"amap_flutter_map\"", @@ -1035,7 +1033,6 @@ OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", - "-l\"TOCropViewController\"", "-l\"Toast\"", "-l\"amap_flutter_location\"", "-l\"amap_flutter_map\"", diff --git a/lib/generated/intl/messages_en.dart b/lib/generated/intl/messages_en.dart index 7e6cfe24..0707cc9b 100644 --- a/lib/generated/intl/messages_en.dart +++ b/lib/generated/intl/messages_en.dart @@ -159,6 +159,7 @@ class MessageLookup extends MessageLookupByLibrary { "jixuduihuan" : MessageLookupByLibrary.simpleMessage("继续兑换"), "jixuzhifu" : MessageLookupByLibrary.simpleMessage("继续支付"), "kabao" : MessageLookupByLibrary.simpleMessage("卡包"), + "kaiqiquanxian" : MessageLookupByLibrary.simpleMessage("开启权限"), "kaitongriqi" : m8, "keshiyong" : MessageLookupByLibrary.simpleMessage(" 可使用 "), "keyongjifen" : MessageLookupByLibrary.simpleMessage("可用积分"), @@ -244,6 +245,7 @@ class MessageLookup extends MessageLookupByLibrary { "shanchudingdan" : MessageLookupByLibrary.simpleMessage("删除订单"), "shanglajiazai" : MessageLookupByLibrary.simpleMessage("上拉加载"), "shangpinjifen" : m15, + "shangpinxiangqing" : MessageLookupByLibrary.simpleMessage("商品详情"), "shenmijifendali" : MessageLookupByLibrary.simpleMessage("神秘积分大礼"), "shezhi" : MessageLookupByLibrary.simpleMessage("设置"), "shifangjiazaigengduo" : MessageLookupByLibrary.simpleMessage("释放加载更多"), diff --git a/lib/generated/intl/messages_zh_CN.dart b/lib/generated/intl/messages_zh_CN.dart index 05df487e..458a94b8 100644 --- a/lib/generated/intl/messages_zh_CN.dart +++ b/lib/generated/intl/messages_zh_CN.dart @@ -152,6 +152,7 @@ class MessageLookup extends MessageLookupByLibrary { "jixuduihuan" : MessageLookupByLibrary.simpleMessage("继续兑换"), "jixuzhifu" : MessageLookupByLibrary.simpleMessage("继续支付"), "kabao" : MessageLookupByLibrary.simpleMessage("卡包"), + "kaiqiquanxian" : MessageLookupByLibrary.simpleMessage("开启权限"), "kaitongriqi" : m8, "keshiyong" : MessageLookupByLibrary.simpleMessage("可使用"), "keyongjifen" : MessageLookupByLibrary.simpleMessage("可用积分"), @@ -231,6 +232,7 @@ class MessageLookup extends MessageLookupByLibrary { "shanchudingdan" : MessageLookupByLibrary.simpleMessage("删除订单"), "shanglajiazai" : MessageLookupByLibrary.simpleMessage("上拉加载"), "shangpinjifen" : m15, + "shangpinxiangqing" : MessageLookupByLibrary.simpleMessage("商品详情"), "shenmijifendali" : MessageLookupByLibrary.simpleMessage("神秘积分大礼"), "shezhi" : MessageLookupByLibrary.simpleMessage("设置"), "shifangjiazaigengduo" : MessageLookupByLibrary.simpleMessage("释放加载更多"), diff --git a/lib/generated/intl/messages_zh_TW.dart b/lib/generated/intl/messages_zh_TW.dart index 89abf65a..8ca4d329 100644 --- a/lib/generated/intl/messages_zh_TW.dart +++ b/lib/generated/intl/messages_zh_TW.dart @@ -152,6 +152,7 @@ class MessageLookup extends MessageLookupByLibrary { "jixuduihuan" : MessageLookupByLibrary.simpleMessage("继续兑换"), "jixuzhifu" : MessageLookupByLibrary.simpleMessage("继续支付"), "kabao" : MessageLookupByLibrary.simpleMessage("卡包"), + "kaiqiquanxian" : MessageLookupByLibrary.simpleMessage("开启权限"), "kaitongriqi" : m8, "keshiyong" : MessageLookupByLibrary.simpleMessage("可使用"), "keyongjifen" : MessageLookupByLibrary.simpleMessage("可用积分"), @@ -231,6 +232,7 @@ class MessageLookup extends MessageLookupByLibrary { "shanchudingdan" : MessageLookupByLibrary.simpleMessage("删除订单"), "shanglajiazai" : MessageLookupByLibrary.simpleMessage("上拉加载"), "shangpinjifen" : m15, + "shangpinxiangqing" : MessageLookupByLibrary.simpleMessage("商品详情"), "shenmijifendali" : MessageLookupByLibrary.simpleMessage("神秘积分大礼"), "shezhi" : MessageLookupByLibrary.simpleMessage("设置"), "shifangjiazaigengduo" : MessageLookupByLibrary.simpleMessage("释放加载更多"), diff --git a/lib/generated/l10n.dart b/lib/generated/l10n.dart index d0606517..94853d1b 100644 --- a/lib/generated/l10n.dart +++ b/lib/generated/l10n.dart @@ -2695,6 +2695,26 @@ class S { ); } + /// `商品详情` + String get shangpinxiangqing { + return Intl.message( + '商品详情', + name: 'shangpinxiangqing', + desc: '', + args: [], + ); + } + + /// `开启权限` + String get kaiqiquanxian { + return Intl.message( + '开启权限', + name: 'kaiqiquanxian', + desc: '', + args: [], + ); + } + /// `并使用本机号码登录` String get privacy_policy4 { return Intl.message( diff --git a/lib/integral_store/integral_store_details_page.dart b/lib/integral_store/integral_store_details_page.dart index 52acded5..e3540a60 100644 --- a/lib/integral_store/integral_store_details_page.dart +++ b/lib/integral_store/integral_store_details_page.dart @@ -10,6 +10,7 @@ import 'package:huixiang/retrofit/data/goods.dart'; import 'package:huixiang/retrofit/data/user_info.dart'; import 'package:huixiang/retrofit/retrofit_api.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; class IntegralStoreDetailsPage extends StatefulWidget { final Map arguments; @@ -27,6 +28,7 @@ class _IntegralStoreDetailsPage extends State { String points; final Map arguments; + _IntegralStoreDetailsPage(this.arguments); @override @@ -75,11 +77,19 @@ class _IntegralStoreDetailsPage extends State { ), ), ), + title: Text( + S.of(context).shangpinxiangqing, + style: TextStyle( + color: Colors.black, + fontSize: 16.sp, + fontWeight: FontWeight.bold, + ), + ), titleSpacing: 2, - leadingWidth: 56, + leadingWidth: 56.w, actions: [ Container( - margin: EdgeInsets.only(right: 15), + margin: EdgeInsets.only(right: 15.w), child: GestureDetector( onTap: () {}, child: Icon( @@ -103,21 +113,24 @@ class _IntegralStoreDetailsPage extends State { children: [ buildProduct(), Container( - padding: EdgeInsets.fromLTRB(16, 32, 16, 16), + padding: EdgeInsets.fromLTRB(16.w, 32.h, 16.w, 16.h), child: Text( S.of(context).duihuanguize, style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 16, - color: Color(0xFFFF7A1A)), + fontWeight: FontWeight.bold, + fontSize: 16.sp, + color: Color(0xFFFF7A1A), + ), ), ), Container( - padding: EdgeInsets.fromLTRB(16, 6, 16, 40), + padding: EdgeInsets.fromLTRB(16.w, 6.h, 16.w, 40.h), child: Text( "(1) 兑换商品中所要求的积分达到方可兑换\n\n(2) 积分仅兑换商城指定商品,不能折算现金或兑换其他非指定商品项目\n\n(3) 兑换商品图片仅供参考,商品以实际领取为准,如商品有多种颜色,则随机发送\n\n(4) 使用积分兑换商品成功后,默认客户主动签收验货,非存在商品质量问题,不得退货或积分退回账户操作,若商品存在质量问题,请于收货后三日内联系客服解决\n\n(5) 兑换商品仅按客户指定地址进行配送,如因客户地址变更未及时通知本中心或客户所提供的联系方式和地址信息错误而导致商品配送失败的,由客户自行承担相关责任\n\n(6) 部分积分商品数量有限,先兑先得,兑完为止", - style: - TextStyle(fontSize: 12, color: Color(0xFF353535)), + style: TextStyle( + fontSize: 12.sp, + color: Color(0xFF353535), + ), ), ), ], @@ -130,7 +143,7 @@ class _IntegralStoreDetailsPage extends State { toExchangeOrder(); }, child: Container( - padding: EdgeInsets.only(top: 16, bottom: 16), + padding: EdgeInsets.only(top: 16.h, bottom: 16.h), decoration: BoxDecoration( color: (goods != null && int.tryParse(goods.price) < int.tryParse(points)) @@ -143,9 +156,10 @@ class _IntegralStoreDetailsPage extends State { child: Text( S.of(context).duihuan, style: TextStyle( - fontSize: 16, - color: Color(0xFFFFFFFF), - fontWeight: FontWeight.bold), + fontSize: 16.sp, + color: Color(0xFFFFFFFF), + fontWeight: FontWeight.bold, + ), ), ), ) @@ -181,10 +195,11 @@ class _IntegralStoreDetailsPage extends State { bottomLeft: Radius.circular(8), bottomRight: Radius.circular(8)), boxShadow: [ BoxShadow( - color: Colors.black.withAlpha(12), - offset: Offset(0, 3), - blurRadius: 14, - spreadRadius: 0) + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) ], color: Colors.white), child: Column( @@ -198,18 +213,26 @@ class _IntegralStoreDetailsPage extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text( - goods == null ? "" : goods.name, - style: TextStyle( + Expanded( + child: Text( + goods == null ? "" : goods.name, + overflow: TextOverflow.ellipsis, + style: TextStyle( fontWeight: FontWeight.bold, fontSize: 18, - color: Color(0xFF353535)), + color: Color(0xFF353535), + ), + ), + flex: 1, ), Text( goods == null ? "" : S.of(context).yiduihuanjian("${goods.sales}万"), - style: TextStyle(fontSize: 10, color: Color(0xFFA29E9E)), + style: TextStyle( + fontSize: 10, + color: Color(0xFFA29E9E), + ), ), ], ), @@ -218,18 +241,25 @@ class _IntegralStoreDetailsPage extends State { ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - goods == null ? "" : goods.description, - style: TextStyle(fontSize: 12, color: Color(0xFF727272)), + Expanded( + child: Text( + goods == null ? "" : goods.description, + style: TextStyle( + fontSize: 12, + color: Color(0xFF727272), + ), + ), + flex: 1, ), Text( goods == null ? "" : S.of(context).jifen_(goods.price), style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 16, - color: Color(0xFF32A060)), + fontWeight: FontWeight.bold, + fontSize: 16, + color: Color(0xFF32A060), + ), ), ], ), diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 16263ac8..e3bf0ee4 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -272,6 +272,8 @@ "jiazaishibai": "加载失败", "shifangjiazaigengduo": "释放加载更多", "meiyougengduoshujule": "没有更多的数据了", + "shangpinxiangqing": "商品详情", + "kaiqiquanxian": "开启权限", diff --git a/lib/l10n/intl_zh_CN.arb b/lib/l10n/intl_zh_CN.arb index 090dedf7..957e5d53 100644 --- a/lib/l10n/intl_zh_CN.arb +++ b/lib/l10n/intl_zh_CN.arb @@ -251,6 +251,8 @@ "jiazaishibai": "加载失败", "shifangjiazaigengduo": "释放加载更多", "meiyougengduoshujule": "没有更多的数据了", + "shangpinxiangqing": "商品详情", + "kaiqiquanxian": "开启权限", diff --git a/lib/l10n/intl_zh_TW.arb b/lib/l10n/intl_zh_TW.arb index 3d691208..ba50e8a0 100644 --- a/lib/l10n/intl_zh_TW.arb +++ b/lib/l10n/intl_zh_TW.arb @@ -251,6 +251,8 @@ "jiazaishibai": "加载失败", "shifangjiazaigengduo": "释放加载更多", "meiyougengduoshujule": "没有更多的数据了", + "shangpinxiangqing": "商品详情", + "kaiqiquanxian": "开启权限", diff --git a/lib/order/exchange_order_page.dart b/lib/order/exchange_order_page.dart index d38a8701..353d626e 100644 --- a/lib/order/exchange_order_page.dart +++ b/lib/order/exchange_order_page.dart @@ -9,6 +9,7 @@ import 'package:huixiang/retrofit/data/base_data.dart'; import 'package:huixiang/retrofit/data/user_info.dart'; import 'package:huixiang/retrofit/retrofit_api.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; class ExchangeOrderPage extends StatefulWidget { final Map arguments; @@ -279,33 +280,41 @@ class _ExchangeOrderPage extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.max, children: [ Image.network( widget.arguments["image"], fit: BoxFit.cover, - width: 80, - height: 80, + width: 80.w, + height: 80.h, ), - Column( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Text( - widget.arguments["name"], - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.bold, - color: Color(0xFF353535)), + Expanded( + child: Container( + height: 80.h, + margin: EdgeInsets.only(left: 16.w), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + widget.arguments["name"], + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: Color(0xFF353535)), + ), + SizedBox( + height: 4, + ), + Text( + "x1", + style: TextStyle( + fontSize: 12, color: Color(0xFF727272)), + ), + ], ), - SizedBox( - height: 4, - ), - Text( - "x1", - style: TextStyle( - fontSize: 12, color: Color(0xFF727272)), - ), - ], + ), + flex: 1, ) ], ), diff --git a/lib/retrofit/data/activity.g.dart b/lib/retrofit/data/activity.g.dart new file mode 100644 index 00000000..de88e232 --- /dev/null +++ b/lib/retrofit/data/activity.g.dart @@ -0,0 +1,44 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'activity.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +Activity _$ActivityFromJson(Map json) { + return Activity() + ..id = json['id'] as String + ..createTime = json['createTime'] as String + ..createUser = json['createUser'] + ..updateTime = json['updateTime'] as String + ..updateUser = json['updateUser'] + ..storeId = json['storeId'] as String + ..mainTitle = json['mainTitle'] as String + ..viceTitle = json['viceTitle'] as String + ..content = json['content'] as String + ..coverImg = json['coverImg'] as String + ..startTime = json['startTime'] as String + ..endTime = json['endTime'] as String + ..state = json['state'] as int + ..isDelete = json['isDelete'] as int + ..storeName = json['storeName'] as String; +} + +Map _$ActivityToJson(Activity instance) => { + 'id': instance.id, + 'createTime': instance.createTime, + 'createUser': instance.createUser, + 'updateTime': instance.updateTime, + 'updateUser': instance.updateUser, + 'storeId': instance.storeId, + 'mainTitle': instance.mainTitle, + 'viceTitle': instance.viceTitle, + 'content': instance.content, + 'coverImg': instance.coverImg, + 'startTime': instance.startTime, + 'endTime': instance.endTime, + 'state': instance.state, + 'isDelete': instance.isDelete, + 'storeName': instance.storeName, + }; diff --git a/lib/retrofit/data/address.g.dart b/lib/retrofit/data/address.g.dart new file mode 100644 index 00000000..392f0ad0 --- /dev/null +++ b/lib/retrofit/data/address.g.dart @@ -0,0 +1,40 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'address.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +Address _$AddressFromJson(Map json) { + return Address() + ..address = json['address'] as String + ..area = json['area'] as String + ..city = json['city'] as String + ..cityInfo = json['cityInfo'] as String + ..id = json['id'] as String + ..isDefault = json['isDefault'] as bool + ..latitude = json['latitude'] as String + ..longitude = json['longitude'] as String + ..mid = json['mid'] as String + ..phone = json['phone'] as String + ..province = json['province'] as String + ..tag = json['tag'] as String + ..username = json['username'] as String; +} + +Map _$AddressToJson(Address instance) => { + 'address': instance.address, + 'area': instance.area, + 'city': instance.city, + 'cityInfo': instance.cityInfo, + 'id': instance.id, + 'isDefault': instance.isDefault, + 'latitude': instance.latitude, + 'longitude': instance.longitude, + 'mid': instance.mid, + 'phone': instance.phone, + 'province': instance.province, + 'tag': instance.tag, + 'username': instance.username, + }; diff --git a/lib/retrofit/data/banner.g.dart b/lib/retrofit/data/banner.g.dart new file mode 100644 index 00000000..1eca663a --- /dev/null +++ b/lib/retrofit/data/banner.g.dart @@ -0,0 +1,38 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'banner.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +BannerData _$BannerDataFromJson(Map json) { + return BannerData( + content: json['content'] as String, + createTime: json['createTime'] as String, + createUser: json['createUser'] as String, + id: json['id'] as String, + imgUrl: json['imgUrl'] as String, + isDelete: json['isDelete'] as bool, + storeId: json['storeId'] as String, + tenantCode: json['tenantCode'] as String, + type: json['type'] as String, + updateTime: json['updateTime'] as String, + updateUser: json['updateUser'] as String, + ); +} + +Map _$BannerDataToJson(BannerData instance) => + { + 'content': instance.content, + 'createTime': instance.createTime, + 'createUser': instance.createUser, + 'id': instance.id, + 'imgUrl': instance.imgUrl, + 'isDelete': instance.isDelete, + 'storeId': instance.storeId, + 'tenantCode': instance.tenantCode, + 'type': instance.type, + 'updateTime': instance.updateTime, + 'updateUser': instance.updateUser, + }; diff --git a/lib/retrofit/data/base_data.g.dart b/lib/retrofit/data/base_data.g.dart new file mode 100644 index 00000000..6985c4ef --- /dev/null +++ b/lib/retrofit/data/base_data.g.dart @@ -0,0 +1,30 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'base_data.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +BaseData _$BaseDataFromJson(Map json) { + return BaseData() + ..code = json['code'] as int + ..data = json['data'] + ..extra = json['extra'] + ..isError = json['isError'] as bool + ..isSuccess = json['isSuccess'] as bool + ..msg = json['msg'] as String + ..path = json['path'] as String + ..timestamp = json['timestamp'] as String; +} + +Map _$BaseDataToJson(BaseData instance) => { + 'code': instance.code, + 'data': instance.data, + 'extra': instance.extra, + 'isError': instance.isError, + 'isSuccess': instance.isSuccess, + 'msg': instance.msg, + 'path': instance.path, + 'timestamp': instance.timestamp, + }; diff --git a/lib/retrofit/data/brand_data.g.dart b/lib/retrofit/data/brand_data.g.dart new file mode 100644 index 00000000..bce83c38 --- /dev/null +++ b/lib/retrofit/data/brand_data.g.dart @@ -0,0 +1,33 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'brand_data.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +BrandData _$BrandDataFromJson(Map json) { + return BrandData() + ..bannerList = (json['bannerList'] as List) + ?.map((e) => + e == null ? null : BannerData.fromJson(e as Map)) + ?.toList() + ..company = json['company'] as String + ..companyDesc = json['companyDesc'] as String + ..originAvatar = json['originAvatar'] as String + ..originDesc = json['originDesc'] as String + ..originator = json['originator'] as String + ..contents = json['contents'] + ..ideals = json['ideals']; +} + +Map _$BrandDataToJson(BrandData instance) => { + 'bannerList': instance.bannerList, + 'company': instance.company, + 'companyDesc': instance.companyDesc, + 'originAvatar': instance.originAvatar, + 'originDesc': instance.originDesc, + 'originator': instance.originator, + 'contents': instance.contents, + 'ideals': instance.ideals, + }; diff --git a/lib/retrofit/data/coupon.g.dart b/lib/retrofit/data/coupon.g.dart new file mode 100644 index 00000000..2e658e18 --- /dev/null +++ b/lib/retrofit/data/coupon.g.dart @@ -0,0 +1,64 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'coupon.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +Coupon _$CouponFromJson(Map json) { + return Coupon() + ..id = json['id'] as String + ..createTime = json['createTime'] as String + ..createUser = json['createUser'] as String + ..updateTime = json['updateTime'] as String + ..updateUser = json['updateUser'] as String + ..bizType = json['bizType'] as int + ..fullAmount = json['fullAmount'] as String + ..discountAmount = json['discountAmount'] as String + ..discountPercent = json['discountPercent'] as int + ..bizId = json['bizId'] as String + ..publishStartTime = json['publishStartTime'] as String + ..publishEndTime = json['publishEndTime'] as String + ..useStartTime = json['useStartTime'] as String + ..useEndTime = json['useEndTime'] as String + ..promotionId = json['promotionId'] as String + ..centreDisplay = json['centreDisplay'] as bool + ..tenantCode = json['tenantCode'] as String + ..isDelete = json['isDelete'] as int + ..couponName = json['couponName'] as String + ..couponImg = json['couponImg'] as String + ..couponDescription = json['couponDescription'] as String + ..memberCouponId = json['memberCouponId'] as String + ..receiveTime = json['receiveTime'] as String + ..useTime = json['useTime'] + ..status = json['status'] as int; +} + +Map _$CouponToJson(Coupon instance) => { + 'id': instance.id, + 'createTime': instance.createTime, + 'createUser': instance.createUser, + 'updateTime': instance.updateTime, + 'updateUser': instance.updateUser, + 'bizType': instance.bizType, + 'fullAmount': instance.fullAmount, + 'discountAmount': instance.discountAmount, + 'discountPercent': instance.discountPercent, + 'bizId': instance.bizId, + 'publishStartTime': instance.publishStartTime, + 'publishEndTime': instance.publishEndTime, + 'useStartTime': instance.useStartTime, + 'useEndTime': instance.useEndTime, + 'promotionId': instance.promotionId, + 'centreDisplay': instance.centreDisplay, + 'tenantCode': instance.tenantCode, + 'isDelete': instance.isDelete, + 'couponName': instance.couponName, + 'couponImg': instance.couponImg, + 'couponDescription': instance.couponDescription, + 'memberCouponId': instance.memberCouponId, + 'receiveTime': instance.receiveTime, + 'useTime': instance.useTime, + 'status': instance.status, + }; diff --git a/lib/retrofit/data/coupon_vo.g.dart b/lib/retrofit/data/coupon_vo.g.dart new file mode 100644 index 00000000..3b2b8e04 --- /dev/null +++ b/lib/retrofit/data/coupon_vo.g.dart @@ -0,0 +1,67 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'coupon_vo.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +CouponVo _$CouponVoFromJson(Map json) { + return CouponVo( + bizId: json['bizId'] as String, + bizType: json['bizType'] as num, + centreDisplay: json['centreDisplay'] as bool, + couponDescription: json['couponDescription'] as String, + couponImg: json['couponImg'] as String, + couponName: json['couponName'] as String, + createTime: json['createTime'] as String, + createUser: json['createUser'] as String, + discountAmount: json['discountAmount'] as String, + discountPercent: json['discountPercent'] as num, + fullAmount: json['fullAmount'] as String, + id: json['id'] as String, + isDelete: json['isDelete'] as num, + memberCouponId: json['memberCouponId'] as num, + promotionId: json['promotionId'] as String, + publishEndTime: json['publishEndTime'] as String, + publishStartTime: json['publishStartTime'] as String, + receiveTime: json['receiveTime'] as String, + received: json['received'] as bool, + status: json['status'] as num, + tenantCode: json['tenantCode'] as String, + updateTime: json['updateTime'] as String, + updateUser: json['updateUser'] as String, + useEndTime: json['useEndTime'] as String, + useStartTime: json['useStartTime'] as String, + useTime: json['useTime'] as String, + ); +} + +Map _$CouponVoToJson(CouponVo instance) => { + 'bizId': instance.bizId, + 'bizType': instance.bizType, + 'centreDisplay': instance.centreDisplay, + 'couponDescription': instance.couponDescription, + 'couponImg': instance.couponImg, + 'couponName': instance.couponName, + 'createTime': instance.createTime, + 'createUser': instance.createUser, + 'discountAmount': instance.discountAmount, + 'discountPercent': instance.discountPercent, + 'fullAmount': instance.fullAmount, + 'id': instance.id, + 'isDelete': instance.isDelete, + 'memberCouponId': instance.memberCouponId, + 'promotionId': instance.promotionId, + 'publishEndTime': instance.publishEndTime, + 'publishStartTime': instance.publishStartTime, + 'receiveTime': instance.receiveTime, + 'received': instance.received, + 'status': instance.status, + 'tenantCode': instance.tenantCode, + 'updateTime': instance.updateTime, + 'updateUser': instance.updateUser, + 'useEndTime': instance.useEndTime, + 'useStartTime': instance.useStartTime, + 'useTime': instance.useTime, + }; diff --git a/lib/retrofit/data/data_type.g.dart b/lib/retrofit/data/data_type.g.dart new file mode 100644 index 00000000..1ea5414e --- /dev/null +++ b/lib/retrofit/data/data_type.g.dart @@ -0,0 +1,18 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'data_type.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +DataType _$DataTypeFromJson(Map json) { + return DataType() + ..desc = json['desc'] as String + ..code = json['code'] as String; +} + +Map _$DataTypeToJson(DataType instance) => { + 'desc': instance.desc, + 'code': instance.code, + }; diff --git a/lib/retrofit/data/delivery_info.g.dart b/lib/retrofit/data/delivery_info.g.dart new file mode 100644 index 00000000..b3f141fc --- /dev/null +++ b/lib/retrofit/data/delivery_info.g.dart @@ -0,0 +1,30 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'delivery_info.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +DeliveryInfo _$DeliveryInfoFromJson(Map json) { + return DeliveryInfo( + dadaRegStatus: json['dadaRegStatus'] as bool, + dadaSourceId: json['dadaSourceId'] as String, + dadaStatus: json['dadaStatus'] as bool, + dianwodaRegStatus: json['dianwodaRegStatus'] as bool, + dianwodaStatus: json['dianwodaStatus'] as bool, + meituanRegStatus: json['meituanRegStatus'] as bool, + meituanStatus: json['meituanStatus'] as bool, + ); +} + +Map _$DeliveryInfoToJson(DeliveryInfo instance) => + { + 'dadaRegStatus': instance.dadaRegStatus, + 'dadaSourceId': instance.dadaSourceId, + 'dadaStatus': instance.dadaStatus, + 'dianwodaRegStatus': instance.dianwodaRegStatus, + 'dianwodaStatus': instance.dianwodaStatus, + 'meituanRegStatus': instance.meituanRegStatus, + 'meituanStatus': instance.meituanStatus, + }; diff --git a/lib/retrofit/data/exchange_order.g.dart b/lib/retrofit/data/exchange_order.g.dart new file mode 100644 index 00000000..dfe5cd44 --- /dev/null +++ b/lib/retrofit/data/exchange_order.g.dart @@ -0,0 +1,45 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'exchange_order.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +ExchangeOrder _$ExchangeOrderFromJson(Map json) { + return ExchangeOrder() + ..id = json['id'] as String + ..createTime = json['createTime'] as String + ..createUser = json['createUser'] as String + ..updateTime = json['updateTime'] as String + ..updateUser = json['updateUser'] as String + ..storeId = json['storeId'] as String + ..mid = json['mid'] as String + ..orderCode = json['orderCode'] as String + ..amount = json['amount'] as String + ..state = json['state'] as int + ..useTyped = json['useTyped'] as int + ..isDelete = json['isDelete'] as int + ..creditOrderDetailList = (json['creditOrderDetailList'] as List) + ?.map((e) => e == null + ? null + : ExchangeOrderGoods.fromJson(e as Map)) + ?.toList(); +} + +Map _$ExchangeOrderToJson(ExchangeOrder instance) => + { + 'id': instance.id, + 'createTime': instance.createTime, + 'createUser': instance.createUser, + 'updateTime': instance.updateTime, + 'updateUser': instance.updateUser, + 'storeId': instance.storeId, + 'mid': instance.mid, + 'orderCode': instance.orderCode, + 'amount': instance.amount, + 'state': instance.state, + 'useTyped': instance.useTyped, + 'isDelete': instance.isDelete, + 'creditOrderDetailList': instance.creditOrderDetailList, + }; diff --git a/lib/retrofit/data/exchange_order_goods.g.dart b/lib/retrofit/data/exchange_order_goods.g.dart new file mode 100644 index 00000000..8ffd8d2d --- /dev/null +++ b/lib/retrofit/data/exchange_order_goods.g.dart @@ -0,0 +1,53 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'exchange_order_goods.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +ExchangeOrderGoods _$ExchangeOrderGoodsFromJson(Map json) { + return ExchangeOrderGoods() + ..id = json['id'] as String + ..createTime = json['createTime'] as String + ..createUser = json['createUser'] as String + ..updateTime = json['updateTime'] as String + ..updateUser = json['updateUser'] as String + ..orderId = json['orderId'] as String + ..goodsId = json['goodsId'] as String + ..categoryId = json['categoryId'] as String + ..name = json['name'] as String + ..description = json['description'] as String + ..worth = json['worth'] as String + ..price = json['price'] as String + ..couponId = json['couponId'] as String + ..canPick = json['canPick'] as bool + ..canDelivery = json['canDelivery'] as bool + ..goodsMainImg = json['goodsMainImg'] as String + ..goodsViceImg = json['goodsViceImg'] as String + ..goodsNumber = json['goodsNumber'] as int + ..isDelete = json['isDelete'] as int; +} + +Map _$ExchangeOrderGoodsToJson(ExchangeOrderGoods instance) => + { + 'id': instance.id, + 'createTime': instance.createTime, + 'createUser': instance.createUser, + 'updateTime': instance.updateTime, + 'updateUser': instance.updateUser, + 'orderId': instance.orderId, + 'goodsId': instance.goodsId, + 'categoryId': instance.categoryId, + 'name': instance.name, + 'description': instance.description, + 'worth': instance.worth, + 'price': instance.price, + 'couponId': instance.couponId, + 'canPick': instance.canPick, + 'canDelivery': instance.canDelivery, + 'goodsMainImg': instance.goodsMainImg, + 'goodsViceImg': instance.goodsViceImg, + 'goodsNumber': instance.goodsNumber, + 'isDelete': instance.isDelete, + }; diff --git a/lib/retrofit/data/member_rank.g.dart b/lib/retrofit/data/member_rank.g.dart new file mode 100644 index 00000000..5971713a --- /dev/null +++ b/lib/retrofit/data/member_rank.g.dart @@ -0,0 +1,33 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'member_rank.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +MemberRank _$MemberRankFromJson(Map json) { + return MemberRank() + ..id = json['id'] as String + ..nextId = json['nextId'] as String + ..nextName = json['nextName'] as String + ..nextOrigin = json['nextOrigin'] as int + ..rankContent = json['rankContent'] as String + ..rankImg = json['rankImg'] as String + ..rankName = json['rankName'] as String + ..rankOrigin = json['rankOrigin'] as int + ..status = json['status'] as bool; +} + +Map _$MemberRankToJson(MemberRank instance) => + { + 'id': instance.id, + 'nextId': instance.nextId, + 'nextName': instance.nextName, + 'nextOrigin': instance.nextOrigin, + 'rankContent': instance.rankContent, + 'rankImg': instance.rankImg, + 'rankName': instance.rankName, + 'rankOrigin': instance.rankOrigin, + 'status': instance.status, + }; diff --git a/lib/retrofit/data/page.g.dart b/lib/retrofit/data/page.g.dart new file mode 100644 index 00000000..0eae5c04 --- /dev/null +++ b/lib/retrofit/data/page.g.dart @@ -0,0 +1,30 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'page.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +PageInfo _$PageInfoFromJson(Map json) { + return PageInfo() + ..pageNum = json['pageNum'] as int + ..pageSize = json['pageSize'] as int + ..size = json['size'] as int + ..pages = json['pages'] as int + ..hasPreviousPage = json['hasPreviousPage'] as bool + ..hasNextPage = json['hasNextPage'] as bool + ..total = json['total'] as String + ..list = json['list'] as List; +} + +Map _$PageInfoToJson(PageInfo instance) => { + 'pageNum': instance.pageNum, + 'pageSize': instance.pageSize, + 'size': instance.size, + 'pages': instance.pages, + 'hasPreviousPage': instance.hasPreviousPage, + 'hasNextPage': instance.hasNextPage, + 'total': instance.total, + 'list': instance.list, + }; diff --git a/lib/retrofit/data/promotion.g.dart b/lib/retrofit/data/promotion.g.dart new file mode 100644 index 00000000..d6971154 --- /dev/null +++ b/lib/retrofit/data/promotion.g.dart @@ -0,0 +1,67 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'promotion.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +Promotion _$PromotionFromJson(Map json) { + return Promotion( + activityEndTime: json['activityEndTime'] as String, + activityStartTime: json['activityStartTime'] as String, + applyEndTime: json['applyEndTime'] as String, + applyStartTime: json['applyStartTime'] as String, + createTime: json['createTime'] as String, + createUser: json['createUser'] as String, + description: json['description'] as String, + id: json['id'] as String, + image: json['image'] as String, + isDelete: json['isDelete'] as num, + isNeedSecurityDeposit: json['isNeedSecurityDeposit'] as num, + name: json['name'] as String, + promotionDetail: (json['promotionDetail'] as List) + ?.map((e) => e == null + ? null + : PromotionDetailBean.fromJson(e as Map)) + ?.toList(), + promotionPlan: json['promotionPlan'] as num, + promotionType: json['promotionType'] as num, + securityDeposit: json['securityDeposit'] as String, + status: json['status'] as num, + tag: json['tag'] as String, + updateTime: json['updateTime'] as String, + updateUser: json['updateUser'] as String, + ); +} + +Map _$PromotionToJson(Promotion instance) => { + 'activityEndTime': instance.activityEndTime, + 'activityStartTime': instance.activityStartTime, + 'applyEndTime': instance.applyEndTime, + 'applyStartTime': instance.applyStartTime, + 'createTime': instance.createTime, + 'createUser': instance.createUser, + 'description': instance.description, + 'id': instance.id, + 'image': instance.image, + 'isDelete': instance.isDelete, + 'isNeedSecurityDeposit': instance.isNeedSecurityDeposit, + 'name': instance.name, + 'promotionDetail': instance.promotionDetail, + 'promotionPlan': instance.promotionPlan, + 'promotionType': instance.promotionType, + 'securityDeposit': instance.securityDeposit, + 'status': instance.status, + 'tag': instance.tag, + 'updateTime': instance.updateTime, + 'updateUser': instance.updateUser, + }; + +PromotionDetailBean _$PromotionDetailBeanFromJson(Map json) { + return PromotionDetailBean(); +} + +Map _$PromotionDetailBeanToJson( + PromotionDetailBean instance) => + {}; diff --git a/lib/retrofit/data/sign_in.g.dart b/lib/retrofit/data/sign_in.g.dart new file mode 100644 index 00000000..5d4abcd0 --- /dev/null +++ b/lib/retrofit/data/sign_in.g.dart @@ -0,0 +1,46 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'sign_in.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +SignIn _$SignInFromJson(Map json) { + return SignIn() + ..balance = json['balance'] as String + ..category = json['category'] as String + ..createTime = json['createTime'] as String + ..createUser = json['createUser'] as String + ..id = json['id'] as String + ..isDeleted = json['isDeleted'] as bool + ..linkId = json['linkId'] as String + ..mark = json['mark'] as String + ..mid = json['mid'] as String + ..number = json['number'] as String + ..pm = json['pm'] as int + ..status = json['status'] as bool + ..title = json['title'] as String + ..type = json['type'] as String + ..updateTime = json['updateTime'] as String + ..updateUser = json['updateUser'] as String; +} + +Map _$SignInToJson(SignIn instance) => { + 'balance': instance.balance, + 'category': instance.category, + 'createTime': instance.createTime, + 'createUser': instance.createUser, + 'id': instance.id, + 'isDeleted': instance.isDeleted, + 'linkId': instance.linkId, + 'mark': instance.mark, + 'mid': instance.mid, + 'number': instance.number, + 'pm': instance.pm, + 'status': instance.status, + 'title': instance.title, + 'type': instance.type, + 'updateTime': instance.updateTime, + 'updateUser': instance.updateUser, + }; diff --git a/lib/retrofit/data/sign_info.g.dart b/lib/retrofit/data/sign_info.g.dart new file mode 100644 index 00000000..9b6e5f9c --- /dev/null +++ b/lib/retrofit/data/sign_info.g.dart @@ -0,0 +1,32 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'sign_info.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +SignInfo _$SignInfoFromJson(Map json) { + return SignInfo() + ..point = json['point'] as String + ..rank = json['rank'] == null + ? null + : MemberRank.fromJson(json['rank'] as Map) + ..signInList = (json['signInList'] as List) + ?.map((e) => + e == null ? null : SignIn.fromJson(e as Map)) + ?.toList() + ..taskList = (json['taskList'] as List) + ?.map( + (e) => e == null ? null : Task.fromJson(e as Map)) + ?.toList() + ..rewardList = (json['rewardList'] as List)?.map((e) => e as int)?.toList(); +} + +Map _$SignInfoToJson(SignInfo instance) => { + 'point': instance.point, + 'rank': instance.rank, + 'signInList': instance.signInList, + 'taskList': instance.taskList, + 'rewardList': instance.rewardList, + }; diff --git a/lib/retrofit/data/store.g.dart b/lib/retrofit/data/store.g.dart new file mode 100644 index 00000000..41ee6090 --- /dev/null +++ b/lib/retrofit/data/store.g.dart @@ -0,0 +1,76 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'store.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +Store _$StoreFromJson(Map json) { + return Store() + ..id = json['id'] as String + ..createTime = json['createTime'] as String + ..createUser = json['createUser'] as String + ..updateTime = json['updateTime'] as String + ..updateUser = json['updateUser'] as String + ..tenantCode = json['tenantCode'] as String + ..useErp = json['useErp'] as bool + ..openStartTime = json['openStartTime'] as String + ..openEndTime = json['openEndTime'] as String + ..perCapitaConsumption = json['perCapitaConsumption'] as String + ..storeName = json['storeName'] as String + ..distance = (json['distance'] as num)?.toDouble() + ..logo = json['logo'] as String + ..shipAddress = json['shipAddress'] as String + ..remark = json['remark'] + ..mobile = json['mobile'] as String + ..longitude = json['longitude'] as String + ..latitude = json['latitude'] as String + ..refundAddress = json['refundAddress'] + ..refundTel = json['refundTel'] + ..refundContact = json['refundContact'] + ..isAutoSendRefundAddress = json['isAutoSendRefundAddress'] as int + ..province = json['province'] as String + ..city = json['city'] as String + ..district = json['district'] as String + ..address = json['address'] as String + ..headName = json['headName'] as String + ..headMobile = json['headMobile'] as String + ..deliveryInfo = json['deliveryInfo'] + ..posType = json['posType'] == null + ? null + : StoreType.fromJson(json['posType'] as Map); +} + +Map _$StoreToJson(Store instance) => { + 'id': instance.id, + 'createTime': instance.createTime, + 'createUser': instance.createUser, + 'updateTime': instance.updateTime, + 'updateUser': instance.updateUser, + 'tenantCode': instance.tenantCode, + 'useErp': instance.useErp, + 'openStartTime': instance.openStartTime, + 'openEndTime': instance.openEndTime, + 'perCapitaConsumption': instance.perCapitaConsumption, + 'storeName': instance.storeName, + 'distance': instance.distance, + 'logo': instance.logo, + 'shipAddress': instance.shipAddress, + 'remark': instance.remark, + 'mobile': instance.mobile, + 'longitude': instance.longitude, + 'latitude': instance.latitude, + 'refundAddress': instance.refundAddress, + 'refundTel': instance.refundTel, + 'refundContact': instance.refundContact, + 'isAutoSendRefundAddress': instance.isAutoSendRefundAddress, + 'province': instance.province, + 'city': instance.city, + 'district': instance.district, + 'address': instance.address, + 'headName': instance.headName, + 'headMobile': instance.headMobile, + 'deliveryInfo': instance.deliveryInfo, + 'posType': instance.posType, + }; diff --git a/lib/retrofit/data/store_info.g.dart b/lib/retrofit/data/store_info.g.dart new file mode 100644 index 00000000..c29af47d --- /dev/null +++ b/lib/retrofit/data/store_info.g.dart @@ -0,0 +1,93 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'store_info.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +StoreInfo _$StoreInfoFromJson(Map json) { + return StoreInfo() + ..address = json['address'] as String + ..bannerList = (json['bannerList'] as List) + ?.map((e) => + e == null ? null : BannerData.fromJson(e as Map)) + ?.toList() + ..city = json['city'] as String + ..couponVOList = (json['couponVOList'] as List) + ?.map((e) => + e == null ? null : CouponVo.fromJson(e as Map)) + ?.toList() + ..createTime = json['createTime'] as String + ..createUser = json['createUser'] as String + ..deliveryInfo = json['deliveryInfo'] == null + ? null + : DeliveryInfo.fromJson(json['deliveryInfo'] as Map) + ..district = json['district'] as String + ..headMobile = json['headMobile'] as String + ..headName = json['headName'] as String + ..id = json['id'] as String + ..isAutoSendRefundAddress = json['isAutoSendRefundAddress'] as num + ..latitude = json['latitude'] as String + ..logo = json['logo'] as String + ..longitude = json['longitude'] as String + ..mobile = json['mobile'] as String + ..openEndTime = json['openEndTime'] as String + ..openStartTime = json['openStartTime'] as String + ..perCapitaConsumption = json['perCapitaConsumption'] as String + ..posType = json['posType'] == null + ? null + : StoreType.fromJson(json['posType'] as Map) + ..promotionList = (json['promotionList'] as List) + ?.map((e) => + e == null ? null : Promotion.fromJson(e as Map)) + ?.toList() + ..province = json['province'] as String + ..refundAddress = json['refundAddress'] as String + ..refundContact = json['refundContact'] as String + ..refundTel = json['refundTel'] as String + ..remark = json['remark'] as String + ..shipAddress = json['shipAddress'] as String + ..storeName = json['storeName'] as String + ..tenantCode = json['tenantCode'] as String + ..updateTime = json['updateTime'] as String + ..updateUser = json['updateUser'] as String + ..mini = json['mini'] == null ? null : Mini.fromJson(json['mini']) + ..useErp = json['useErp'] as bool; +} + +Map _$StoreInfoToJson(StoreInfo instance) => { + 'address': instance.address, + 'bannerList': instance.bannerList, + 'city': instance.city, + 'couponVOList': instance.couponVOList, + 'createTime': instance.createTime, + 'createUser': instance.createUser, + 'deliveryInfo': instance.deliveryInfo, + 'district': instance.district, + 'headMobile': instance.headMobile, + 'headName': instance.headName, + 'id': instance.id, + 'isAutoSendRefundAddress': instance.isAutoSendRefundAddress, + 'latitude': instance.latitude, + 'logo': instance.logo, + 'longitude': instance.longitude, + 'mobile': instance.mobile, + 'openEndTime': instance.openEndTime, + 'openStartTime': instance.openStartTime, + 'perCapitaConsumption': instance.perCapitaConsumption, + 'posType': instance.posType, + 'promotionList': instance.promotionList, + 'province': instance.province, + 'refundAddress': instance.refundAddress, + 'refundContact': instance.refundContact, + 'refundTel': instance.refundTel, + 'remark': instance.remark, + 'shipAddress': instance.shipAddress, + 'storeName': instance.storeName, + 'tenantCode': instance.tenantCode, + 'updateTime': instance.updateTime, + 'updateUser': instance.updateUser, + 'mini': instance.mini, + 'useErp': instance.useErp, + }; diff --git a/lib/retrofit/data/store_type.g.dart b/lib/retrofit/data/store_type.g.dart new file mode 100644 index 00000000..7466837c --- /dev/null +++ b/lib/retrofit/data/store_type.g.dart @@ -0,0 +1,18 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'store_type.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +StoreType _$StoreTypeFromJson(Map json) { + return StoreType() + ..desc = json['desc'] as String + ..code = json['code'] as String; +} + +Map _$StoreTypeToJson(StoreType instance) => { + 'desc': instance.desc, + 'code': instance.code, + }; diff --git a/lib/retrofit/data/task.g.dart b/lib/retrofit/data/task.g.dart new file mode 100644 index 00000000..d3e953c3 --- /dev/null +++ b/lib/retrofit/data/task.g.dart @@ -0,0 +1,42 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'task.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +Task _$TaskFromJson(Map json) { + return Task() + ..aspects = json['aspects'] as String + ..complateNum = json['complateNum'] as int + ..conplateNum = json['conplateNum'] as int + ..createTime = json['createTime'] as String + ..createUser = json['createUser'] as String + ..id = json['id'] as String + ..limitDay = json['limitDay'] as int + ..name = json['name'] as String + ..rewardType = json['rewardType'] as int + ..rewardValue = json['rewardValue'] as String + ..status = json['status'] as bool + ..type = json['type'] as String + ..updateTime = json['updateTime'] as String + ..updateUser = json['updateUser'] as String; +} + +Map _$TaskToJson(Task instance) => { + 'aspects': instance.aspects, + 'complateNum': instance.complateNum, + 'conplateNum': instance.conplateNum, + 'createTime': instance.createTime, + 'createUser': instance.createUser, + 'id': instance.id, + 'limitDay': instance.limitDay, + 'name': instance.name, + 'rewardType': instance.rewardType, + 'rewardValue': instance.rewardValue, + 'status': instance.status, + 'type': instance.type, + 'updateTime': instance.updateTime, + 'updateUser': instance.updateUser, + }; diff --git a/lib/retrofit/data/upload_result.g.dart b/lib/retrofit/data/upload_result.g.dart new file mode 100644 index 00000000..dcfe4bb9 --- /dev/null +++ b/lib/retrofit/data/upload_result.g.dart @@ -0,0 +1,67 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'upload_result.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +UploadResult _$UploadResultFromJson(Map json) { + return UploadResult() + ..id = json['id'] as String + ..createTime = json['createTime'] as String + ..createUser = json['createUser'] as String + ..updateTime = json['updateTime'] as String + ..updateUser = json['updateUser'] as String + ..dataType = json['dataType'] == null + ? null + : DataType.fromJson(json['dataType'] as Map) + ..submittedFileName = json['submittedFileName'] as String + ..treePath = json['treePath'] as String + ..grade = json['grade'] as int + ..isDelete = json['isDelete'] as bool + ..folderId = json['folderId'] as String + ..url = json['url'] as String + ..size = json['size'] as String + ..folderName = json['folderName'] as String + ..group = json['group'] + ..path = json['path'] as String + ..relativePath = json['relativePath'] as String + ..fileMd5 = json['fileMd5'] + ..contextType = json['contextType'] as String + ..filename = json['filename'] as String + ..ext = json['ext'] as String + ..icon = json['icon'] as String + ..createMonth = json['createMonth'] as String + ..createWeek = json['createWeek'] as String + ..createDay = json['createDay'] as String; +} + +Map _$UploadResultToJson(UploadResult instance) => + { + 'id': instance.id, + 'createTime': instance.createTime, + 'createUser': instance.createUser, + 'updateTime': instance.updateTime, + 'updateUser': instance.updateUser, + 'dataType': instance.dataType, + 'submittedFileName': instance.submittedFileName, + 'treePath': instance.treePath, + 'grade': instance.grade, + 'isDelete': instance.isDelete, + 'folderId': instance.folderId, + 'url': instance.url, + 'size': instance.size, + 'folderName': instance.folderName, + 'group': instance.group, + 'path': instance.path, + 'relativePath': instance.relativePath, + 'fileMd5': instance.fileMd5, + 'contextType': instance.contextType, + 'filename': instance.filename, + 'ext': instance.ext, + 'icon': instance.icon, + 'createMonth': instance.createMonth, + 'createWeek': instance.createWeek, + 'createDay': instance.createDay, + }; diff --git a/lib/retrofit/data/user_entity.g.dart b/lib/retrofit/data/user_entity.g.dart new file mode 100644 index 00000000..7554c6ed --- /dev/null +++ b/lib/retrofit/data/user_entity.g.dart @@ -0,0 +1,39 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user_entity.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +UserEntity _$UserEntityFromJson(Map json) { + return UserEntity() + ..account = json['account'] as String + ..avatar = json['avatar'] as String + ..expiration = json['expiration'] as String + ..expire = json['expire'] as String + ..mobile = json['mobile'] as String + ..name = json['name'] as String + ..refreshToken = json['refreshToken'] as String + ..token = json['token'] as String + ..tokenType = json['tokenType'] as String + ..userId = json['userId'] as String + ..userType = json['userType'] as String + ..workDescribe = json['workDescribe'] as String; +} + +Map _$UserEntityToJson(UserEntity instance) => + { + 'account': instance.account, + 'avatar': instance.avatar, + 'expiration': instance.expiration, + 'expire': instance.expire, + 'mobile': instance.mobile, + 'name': instance.name, + 'refreshToken': instance.refreshToken, + 'token': instance.token, + 'tokenType': instance.tokenType, + 'userId': instance.userId, + 'userType': instance.userType, + 'workDescribe': instance.workDescribe, + }; diff --git a/lib/retrofit/data/user_info.g.dart b/lib/retrofit/data/user_info.g.dart new file mode 100644 index 00000000..2b13dca0 --- /dev/null +++ b/lib/retrofit/data/user_info.g.dart @@ -0,0 +1,48 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user_info.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +UserInfo _$UserInfoFromJson(Map json) { + return UserInfo() + ..vipNo = json['vipNo'] as String + ..nickname = json['nickname'] as String + ..headimg = json['headimg'] as String + ..userType = json['userType'] as bool + ..sex = json['sex'] as String + ..level = json['level'] as int + ..addressId = json['addressId'] as String + ..remark = json['remark'] as String + ..phone = json['phone'] as String + ..createTime = json['createTime'] as String + ..birth = json['birth'] as String + ..balance = json['balance'] + ..money = json['money'] as String + ..points = json['points'] as String + ..isBind = json['isBind'] as bool + ..memberRankVo = json['memberRankVo'] == null + ? null + : MemberRank.fromJson(json['memberRankVo'] as Map); +} + +Map _$UserInfoToJson(UserInfo instance) => { + 'vipNo': instance.vipNo, + 'nickname': instance.nickname, + 'headimg': instance.headimg, + 'userType': instance.userType, + 'sex': instance.sex, + 'level': instance.level, + 'addressId': instance.addressId, + 'remark': instance.remark, + 'phone': instance.phone, + 'createTime': instance.createTime, + 'birth': instance.birth, + 'balance': instance.balance, + 'money': instance.money, + 'points': instance.points, + 'isBind': instance.isBind, + 'memberRankVo': instance.memberRankVo, + }; diff --git a/lib/retrofit/data/verify_code.g.dart b/lib/retrofit/data/verify_code.g.dart new file mode 100644 index 00000000..662a87e0 --- /dev/null +++ b/lib/retrofit/data/verify_code.g.dart @@ -0,0 +1,33 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'verify_code.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +VerifyCode _$VerifyCodeFromJson(Map json) { + return VerifyCode() + ..code = json['code'] as int + ..data = json['data'] as Map + ..extra = json['extra'] == null + ? null + : BaseDataExtra.fromJson(json['extra'] as Map) + ..isError = json['isError'] as bool + ..isSuccess = json['isSuccess'] as bool + ..msg = json['msg'] as String + ..path = json['path'] as String + ..timestamp = json['timestamp'] as String; +} + +Map _$VerifyCodeToJson(VerifyCode instance) => + { + 'code': instance.code, + 'data': instance.data, + 'extra': instance.extra, + 'isError': instance.isError, + 'isSuccess': instance.isSuccess, + 'msg': instance.msg, + 'path': instance.path, + 'timestamp': instance.timestamp, + }; diff --git a/lib/retrofit/retrofit_api.g.dart b/lib/retrofit/retrofit_api.g.dart new file mode 100644 index 00000000..9bf498cf --- /dev/null +++ b/lib/retrofit/retrofit_api.g.dart @@ -0,0 +1,617 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'retrofit_api.dart'; + +// ************************************************************************** +// RetrofitGenerator +// ************************************************************************** + +class _ApiService implements ApiService { + _ApiService(this._dio, {this.baseUrl}) { + ArgumentError.checkNotNull(_dio, '_dio'); + baseUrl ??= 'http://platform.test.api.lotus-wallet.com/app'; + } + + final Dio _dio; + + String baseUrl; + + @override + Future upload(data, folderId) async { + ArgumentError.checkNotNull(data, 'data'); + ArgumentError.checkNotNull(folderId, 'folderId'); + const _extra = {}; + final queryParameters = {}; + final _data = FormData(); + _data.files.add(MapEntry( + 'file', + MultipartFile.fromFileSync(data.path, + filename: data.path.split(Platform.pathSeparator).last))); + if (folderId != null) { + _data.fields.add(MapEntry('folderId', folderId.toString())); + } + final _result = await _dio.request>('/file/upload', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future searchPoi(lat, lng, keywords, size, page) async { + ArgumentError.checkNotNull(lat, 'lat'); + ArgumentError.checkNotNull(lng, 'lng'); + ArgumentError.checkNotNull(keywords, 'keywords'); + ArgumentError.checkNotNull(size, 'size'); + ArgumentError.checkNotNull(page, 'page'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + final _result = await _dio.request( + 'https://restapi.amap.com/v3/place/around?key=542b46afa8e4b88fe1eb3c4d0ba0872f&location=$lat,$lng&keywords=$keywords&offset={size}&page={page}&extensions=all', + queryParameters: queryParameters, + options: RequestOptions( + method: 'GET', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = _result.data; + return value; + } + + @override + Future memberLogin(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>( + '/auth/platform/memberLogin', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future sendVerify(mobile) async { + ArgumentError.checkNotNull(mobile, 'mobile'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + final _result = await _dio.request>( + '/auth/sendVerify/$mobile', + queryParameters: queryParameters, + options: RequestOptions( + method: 'GET', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future creditGoods(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>( + '/creditGoods/list', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future creditGoodsById(id) async { + ArgumentError.checkNotNull(id, 'id'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + final _result = await _dio.request>('/creditGoods/$id', + queryParameters: queryParameters, + options: RequestOptions( + method: 'GET', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future queryInfo() async { + const _extra = {}; + final queryParameters = {}; + final _data = {}; + final _result = await _dio.request>('/member/info', + queryParameters: queryParameters, + options: RequestOptions( + method: 'GET', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future editInfo(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>( + '/member/editMemberInfo', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future signInInfo() async { + const _extra = {}; + final queryParameters = {}; + final _data = {}; + final _result = await _dio.request>( + '/member/signInInfo', + queryParameters: queryParameters, + options: RequestOptions( + method: 'GET', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future signIn() async { + const _extra = {}; + final queryParameters = {}; + final _data = {}; + final _result = await _dio.request>('/member/signIn', + queryParameters: queryParameters, + options: RequestOptions( + method: 'GET', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future recharge(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>('/member/recharge', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future receiveCoupon(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>( + '/member/receiveCoupon', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future creditOrderList(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>( + '/creditOrder/list', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future creditOrder(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>( + '/creditOrder/create', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future addAddress(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>('/address/add', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future deleteAddress(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>('/address/delete', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future queryAddress(id) async { + ArgumentError.checkNotNull(id, 'id'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + final _result = await _dio.request>( + '/address/detail/$id', + queryParameters: queryParameters, + options: RequestOptions( + method: 'GET', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future queryMemberAddress() async { + const _extra = {}; + final queryParameters = {}; + final _data = {}; + final _result = await _dio.request>( + '/address/queryMemberAddress', + queryParameters: queryParameters, + options: RequestOptions( + method: 'GET', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future updateAddress(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>('/address/update', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future queryCoupon(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>( + '/coupon/centreList', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future queryCard(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>( + '/coupon/packageList', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future queryStore(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>('/store/list', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future informationList(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>( + '/information/list', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future informationInfo(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>( + '/information/{id}', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future creditOrderReceive(id) async { + ArgumentError.checkNotNull(id, 'id'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + final _result = await _dio.request>( + '/creditOrder/receive/$id', + queryParameters: queryParameters, + options: RequestOptions( + method: 'GET', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future queryHome() async { + const _extra = {}; + final queryParameters = {}; + final _data = {}; + final _result = await _dio.request>('/home/home', + queryParameters: queryParameters, + options: RequestOptions( + method: 'GET', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future queryStoreInfo(id) async { + ArgumentError.checkNotNull(id, 'id'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + final _result = await _dio.request>('/store/$id', + queryParameters: queryParameters, + options: RequestOptions( + method: 'GET', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future queryArticle(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>( + '/information/list', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future queryBanner(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>('/banner/page', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future queryHomeBrand() async { + const _extra = {}; + final queryParameters = {}; + final _data = {}; + final _result = await _dio.request>('/home/brand', + queryParameters: queryParameters, + options: RequestOptions( + method: 'GET', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } + + @override + Future minLogin(storeId) async { + ArgumentError.checkNotNull(storeId, 'storeId'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + final _result = await _dio.request>( + '/auth/mini/login/$storeId', + queryParameters: queryParameters, + options: RequestOptions( + method: 'GET', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson(_result.data); + return value; + } +} diff --git a/lib/union/union_page.dart b/lib/union/union_page.dart index 455b5aa0..4c4b6a8e 100644 --- a/lib/union/union_page.dart +++ b/lib/union/union_page.dart @@ -1,7 +1,9 @@ +import 'dart:io'; import 'dart:ui'; import 'package:amap_flutter_location/amap_flutter_location.dart'; import 'package:amap_flutter_location/amap_location_option.dart'; +import 'package:android_intent_plus/android_intent.dart'; import 'package:dio/dio.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; @@ -19,6 +21,7 @@ import 'package:amap_flutter_base/amap_flutter_base.dart'; import 'package:amap_flutter_map/amap_flutter_map.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:huixiang/view_widget/loading_view.dart'; +import 'package:huixiang/view_widget/request_permission.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -115,13 +118,8 @@ class _UnionPage extends State with AutomaticKeepAliveClientMixin { _loadCustomData(); - SharedPreferences.getInstance().then( - (value) => { - apiService = ApiService(Dio(), token: value.getString('token')), - print("startLocation"), - startLocation(), - }, - ); + getLatLng(); + startLocation(); } LatLng latLng; @@ -139,32 +137,45 @@ class _UnionPage extends State with AutomaticKeepAliveClientMixin { SharedPreferences.getInstance().then( (value) => { apiService = ApiService(Dio(), token: value.getString('token')), - latLng = LatLng(double.tryParse(value.getString("latitude")), - double.tryParse(value.getString("longitude"))), - queryStore( - value.getString("latitude"), - value.getString("longitude"), - value.getString("province"), - value.getString("city"), - value.getString("district"), - editingController.text), - setState(() { - if (_mapController != null) { - _mapController.moveCamera( - CameraUpdate.newCameraPosition( - CameraPosition( - target: latLng, - zoom: 15.0, - ), - ), - ); + if (value.containsKey("latitude") && + value.containsKey("longitude") && + value.containsKey("province") && + value.containsKey("city") && + value.containsKey("district")) + { + latLng = LatLng(double.tryParse(value.getString("latitude")), + double.tryParse(value.getString("longitude"))), + queryStore( + value.getString("latitude"), + value.getString("longitude"), + value.getString("province"), + value.getString("city"), + value.getString("district"), + editingController.text, + ), + setState(() { + if (_mapController != null) { + _mapController.moveCamera( + CameraUpdate.newCameraPosition( + CameraPosition( + target: latLng, + zoom: 15.0, + ), + ), + ); + } + }) + } + else + { + queryStore("", "", "", "", "", editingController.text), } - }) }, ); } List storeList; + bool isFirst = true; queryStore(latitude, longitude, province, city, district, searchKey) async { BaseData baseData = await apiService.queryStore({ @@ -178,7 +189,9 @@ class _UnionPage extends State with AutomaticKeepAliveClientMixin { refreshController.refreshFailed(); }); - if (Navigator.canPop(context)) Navigator.of(context).pop(); + if (Navigator.canPop(context) && !isFirst) Navigator.of(context).pop(); + + isFirst = false; if (baseData != null && baseData.isSuccess) { storeList = (baseData.data as List) @@ -288,40 +301,82 @@ class _UnionPage extends State with AutomaticKeepAliveClientMixin { } startLocation() async { - if (await Permission.locationWhenInUse.serviceStatus.isEnabled) { - bool isShown = await Permission.contacts.shouldShowRequestRationale; - if (isShown) { - Fluttertoast.showToast( - msg: "shouldShowRequestRationale", - toastLength: Toast.LENGTH_SHORT, - gravity: ToastGravity.CENTER, - timeInSecForIosWeb: 1, - backgroundColor: Colors.red, - textColor: Colors.white, - fontSize: 16.0.sp, - ); - } - if (await Permission.location.isPermanentlyDenied) { - //openAppSettings - print("Permission.location.isPermanentlyDenied"); - getLatLng(); - } else if (await Permission.location.isGranted) { - showLoadingDialog(); - print("Permission.location.startLocation"); - aMapFlutterLocation.startLocation(); - } else { - await Permission.location.request(); - startLocation(); - print("Permission.location.request"); - getLatLng(); + if (Platform.isAndroid) { + if (!(await Permission.locationWhenInUse.serviceStatus.isEnabled)) { + enableLocation(); + refreshController.refreshCompleted(); + return; } + } + // bool isShown = await Permission.location.shouldShowRequestRationale; + // if (isShown) { + // Fluttertoast.showToast( + // msg: "shouldShowRequestRationale", + // toastLength: Toast.LENGTH_SHORT, + // gravity: ToastGravity.CENTER, + // timeInSecForIosWeb: 1, + // backgroundColor: Colors.red, + // textColor: Colors.white, + // fontSize: 16.0.sp, + // ); + // } + if (await Permission.location.isPermanentlyDenied) { + requestDialog(); + refreshController.refreshCompleted(); + } else if (await Permission.location.isGranted) { + showLoadingDialog(); + aMapFlutterLocation.startLocation(); } else { - //enabledLocation - print("getLatLng"); - getLatLng(); + await Permission.location.request(); + // startLocation(); + refreshController.refreshCompleted(); } } + enableLocation() { + showCupertinoDialog( + context: context, + builder: (context) { + return RequestPermission( + "assets/image/icon_permission_location_bg.png", + "您定位功能开关未开启,请点击去开启", + "为了向您推荐附近的门店信息,推荐您在使用期间让我们使用位置信息", + S.of(context).kaiqiquanxian, (result) async { + if (result) { + final AndroidIntent intent = AndroidIntent( + action: 'action_location_source_settings', + package: "com.zsw.huixiang"); + await intent.launch(); + startLocation(); + } + }); + }); + } + + requestDialog() { + showCupertinoDialog( + context: context, + builder: (context) { + return RequestPermission( + "assets/image/icon_permission_location_bg.png", + "您未开启位置权限,请点击开启", + "为了向您推荐附近的门店信息,推荐您在使用期间让我们使用位置信息", + S.of(context).kaiqiquanxian, (result) async { + if (result) { + if (Platform.isAndroid) { + final AndroidIntent intent = AndroidIntent( + action: 'action_application_details_settings', + data: 'package:com.zsw.huixiang'); + await intent.launch(); + if (await Permission.location.isGranted) { + startLocation(); + } + } + } + }); + }); + } + AMapController _mapController; TextEditingController editingController = TextEditingController(); @@ -472,12 +527,12 @@ class _UnionPage extends State with AutomaticKeepAliveClientMixin { crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( - store.distance > 1000 + (store.distance ?? 0) > 1000 ? S.of(context).gongli( - (store.distance / 1000 * 100).toInt() / 100.0) - : S - .of(context) - .mi((store.distance * 100).toInt() / 100.0), + ((store.distance ?? 0) / 1000 * 100).toInt() / + 100.0) + : S.of(context).mi( + ((store.distance ?? 0) * 100).toInt() / 100.0), style: TextStyle( color: Color(0xFF4C4C4C), fontSize: 12, diff --git a/lib/view_widget/loading_view.dart b/lib/view_widget/loading_view.dart index 02a6c638..2d8d99de 100644 --- a/lib/view_widget/loading_view.dart +++ b/lib/view_widget/loading_view.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:huixiang/view_widget/rotate_container.dart'; class LoadingView extends StatelessWidget { + @override Widget build(BuildContext context) { return Material( diff --git a/lib/view_widget/request_permission.dart b/lib/view_widget/request_permission.dart new file mode 100644 index 00000000..f8aa4f29 --- /dev/null +++ b/lib/view_widget/request_permission.dart @@ -0,0 +1,123 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:huixiang/generated/l10n.dart'; +import 'package:huixiang/view_widget/border_text.dart'; +import 'package:huixiang/view_widget/round_button.dart'; + +class RequestPermission extends StatefulWidget { + + final src; + final mainText; + final subText; + final leftText; + final rightText; + final Function(bool) open; + + RequestPermission(this.src,this.mainText,this.subText,this.rightText, this.open, {this.leftText,}); + + @override + State createState() { + return _RequestPermission(); + } +} + +class _RequestPermission extends State { + @override + Widget build(BuildContext context) { + return Material( + type: MaterialType.transparency, + child: Center( + child: Container( + width: 0.7867.sw, + padding: EdgeInsets.symmetric(vertical: 20.h, horizontal: 24.w), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: AspectRatio( + aspectRatio: 0.9, + child: Column( + children: [ + Image.asset( + widget.src, + width: 0.7867.sw * 0.6, + height: 0.7867.sw * 0.6 * 0.7, + fit: BoxFit.fill, + ), + SizedBox( + height: 20.w, + ), + Text( + widget.mainText, + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + SizedBox( + height: 3.w, + ), + Text( + widget.subText, + style: TextStyle( + fontSize: 12.sp, + color: Color(0xFF727272), + ), + ), + SizedBox( + height: 20.w, + ), + Row( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + child: InkWell( + onTap: (){ + widget.open(false); + Navigator.of(context).pop("cancel"); + }, + child: BorderText( + text: S.of(context).quxiao, + textColor: Color(0xFF32A060), + borderWidth: 1.w, + borderColor: Color(0xFF32A060), + padding: EdgeInsets.all(12.w), + fontSize: 16.sp, + fontWeight: FontWeight.bold, + radius: 4, + ), + ), + flex: 1, + ), + SizedBox( + width: 13.w, + ), + Expanded( + child: InkWell( + onTap: (){ + widget.open(true); + Navigator.of(context).pop("open"); + }, + child: RoundButton( + text: widget.rightText, + textColor: Colors.white, + padding: EdgeInsets.all(12.w), + fontSize: 16.sp, + backgroup: Color(0xFF32A060), + fontWeight: FontWeight.bold, + radius: 4, + ), + ), + flex: 1, + ), + ], + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index b8e0f496..7a787b2d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -36,6 +36,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.41.2" + android_intent_plus: + dependency: "direct main" + description: + name: android_intent_plus + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" args: dependency: transitive description: @@ -168,7 +175,7 @@ packages: name: cli_util url: "https://pub.dartlang.org" source: hosted - version: "0.3.2" + version: "0.3.3" clock: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index c74493d8..06e6eb0d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -48,6 +48,8 @@ dependencies: # webview_flutter: ^2.0.8 logger: ^1.0.0 + android_intent_plus: ^1.0.2 +# android_intent: ^2.0.2 flutter_screenutil: ^5.0.0+2 bubble_tab_indicator: ^0.1.6 # permission_handler: ^8.1.0 # Null safety