From db1a95d1b24bbdcde667417d5efa6e807fe96ca3 Mon Sep 17 00:00:00 2001 From: Thomas Fransolet Date: Tue, 9 Feb 2021 18:41:56 +0100 Subject: [PATCH] Add map context + map marker model + strawberry icon + clean code --- assets/images/strawberry.png | Bin 0 -> 36526 bytes lib/Components/Map/mapView.dart | 225 ---------------------------- lib/Components/Map/map_context.dart | 16 ++ lib/Components/Map/map_view.dart | 174 +++++++++++++++++++++ lib/Components/Map/markerInfo.dart | 64 -------- lib/Components/Map/marker_view.dart | 107 +++++++++++++ lib/Models/map-marker.dart | 23 +++ lib/main.dart | 17 ++- pubspec.lock | 18 ++- pubspec.yaml | 1 + 10 files changed, 349 insertions(+), 296 deletions(-) create mode 100644 assets/images/strawberry.png delete mode 100644 lib/Components/Map/mapView.dart create mode 100644 lib/Components/Map/map_context.dart create mode 100644 lib/Components/Map/map_view.dart delete mode 100644 lib/Components/Map/markerInfo.dart create mode 100644 lib/Components/Map/marker_view.dart create mode 100644 lib/Models/map-marker.dart diff --git a/assets/images/strawberry.png b/assets/images/strawberry.png new file mode 100644 index 0000000000000000000000000000000000000000..243117c911cb333d4767ae9bcd7ff39d5bb346d8 GIT binary patch literal 36526 zcmX_n1z1$k*7nd14&5s_(GtEu`SpP$HWToJx9(1$jnHoS6+C<&qgf9V9xVmmYw(nj}1+%_(3X%g@) zVqfavu|j65L>qKfwe}lVgjh28c~nub5cUn9!|#Q1$~FeY{E$W5zg%t4Lbx!7aAVe? z-27T7zfi|ghsDpYxzYw3=Yp_1cAcOvX(1A{LW?Wfc8@=bxNpRO5wW@GLBTPJ(3doV zRHSMZ#PG7===!$zMsIfx2#mm7YAi%u=1 z)2oEa^Y^7b-nJ=7W|1TvgQ(G{-zoYSNxPREEKXlztvX76#O*0qh}T?k6+t&OdX`vS zk<-F_bz9`cBW+5FH@3Gn%cVVzEer)LL~(<}HF>DRJNGBPz~TRYTpk*QbOh?28+|Yg zu)o?uTrpX;uti^|B2xOp|BZS`#enl;*fNbAExx02ur*xtoUYG%qRtxa^W_QIRu{J54SE~=)mdyp9sbBTEm2Nd z)a>^t&*D;6z-y!ucyCT+XFQt zKOy;-jK8Pp>LCv6iKg>=ST!(gTpu|et!iMLDzT2&{HEFbzvq7pZ&(_l=GGJb<&^pT zj>RQJ34WXuitd2Z_e;Ea4*sJetzSwpnnq>$=j3s_bW~AQEQm0?R~LLMK^ZkL!+%;K$EeR3x32g*YTRx`gpQtj3hx*kyPgVhFm)8|(EjA;Zt54K-(hnb@JwK}bN?2xK)^ z8<$+0y_o%~q~8R7Ke2O8=pu5-Sg-|;Q7|HKVN-mUCptmj)2=^KkIli4Vq#36pp!r; zsckI%Mb<&;vUag)Z=-vX_L_I5e+&5hM^ixYWePj4t$v6ec0Cm|GvU2hiup6?`|40f z`H~>PsbSxW;4Pm0buvQbR|r|A7Fe(B)DV9N@%Hp@ZOC-)Y|BTyc1Q+J>OUt=uD(Os zhBX9gqL_Te{P>C?RO@VUHy~Q~Z=iz)y1FS8K^l z1>%j<*Y_!06QE$$L3Dp(OGbzsQtSAX!Eh+ztC18bRT+fG#TPiNu9~ghA`2@zYIWKA zawI$7d!1Ypu!v)XUTWVR2<}?aP`8GFEmX{J@(HfIa!8_^M}(85ovdt1R4>o^giT*Z zWN;^daHQ$MEGXj0!Mm2F>s8+)TK_pTwfi_-My0%8ep++lEm5d{F_e)Ku-8zF>N2cvemYNS=r2DYNOgUnJWb^x^OmpQI`XHC)kCU|#0=}5@ozQm7+Tr5 zR`*!u&0TR`N3efv6Mu`?@Zlp`))vhum*)TgbJ-);V_F-n`wwLCR04PYhC4WSKOdWg z0>dhuoxPa*o=^v%n~g6?-gvrH)#gRe2@T$y_Qhw`JkdS*te1bmX)F23Mq0v(+p&xD zY>%iAZX^}2eKacGwDKg%#f{Qy3$)~`^bO~CZ$PMownrZ=hC??iqy6_|AU z*6$pkHN3{Y(NJqqhjt@ANu6hl!zx#6O5ITFQbV#JiuLZ_qqR{)>J zv3c_9%Q1nLe`NNpBoF=gkkF8_IP~2!&m6gJ*ZLVpo3HhFwd^Tej(9N{E%QkiVQWm0 zIh&!FR4Q;?=oLq;8>hpssBXIYaliRUCs&%41(FZSn~E-7#-w7O0M+gW4ZnLbET30Z z{X}Pa!8Uy`9d8{q_WCau^37h!N@(v$0H>a9{zi4v`yiZMH)>w!UI90{mN^D6B5sz$Tu3>MjDf4`c^yV)^GAt@KjcrH|1nO%I{)j90T* z36`EC=)|A6FN1}UvF^1o9v)6viuXc)8JqR}_Xv;itaPs{+N!k;0L#yF88B4)gx#0D zkGMk+U4o3s{nN99QtDe(n$awestppzQI?qdrVQNN{4ZKDpU<_^lyvDez$7UBL$Ogx zD(8pmlyK=9KPnYJ#z)+(^KvV(r|a2&08Yi^!H$lYxIl5Fpc71&);k?uKjY;Z?V1HRwbIlFRqWTdFZX%yD8 zK7#%4(I;2{I!dv-jcK8kE}`FJ{01#v!2E@2%jbIMub=v1VE<;oxa3&@HylxtjvG-s zE;+V~-|cNTFP=G~@=e2E(f~EVLZzlU+DL<#pi~_5OV;{Yz#r(}!xsRLl}-8b#5BP* zKH*l(?{M>!9_W50#x=@n!0mIS-Adsxto1PWMsJ=tGvvEAO_0RQIJkcPC%}tmlK_-3 z&wqgT~~LaiuN*w@LM% z4~h5wXWA{5yT=F+L5qV!Y3aa~i2JK$Uu=m_qSWCFmyUA8R$;QGfn=|!9*e$Gc}*XWNCPwSMyB%U&5mk!V6W?l&7;MN9yq0A4-zY zIew~39sOCKq);#07{ZxfAA8e9@I#y_Bjx{D5UMCR8B{ zO;}B+O^7xGF%mBCrYr08>kRb$jUTMgJ-T z_5A3S(8JMhcfsz0`{f*4>xqDtNvuUWh=9n8L}TYZ;5aElH}Q=yPWX(DMc#||vAY}t ztH%wQ)=Lb2>d7c5jX2^+=FmnPd^KP?dNGN02Tc|JV_2bL3e8u5Zmc>`SF9a}TP-cl zrYhMH#$dR1{TF@5tRaq!4xDJds)HyQBr$LQMHgH{Um^*LOdY_<5MD)5=e_?$UX z$T5RL`o*)~8WM2v2V?bO!mo&3QU92L2BD;ujB?6_5=FkTa^U;bZ`v0Lo-*>Xb)d>b3=stJK?we@P1(%5dSw>IC3iEEP};ikME z9M_VASHzQa!v-Ul(1>@Ql6J#7xI8-mqqB#jj(+*uPX&oRQNnP#<84&9t5JZe^KrT%|wAnokmRJp%oam zbi_z|XtBM4{PRW}{cMZYrU@&;p&^wm0Cu5s>a!}1a~O~0W^I|rq?z$FLSX=%&ia^M ze({qQx#@`N1@F!3Mk!@l}5WmU7rH1SiVHYqhtrLR5RZ6y*5a%d^??S^&zmojoBA*AwEIdM5u2D>(J^G{)&2NQt@ zot}DK1@aL3)yP9QbFKx>vYr01r^SbMDs(ze=I*EKSO+FXCLXPD9st8Ur-G!hU|Lis z3>R7$O{!3HYfB6Je6hcXxAbZ3kChT{O1&`rIawudce=0lQzGc*u*GcxRlp4O)i<2= zjqT%A-;$pMJ^~;kO#z!MY%3;DIRiz9$_E73T*cp^OV%gc+WR0VnO1{8gJ3-ko8xoP)3wt-;QyR$*N2T+p*Q+?sVp0TDy?Z6S>VtELjdV0NI-GI$ zfDT&y{7&)|eWFApDvXDTt_9xevl&U%IZ3hof~~)TFT>JlcKYg?39K|)S1_+gK*J16 zD~z!r)pxL$i5cSrv<`6u_uYZ!h*L%Mpe?!a4QkSsM#jjr5-PGFS|Q9)u-i^ITHjyE zxRSK4T`cp8y&$50-u9-BF|Bgwgy!n5e@QD?F>Ryi!I6zu7b{h{-TTQ%<~J)2=>YXP zjMprb*-UMNlc(ILhc+$OFL8Z>aFfc{&l?$d+(m$H#EyuN=iipmek(Z7d+YLev6N|D zZ2iUNjlm!+&#$Zrj<;$>^@TK;$Q-k+EJ$-7VHE>MR-KNN)gg*DuD>$lI|@YpqiAcboTctH|i|aQre=y#sIcp zGc5*YydCNH_j=pJzlBWugG%vIbK&;^y8jZHWD!GzWA^?E2YJTh&VFbIm-93C7J+GD z*P)M=AKxm2>)C=1G*v+l$w!BcD>S9NeDU9{QB~QpPULSkQmanf*^>N zuuyiCvB8($MEEMOR1@C>=WhGbLpD4;R9Y25An*0TuzQ2@FCg0aS>x;MuS@f%+o*-` z)`IwoDxWqkXW;a&k-{cBc0CaLU)J-L3Ak;?hvVP!EQtiyiY)UggZ_~tgz|^z>)((Z zhiaU+Y~ip2_VFLapXQ2ErXejd5s-Pke(;tCp;vwc46@f%McB3H0Y?%zec7eSx`V5{ zKfvV$`ArZ;8C%Bq9@EOU=Ei>pW>W9jSgeLPO5wHEtf(Nki|q*@W{DxGzp%2LSup2h z`1Pe`#L%KTStLO-u?CMc*bWFWDD&byk#3To6(SGytk77ILIeUHPer$&zm`rRg@um@ zHN$$Qd>DHm-#kDlqtE#WJv-Fp>Cs{JET#|?SPKr9z8q-W0aJ1ZE&+}LTSx9%bD^xw z^Vc-jOn>IVdj(^&rQyOB`Mo9*`uYVkZ2e^|D!-NGku&)A4xxo{%gM^esu7hIE(?+z zk&+}*suRD!D?8nTy_ciK2i!oADXA`ig$|LLpT!(tx!ZOGF&Ik^9&!aZJ^CMgd};T1 zF<;nXOjP6t$mdj3)G9Lnb+P>u81D7x9~|vAdQ!fHcFiPG+eR)suQ1_g(k+=CpTY{s z`$36Q2Klx*-3Am6^x4VmUv_Eu>&PJ+a*6qAHLWw0ET+=im)aR$F5=B`+fU^cZlauZ zW1Ec9ZDEVmV5()2&=X-oE^YtRHJ(4dN;KM-7;xsjRHBL`4W=4D*B>IaEJ2O}y<)H7 zA-X|vP$BV~hK8XbcFpJfuwY=jpZ(x*EIBQH3TCBokM3NS-ozx=em_xHkwRr(WHDYF zMfYQ+awDET^6(|(D7wzZ%Y_{fX5rA_TSfL!aJ2C(oliGjB!UvlRA5VSz!MXM$?fzu zeulhLcu_xenrf-=$m{b#q4mv8hTB#1?J>;5hl=L$1Vy+&4{z4Ih(URA{&k}+lze{f z?u?vDB{|QJz8DD1=-HWJ%lI*=0W^9xivDOaX8i`NrEgV1zpNbI&eI6kJq=MDd~jYU z6nngL(5E=a)akrojh;Q8>0HPu$v6v9j1qU&s;xMjs%|L2U4}qrKqCI>Ud^sPCAusL zEh|Q{t>yp#q(5K_f(6G-M5O)i1KwWWeB7r89qx%BuF7JT-F783mxR@xAL7Jk3I`OO z`9!~0g{~)(;9hAJ@kzooOP=VszEQLMMQPwQIB6>w4wSn%$i;$6Ydq^295KA^DRBl z;~esq7Uo##vjekvRUOd|ZN*aJ+z*ES47C9*gA5?`qYjnl*<|nlfPqxy#NR3HNVRb4 z*}Ou2kb&Yd*5hz7u#0H6Od<^Df+7nG-nQ`1Us$mOyL(MKW@kFsE*z!$oX-pYy-d_T zye1+_FAYb4nlbd5tun;Q;R@6dCy(X*M9!kY2TQ1{Ry^2-Zc^Wh8G8BI%^WvNim5lw z6qcNue*5MWy8<#tpa<+1qmJn2wB-^taG#uCuak?m9Z$xFGju#KMr2 zwc;pGbSTxn@6n~7WM7s&{L9X3|EKa(v!uj23htiw5~wP?x3Vp#tx_@H*ScZF6{LS>U#vBXAQXOvJD;t+J<7PsWVJi%kcSm=&hk@a+|BnJ9(^NkZZEvRHb? ze$dduxEnI<+6m;eyE-38Rez13UU?vh5xi8YecR}O1;|~W6KgT#6Uf4?WnX3!Bet)N z!aO9v7~h{40zp_cTKzLT18!@%&mGq$cCg&B768v-H{prmiRQ)6PlogR;iiEoi&=Y@ zKQE1iD*joLp5244ee7EV(pZUC`)H2RXb&mf2~(47v&!)CLsy#tid{_q0bxT588Z$p zZInX02Y8@tPRmTl~J_ zfRdNe-`&3^QblfJtF(R`>;r>X)t*3P-zpm)niQG$#pnBLv}b;L`0PZ`3duNp3uSvL z^y-8Js1dt$aHj#)STvx{6^pgtx^$9fGV;-s-h z?%Vv#{JcE*xhu00Lztgn$y9ow4RKe$+Zxi|*#H=nx{hKgb= z=Ei%DZ2iPW19oH%;YJb6+?+TTOzKdO6KYFN=Y($3$G&@@UUEA0*W9;H&qFm>m;Hfr zP{@+5u_imSq$pSi8ScmRA6-?$Gl{4PoICACb#1Apqry7JHZxfLxcU+7fmDa%F3Um^ zoyuzi&`*lcUY%G0___ZnN65sCGLr8|o*Ml%GtA)Np|VguDoaaAs;G3gSnu~tT|9SxkX~!qq{YE^v zwhoXyvdtJI&wVGfrx4r_{InEp-9$*G@ti2jP$1mO&=PQrTYyU&`_I%?D%m(uT^E8A zF{73V1YWxWhVfY4Q}V_?!%sr({Sy+BzsoxoAMR_UR`1(T!S$_9@e{ingM^Zt-+PT> z(OlEy97EaQSHYKtzN=Uz7e!fj8^!TdHq~6&;;KiW*<0WKAj11Jy7jzqg5OeKwLGP? z6n{9X`O{`B?M>&=OdYMbU0Prmc|rO;r`qqJKQCVm0zYkEjcXr}p#+qI4Dn;U0#f5O zMLtIL$;T*wJmsOokPn}o_>r8p9{rQ-FeE<;RjL`VbWP7p3y&ueV0OvDkn>NF^ZzyV z9pAYGG06uX1&nblvkS|YeTfdFy*-_HnXP(xRQHMG#-G(cTxRoqtO(j5dBAgd1dSHb z6UQd&RJKq~dNg0}9lk*4Ez7nxsPfD1^u6%syQ4l&82&1@GN;I`F+kRP|z;XDn{bRlYfq$pHA{ z%P#>u|Mv;2L(uc1z*V?AR{4b@x}pNdWV0@`r7+%e_|QKBi3dZH1iDGNY8>lQg@fcD z)y-d^ZS(0Qkh@kIfp)u%>kA~&XyM?%=C}tFA=jhAb>$@b!kplr#X)LiXQi6diR>?{ zXz$@7wefnA??yHfPATMytaSY{|T69kn;f<8S%CE>3h<(vy z?IVxkJfRZ6H>-co4#PY-iwOQvPpXOm zt{TTqNRxMuDL9r&IZYFf+Ht4akB`UXaW2%CTBJJnYrQGi(%hiwdruCZjpNg3t591A z#F3^Cnl%P&)hAgPlrF5c+=zBl05n=?nSa5(-ICeVCX6#QQ1+F1?XlHmhSOhOJObra z-N@D57nmF^%l5qP=^k=HT0cqrHO7$U@&vOBd86EwzxSuIITO$C%4D7mM7SzwPyI9^ z@w3t!1%AY0n1sy5x!j91_W6;lFsGv(Dd)-*%b{L#Ujk?o@dm(jhGJy{{ zZhEF_7(a-Of$=6@SXER<>v+YJjQE7Q&n^+|eZpVGf1+*Krcj14`LyiZe?=wQIMrdt z>n!l#TwZq-j0S15!v2kXjHG^z0RpTSbS@uv=p)2%i=F=A&0Yj%uxhCT+&r!T$~%13 zm07lz&S&Fk!Hz>wu!O4+{$b@-bVD_B?KAe!*n3^mtD}Z_ZhImuzuSspALkuQdybV; zye&dQ@#Pi~`Xv5Drg;zAhB!GBzJIe%2x+bhxZe6Km+^WCq?zO=82+JzaiX7VCW}dd znlhmZdycy7Qs`{HTTd z>+9v~OqV9m4^ZAM=1oRxd`Ghn*rYr>H(a(CMIL#?KlcD9_}ly!h8jwgxGm^KhzXUj$Z`ZxOuvpb2>A^J@lK^E7~ z892!$LCiE)VW#0=j~e?f&jhmEM;~s2Vb?r$s=(oA%!JH2CON$%XCC!&9P1 zq0U)|Kxp-xgqTy4K=i^l`k(*$s+u`-EPgQ`g&%F^#jx9aab;a&Y9mR|JQkYUlN2xl zHY@ETPUle<#J`*sO&1cGbul}JE&iJ_dSsr<*MK$z+g|>yvyYsY4{PD$IhZx$_Q$sE zmDr)~m-+N0F0(U-p8H~q8EZ}?O6%~l&Fj+2t*t5Dg~NUwHPlwzc&CEWwyTzi$v}mZ zyj@kh?>1i?+l>M@IRYBf_8qb)dNKTKZ2i{Hx!kuM6r+oOZH6i~(KTNtoFUZ*HX%8= zYcUXJHr0n+ANwW;NA6V{{MrA_GT1UUwng9hF75NsJ&>8Uw^(C8w_F%2s$Oa)3X7&e z3H}1}Ll>_sXjQYMZ>NDQ+`e;WtsbUQ=Ow8dq~tJb4M+pAA?E5>(Q7@YWh^v>y$By| z?(Igus=pXySjCu~mTP#6(bezAZq^Pj9XCj#Mw@U)66bi>nL>6-*Q=T)x6TtPu#f;k z$oC`qZTt0D>KI-tXv5b;r#(gtGA3csS29DdhV6eX)QL4j%37#qf5c2Hj@R9SS|CmN zD}$gfk$FwC3D1Cp9QSRi+!~JXc`ze-PC|6JLJ-qf?|^nGZN(z}11rcrA0AlwkSB3C`{hE~6&s~}&J+pt@ovaeF-lPkwsh0H6_ zHtQL?s!R=yRCTH>JKMCVVF4+ij|ji3MxmmAUted)U6pwcX;X#9x(7XA1=pKXFkD`$b@|Y58+ikB9;-q#not@%?QuF>{CW_PJwjSNak01p(VDn zgKL8@0Y@wMbOJrJ720~Gwq?3Pgxsh1DSOKoTAY-Q&>(98KmR~QbrQR(YIJ2oO?9Er zIJ;*5=hxsb8*LMv(+fnoyK>FjQr}zLZNt;RLxCqJ?;y5;w9j^rNS&w4qKRh8Yl=@V z8k1ax5rG(Y?8=p=40{rpcFV`*1MCQB{wWl6iIK%ea=0+}3#KvXn#0q7vsF$&dF%y$ zAadrNZ8Q?f#%Eywy~@_P+(lfzo1Un$t+h|^OLVW}6pUq(GG*qHene8Naj&P>=^G#; zAhkL+R!L|}g{-Thl=xa^F@jiTny`s~%ZgSS+vj;ja<2aJY?EO_qGEbx0> zOI)QO4Z4j$Z;$UwCWR`m>`{oGcSbk1w@m zvhpsdtEOrRe7t*_^6VU=eJ{Cb9v>J?im!^#IO9N^pOjZg0vsQ5|3sH3eORU>{-nC5 z_n7UvWcJY30XehvN}(Y|{fzj-(RMD^rJA=ywG_!(cpa$Es+dz6*&`B+i2tlSYK?fa zaVT-<(cWB&AHBPhKRJ>2bQc|m1?O+IJeF$ZyutjCCKP1aTwil#dSOfEe&gbRY;Ue? zk|xF^ih05cu2)H0j$2X#jA2!UmBi0`MCA9vRbQ0*&%3e@1fvN}XAsrKbJhqkzO5k| zvGIn=@1Oi;yb={&f*Cyh8=e$d-b>W@*OvIC)Yz)%-mko6q<*BN?2F5OZEoK>W*XvA zdCTm?J#!Z_Kh;&;mIL7~EBp;J%9=(%2VF|`v)*+ZICAB1rsZ=ot2|KCpah7Da;rNv z9&hT1b5Ym^t@T7?Vx&E!K(cllt;-nwi~W z@F&AFqI1P=_u$#{GGEAv8xQ`d6B0MV?nOmH_&cfclfN$Qqd(3mM~z4;+sQ-nZIlc zeX!u%Cl1lphbn51E=SiT}+MKmVGf57_MH#4K0G~gsPX%bG zDO$;tIr?KF7BELUk@TiyC0+M+j{~fBGJQBw4xHlZ8a>xudDZ&EUj~LGDxH6DW{w|y zyj*sqS{bf5E>frKN9~)E4+JRr1>Sc&9q7n~Jaz@tGQ;dfmn{8W8_9t{@tS%8BE>av zq1_)&DoMUq=N&tE=@m7fzsL?qJvof-IWV4f6Cb(ZxjfpRJzEy8@h)qbncXtL#{kgvC`H%ZeCk1{z*f*T`-9UBK9N}3D*ye$&z zuMk-=o4{hN>KaeLKRs9f6Gkxfu{8#jKOfzqs?^N**E_cfZJ-tRPvcmNon$l!#0>ka zFii4cIFP@!s{iVh&HJu*Y4Z+9RHqjU&8xxzIVBu)LcOzM!`>75{kqpgA`*AU0=N3!<~2$|1QWFYzGDMqr^cfZWff4r-8`|z~i1N65f%CoXQRrm{( zdW20EU-{sDT3w4WVi*bR=I*sg<{wuEpo5yc^68bVcHF z4Sm)F8qAU}8!Jzc$Ng9fw3{~398bIkBaPI)Tc(k;J_+zQH_Iw{Jr>bgEZ;x%QcPdQ zsZ0!`ZZAE&tPZdFyl3y1>&|_vWXVe~2#9Z+&_SU`mpaNy%nL>>sKt_Ckk?S(83A(E zR16Bh^5-wKwrhC)1f`7DR?H8xr~v z^WlS>9sqrPvr4$rWAXF={CNa?^v(^PwkwZf9`Up0SRk<vA7&Z04^FFU~&JW3gnXk+`Hx)Sx3v%YRYC~nK za)0y%Tf{daDwmQDUFeaG+h?2QOOmDaPe1sv^knf;Hmv#CCVmy*8{D2sSS}V_s@T$G zo^PK^S`vN(Ol>SgMm=q+CDvktC3AB*A(Iu>Qd-&G0;C=EU&J5+UH*%o^{6vLI_$(E z|0>i_1zBOW_Q;h;EEM7FPL`Di=e4-1B}v~jZ(Vw6D8_`&U7vveb`-ZemYgNcPKOu^ z=6^%Zt1jJy)lH*R?6ATf3xKgZix76dY8Ft}krpMv6g%;~9VW19O7?4{E6DYcB4f<) zk-Xxu{U5+xly^8{SfLwZb;SZt3K`1FBhL^m+lv3UV}i_7Xuibi@V%anooA$*;?LV@xnbIRnG=cZa>}Ejv2p4j7@`ai-D}D#pd6V+0a-`NK#H0f zGg$kbP3bwXb2{%#+`Qzy&LHqZrH#Nrgm5O1V!`7qw$ZB4%2gzOgp|#f8a;B|$viuA zt%B-RKTeDa5I`}`*Aw+44PKZzedUafYw}3UT&H-KCUiLPA*?4Be4;KbIW;~bJ4lfk#E@= z*srnR*h%jSnJX8PDn-ZOp=&J5-bWabzm+xpe*Ss;I?C2?cs+0{eWCH;J&Q|ZN%tKh z4~hdwF&}l6S8~Ada34>gay5_h*Se3Jfmm87z)G_?7A0STzlc!wBn%gs^`pquQK7yO zec;z=uO!<5P*EOBJ4Ar`WE=0~V^e^FZMa9TR7|GS>8WP7dpep9JTr7~Y)Z$_NcK5N z7KLH}s%n}@q~;0R6QGO^-L)Kk=NlbuV@UkwxGk9+Xq6Fl>Vi)eRb7WJ!;@G0RyniB zlwUi+Wm9xA(RmsU>DQYn$wj8L+r-*qSTd1szGL#_*kV+BPLtW7<~nmAA72lmOX9J> z3=mqf3!95ei$9&(mgWv|RS=CqBktts`PS|boO*xs?5xewqz7?sKEz!oJkojp5Sm+j zh^(q$8=F1=?$ZEKJ>^tO#6Dr($^b*}qIyC}>Kqp@C3r;}s4bAhYx>DfWWNEWJ~qYz z5UH>2R1(f$!V68AozqZqs!Gt28tGqgP7r7cl`fgA5U-L${hnzdWeRX-h2YyUzHw!w z)A&;TxZPE!LsmU(g@FL0Na4 zipNY=3ne%;~e&J&gUOsZ-rf4b+R#@R`6 z^SNg}ewhy0omWdHh{;k2mzKs|{jLL2Z1)qH76rHxwW^gRtDTxD+L(qS@RS7Yyu;II z!0e&#WBGceyZ<+`s(U_^@ou?hAu5>Ppzi3)asyll@Vy&iWKF3;->u=&do#yUvaK)h z#cJc^O!*c`6%J2|0UNs>CH?AYXWN4S_teXpLoo^nr9^2$w$ytx5VT@OTk+<8v|;~X zlSzw?P@3t_Bssd#v!hTdrGNno&1VKIV(7SdquH=UvQBkjd4ofLjppxRJJ`HrWtWGT zQ8#(42CAed9@v%qR&#mXP0g7pDQIR7odKKjcf4*vPPsF1g(Mtko?Asox82qvble@0 zQ2QgOWKro8EGLRA>f5y5wR6fS5k?Z7%M@|MObE2~@mzzMTnP;hWx&?Mf=Cv^X&xlc@m10#4grch-@kBL@N=9)@QKh+=7 zzGp(1jM(Ls6gdezD#jk^ul zUlU!+xSc&+U^gRi&BgV}0aDLE*Gt`9&ANgmx-o-_+jL-)#D)Kz(LZz(fh4x+lxEXx z1xWso2~dvw=wMCz=h_y|>sq#Zr9F3gg{pT?28>^>PQ)XMx%!8Xt_;#?6Zm2 z;MC0v+;elMUjmt&_u*u8NEVTiar}ko3B_0v=Wg~>ncwK^Co}JieV)RmoMd|xslZ}D zn@q1K&mPddw)7$fKekY^6jVhmwbUq?wcoTC(Y*Ph(=-Eo`2Kv&oOt=J;t&hYaf!EG z+m6XSBqhNPVOF&@Y!5%}wrl0kYg!~{-obo&!Lx4ijkV*Tp0z<*&nriiZrV(>alm3w@58&AE~jN-i1{c8%I zKqHl6>vK1PK{K_t)jVHD{A_)$E3 z(p`A4Z)zXEGze^zN)WblpO9asxI^JVY�_X$6VzxUz}SK_Xh*8FM%@<~UUeoEMlz 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 markers = {}; -List markersList = List(); - -class MarkersModel { - int id; - String name; - String description; - String latitude; - String longitude; - String image; - MarkersModel( - this.id, - this.name, - this.description, - this.latitude, - this.longitude, - this.image); - -// you can use this model with your backend as well : - -/* factory MarkersModel.fromJson(Map json) => MarkersModel( - id: json['id'], - name: json['name'], - description: json['description'], - latitude: json['latitude'], - longitude: json['longitude'], - image: json["image"]); -*/ -} - - -class MapViewWidget extends StatefulWidget { - MapViewWidget(); - - @override - _MapViewWidget createState() => _MapViewWidget(); -} - -class _MapViewWidget extends State { - - Completer _controller = Completer(); - - var markerSelected = "NULL"; - - void getMarkers() async { - /*final Uint8List userMarkerIcon = - await getBytesFromAsset('assets/normalMarker.png', 75); - - final Uint8List selectedMarkerIcon = - await getBytesFromAsset('assets/selectedMarker.png', 100);*/ - - markers = {}; - - markersList.add(MarkersModel( - 1, - "La Grande Poste", - "The Algiers central post office is an office building for postal services located at Alger Centre municipality in Algiers, Algeria", - "36.752887", - "3.042048", - "https://www.dzbreaking.com/wp-content/uploads/2018/03/2000.png")); - markersList.add(MarkersModel( - 2, - "Mosquee Ketchaoua", - "The Ketchaoua Mosque is a mosque in Algiers, the capital of Algeria. It was built during the Ottoman rule in the 17th century and is located at the foot of the Casbah, which is a UNESCO World Heritage Site", - "36.7850", - "3.0608", - "https://ttnotes.com/images/makam-echahid-algiers.jpg")); - markersList.add(MarkersModel( - 3, - "The shrine of the martyr", - "The Maqam Echahid is a concrete monument commemorating the Algerian war for independence. The monument was opened in 1982 on the 20th anniversary of Algeria's independence", - "36.7456", - "3.0698", - "https://www.airfrance.co.uk/GB/common/common/img/tbaf/news/ALG/la-mosquee-ketchaoua-l-histoire-avec-un-grand-h/ALG-la-mosquee-ketchaoua-l-histoire-avec-un-grand-h-2_1-1024x512.jpg")); - - - markersList.forEach((element) { - if (element.latitude != null && element.longitude != null) { - markers.add(Marker( - draggable: false, - markerId: MarkerId(element.latitude + element.longitude), - position: LatLng( - double.tryParse(element.latitude), - double.tryParse(element.longitude), - ), - icon: BitmapDescriptor.defaultMarkerWithHue( - BitmapDescriptor.hueYellow, - ), - onTap: () { - print('hello you 1'); - setState(() { - markerSelected = element.latitude + element.longitude; - }); - }, - infoWindow: InfoWindow(title: element.name))); - } - }); - } - - @override - void initState() { - getMarkers(); - print('coucou marlers'); - print(markers); - super.initState(); - } - - @override - void dispose() { - // TODO: implement dispose - super.dispose(); - } - - static final CameraPosition _kGooglePlex = CameraPosition( - target: LatLng(50.4167344, 4.879165), - zoom: 0.4746, - ); - - static final CameraPosition _kLake = CameraPosition( - bearing: 192.8334901395799, - target: LatLng(37.43296265331129, -122.08832357078792), - tilt: 59.440717697143555, - zoom: 59.151926040649414); - - @override - Widget build(BuildContext context) { - return new Scaffold( - body: Stack( - children: [ - GoogleMap( - mapType: MapType.hybrid, - initialCameraPosition: _kGooglePlex, - onMapCreated: (GoogleMapController controller) { - _controller.complete(controller); - }, - markers: markers, - onTap: (LatLng location) { - setState(() { - print(location); - }); - }, - ), - MarkerInfoWidget(title: markerSelected, - description: 'DESCRIPTION', - text: 'TEXTE kmljfdkmj dfsmlkj dfmlkj mlkj df') - ] - ), - floatingActionButton: FloatingActionButton.extended( - onPressed: _goToTheLake, - label: Text('To the lake!'), - icon: Icon(Icons.directions_boat), - ), - ); - } - - void _onMarkerTapped(Marker marker) { - - } - - Future _goToTheLake() async { - final GoogleMapController controller = await _controller.future; - controller.animateCamera(CameraUpdate.newCameraPosition(_kLake)); - } - - Marker newyork1Marker = Marker( - markerId: MarkerId('newyork1'), - position: LatLng(40.742451, -74.005959), - infoWindow: InfoWindow(title: 'Los Tacos', snippet: 'lhlkjsdf lksdfk jdsf kjdfs lkjfds lkjdflkjdjdsf ljfds ljdfslkj fdsjfdslkjfdsmkfdsmlk dfslkjh dfjdfskdsf dfsmkj fdskj df'), - icon: BitmapDescriptor.defaultMarkerWithHue( - BitmapDescriptor.hueViolet, - ), - ); - - Marker gramercyMarker = Marker( - markerId: MarkerId('asticot'), - position: LatLng(20.738380, -43.988426), - infoWindow: InfoWindow(title: 'Coucou asticot'), - icon: BitmapDescriptor.defaultMarkerWithHue( - BitmapDescriptor.hueGreen, - ), - ); - - Marker bernardinMarker = Marker( - markerId: MarkerId('bernardin'), - position: LatLng(40.761421, -73.981667), - infoWindow: InfoWindow(title: 'Le Bernardin'), - icon: BitmapDescriptor.defaultMarkerWithHue( - BitmapDescriptor.hueViolet, - ), - ); - Marker blueMarker = Marker( - markerId: MarkerId('bluehill'), - position: LatLng(40.732128, -73.999619), - infoWindow: InfoWindow(title: 'Blue Hill'), - icon: BitmapDescriptor.defaultMarkerWithHue( - BitmapDescriptor.hueViolet, - ), - ); - -//New York Marker - - - Marker newyork2Marker = Marker( - markerId: MarkerId('newyork2'), - position: LatLng(40.729640, -73.983510), - infoWindow: InfoWindow(title: 'Tree Bistro'), - icon: BitmapDescriptor.defaultMarkerWithHue( - BitmapDescriptor.hueViolet, - ), - ); - Marker newyork3Marker = Marker( - markerId: MarkerId('newyork3'), - position: LatLng(40.719109, -74.000183), - infoWindow: InfoWindow(title: 'Le Coucou'), - icon: BitmapDescriptor.defaultMarkerWithHue( - BitmapDescriptor.hueViolet, - ), - ); -} - diff --git a/lib/Components/Map/map_context.dart b/lib/Components/Map/map_context.dart new file mode 100644 index 0000000..697d1a6 --- /dev/null +++ b/lib/Components/Map/map_context.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:tablet_app/Models/map-marker.dart'; + +class MapContext with ChangeNotifier { + MapMarker _selectedMarker; + + MapContext(this._selectedMarker); + + getSelectedMarker() => _selectedMarker; + setSelectedMarker(MapMarker selectedMarker) { + _selectedMarker = selectedMarker; + notifyListeners(); + } + +} \ No newline at end of file diff --git a/lib/Components/Map/map_view.dart b/lib/Components/Map/map_view.dart new file mode 100644 index 0000000..e9e22d5 --- /dev/null +++ b/lib/Components/Map/map_view.dart @@ -0,0 +1,174 @@ +import 'dart:async'; +import 'dart:typed_data'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:provider/provider.dart'; +import 'package:tablet_app/Components/Map/marker_view.dart'; +import 'package:tablet_app/Models/map-marker.dart'; +import 'dart:ui' as ui; +import 'package:flutter/widgets.dart'; + +import 'map_context.dart'; + +Set markers = {}; +List markersList = List(); + +class MapViewWidget extends StatefulWidget { + MapViewWidget(); + + @override + _MapViewWidget createState() => _MapViewWidget(); +} + +class _MapViewWidget extends State { + + Completer _controller = Completer(); + + + Future getBytesFromAsset(String path, int width) async { + ByteData data = await rootBundle.load(path); + ui.Codec codec = await ui.instantiateImageCodec(data.buffer.asUint8List(), + targetWidth: width); + ui.FrameInfo fi = await codec.getNextFrame(); + return (await fi.image.toByteData(format: ui.ImageByteFormat.png)) + .buffer + .asUint8List(); + } + + void getMarkers(mapContext) async { + /*final Uint8List userMarkerIcon = + await getBytesFromAsset('assets/normalMarker.png', 75); +*/ + final Uint8List selectedMarkerIcon = + await getBytesFromAsset('assets/images/strawberry.png', 50); + + markers = {}; + + // TODO Call manager to fetch saved markers + + markersList.add(MapMarker( + id: 1, + title: "La Grande Poste", + description: "The Algiers central post office is an office building for postal services located at Alger Centre municipality in Algiers, Algeria", + image: "https://www.dzbreaking.com/wp-content/uploads/2018/03/2000.png", + text: "hello asticot", + latitude: "36.752887", + longitude: "3.042048" + )); + markersList.add(MapMarker( + id: 2, + title: "Mosquee Ketchaoua", + description: "The Ketchaoua Mosque is a mosque in Algiers, the capital of Algeria. It was built during the Ottoman rule in the 17th century and is located at the foot of the Casbah, which is a UNESCO World Heritage Site", + image: "https://ttnotes.com/images/makam-echahid-algiers.jpg", + latitude: "36.7850", + longitude: "3.0608" + )); + markersList.add(MapMarker( + id: 3, + title: "The shrine of the martyr", + description: "The Maqam Echahid is a concrete monument commemorating the Algerian war for independence. The monument was opened in 1982 on the 20th anniversary of Algeria's independence", + image: "https://www.airfrance.co.uk/GB/common/common/img/tbaf/news/ALG/la-mosquee-ketchaoua-l-histoire-avec-un-grand-h/ALG-la-mosquee-ketchaoua-l-histoire-avec-un-grand-h-2_1-1024x512.jpg", + latitude: "36.7456", + longitude: "3.0698" + )); + + markersList.forEach((element) { + if (element.latitude != null && element.longitude != null) { + markers.add(Marker( + draggable: false, + markerId: MarkerId(element.latitude + element.longitude), + position: LatLng( + double.tryParse(element.latitude), + double.tryParse(element.longitude), + ), + icon: BitmapDescriptor.fromBytes(selectedMarkerIcon), + /*icon: BitmapDescriptor.defaultMarkerWithHue( + BitmapDescriptor.hueYellow, + ),*/ + onTap: () { + print('hello you 1'); + setState(() { + mapContext.setSelectedMarker( + new MapMarker( + title: element.title, + description: element.description, + text: '', + longitude: element.longitude, + latitude: element.latitude + )); + }); + }, + infoWindow: InfoWindow(title: element.title))); + } + }); + } + + @override + void initState() { + print(markers); + super.initState(); + } + + @override + void dispose() { + // TODO: implement dispose + super.dispose(); + } + + static final CameraPosition _kGooglePlex = CameraPosition( + target: LatLng(50.4167344, 4.879165), + zoom: 0.4746, + ); + + /*static final CameraPosition _kLake = CameraPosition( + bearing: 192.8334901395799, + target: LatLng(37.43296265331129, -122.08832357078792), + tilt: 59.440717697143555, + zoom: 59.151926040649414);*/ + + @override + Widget build(BuildContext context) { + final mapContext = Provider.of(context); + getMarkers(mapContext); + return Stack( + children: [ + GoogleMap( + mapType: MapType.hybrid, + mapToolbarEnabled: false, + initialCameraPosition: _kGooglePlex, + onMapCreated: (GoogleMapController controller) { + _controller.complete(controller); + }, + markers: markers, + onTap: (LatLng location) { + setState(() { + print(location); + mapContext.setSelectedMarker( + new MapMarker( + title: '', + description: '', + text: '', + longitude: null, + latitude: null + )); + }); + }, + ), + MarkerViewWidget() + ] + /*floatingActionButton: FloatingActionButton.extended( + onPressed: _goToTheLake, + label: Text('To the lake!'), + icon: Icon(Icons.directions_boat), + ),*/ + ); + } + + /*Future _goToTheLake() async { + final GoogleMapController controller = await _controller.future; + controller.animateCamera(CameraUpdate.newCameraPosition(_kLake)); + }*/ + +} + diff --git a/lib/Components/Map/markerInfo.dart b/lib/Components/Map/markerInfo.dart deleted file mode 100644 index 7dd1084..0000000 --- a/lib/Components/Map/markerInfo.dart +++ /dev/null @@ -1,64 +0,0 @@ -import 'dart:async'; -import 'package:flutter/material.dart'; - -import '../../constants.dart'; - -class MarkerInfoWidget extends StatefulWidget { - final String title; - final String description; - final String text; - MarkerInfoWidget({this.title, this.description, this.text}); - - @override - _MarkerInfoWidget createState() => _MarkerInfoWidget(); -} - -class _MarkerInfoWidget extends State { - - @override - Widget build(BuildContext context) { - Size size = MediaQuery.of(context).size; - return new AnimatedPositioned( - duration: const Duration(milliseconds: 1500), - curve: Curves.easeInOutSine, - right: 160, // TODO - top: 150, // TODO - child: Container( - width: size.width * 0.29, - height: size.height * 0.6, - margin: EdgeInsets.symmetric(vertical: 3, horizontal: 4), - decoration: BoxDecoration( - color: kBackgroundLight, - shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(10.0), - boxShadow: [ - BoxShadow( - color: kBackgroundSecondGrey, - spreadRadius: 0.5, - blurRadius: 1.1, - offset: Offset(0, 1.1), // changes position of shadow - ), - ], - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Text(widget.title), - Text(widget.description), - Text(widget.text), - Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Text('Sub menu 1'), - Text('Sub menu 2'), - ] - ) - ] - ), - ) - ); - } -} - diff --git a/lib/Components/Map/marker_view.dart b/lib/Components/Map/marker_view.dart new file mode 100644 index 0000000..9423a4c --- /dev/null +++ b/lib/Components/Map/marker_view.dart @@ -0,0 +1,107 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:tablet_app/Components/Map/map_context.dart'; +import 'package:tablet_app/Models/map-marker.dart'; + +import '../../constants.dart'; + +class MarkerViewWidget extends StatefulWidget { + MarkerViewWidget(); + + @override + _MarkerInfoWidget createState() => _MarkerInfoWidget(); +} + +class _MarkerInfoWidget extends State { + Size sizeScreen = new Size(1080.0, 1920.0); // Tablet resolution + + @override + Widget build(BuildContext context) { + Size size = MediaQuery.of(context).size; + final mapContext = Provider.of(context); + + return new AnimatedPositioned( + duration: const Duration(milliseconds: 1500), + curve: Curves.easeInOutSine, + right: 140, // 140 + top: 150, // 150 + child: Visibility( + visible: mapContext.getSelectedMarker().longitude != null, + child: Container( + width: size.width * 0.29, + height: size.height * 0.6, + margin: EdgeInsets.symmetric(vertical: 3, horizontal: 4), + decoration: BoxDecoration( + color: kBackgroundLight, + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(10.0), + boxShadow: [ + BoxShadow( + color: kBackgroundSecondGrey, + spreadRadius: 0.5, + blurRadius: 1.1, + offset: Offset(0, 1.1), // changes position of shadow + ), + ], + ), + child: Stack( + children: [ + Positioned( + right: 15, + top: 15, + child: InkWell( + onTap: () { + setState(() { + mapContext.setSelectedMarker(new MapMarker(longitude: null, latitude: null, title: '', description: '', text: '')); + }); + }, + child: Container( + width: 50, + height: 50, + decoration: BoxDecoration( + color: kMainGrey, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: kMainGrey, + spreadRadius: 0.5, + blurRadius: 1.1, + offset: Offset(0, 1.1), // changes position of shadow + ), + ], + ), + child: Icon( + Icons.close, + size: 35, + color: Colors.white, + ), + ), + ), + ), + Center( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Text(mapContext.getSelectedMarker().title), + Text(mapContext.getSelectedMarker().description), + Text(mapContext.getSelectedMarker().text), + Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Text('Sub menu 1'), + Text('Sub menu 2'), + ] + ) + ] + ), + ), + ]) + ), + ) + ); + } +} + diff --git a/lib/Models/map-marker.dart b/lib/Models/map-marker.dart new file mode 100644 index 0000000..1034df3 --- /dev/null +++ b/lib/Models/map-marker.dart @@ -0,0 +1,23 @@ +class MapMarker { + int id; + String title; + String description; + String image; + String text; + String latitude; + String longitude; + + MapMarker({this.id, this.title, this.description, this.image, this.text, this.latitude, this.longitude}); + + factory MapMarker.fromJson(Map json) { + return new MapMarker( + id: json['id'] as int, + title: json['title'] as String, + description: json['description'] as String, + image: json['image'] as String, + text: json['text'] as String, + latitude: json['latitude'] as String, + longitude: json['longitude'] as String, + ); + } +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 4b892ad..f5aff87 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,11 +3,14 @@ import 'dart:collection'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:provider/provider.dart'; import 'package:webview_flutter/webview_flutter.dart'; +import 'Components/Map/map_context.dart'; import 'Components/custom_clipper.dart'; -import 'Components/Map/mapView.dart'; +import 'Components/Map/map_view.dart'; import 'Components/webView.dart'; +import 'Models/map-marker.dart'; import 'constants.dart'; void main() { @@ -286,15 +289,19 @@ class _MyHomePageState extends State with TickerProviderStateMixin child: Container( width: size.width, height: size.height, - child: MapViewWidget()/*FutureBuilder( + child: ChangeNotifierProvider( + create: (_) => MapContext(new MapMarker(latitude: null, longitude: null, title: '', description: '', text: '')), + child: MapViewWidget()/*FutureBuilder( future: _url, builder: (BuildContext context, AsyncSnapshot snapshot) => snapshot.hasData ? WebViewWidget(url: snapshot.data,) : CircularProgressIndicator()),*/ - )), + ), + ), ), ), ), + ), ); }), ), @@ -344,11 +351,11 @@ class _MyHomePageState extends State with TickerProviderStateMixin ], ), ), - floatingActionButton: FloatingActionButton( + /*floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, tooltip: 'Increment', child: Icon(Icons.add), - ), + ),*/ ), ); } diff --git a/pubspec.lock b/pubspec.lock index 6e2a3d3..d0bf98f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -80,14 +80,14 @@ packages: name: google_maps_flutter url: "https://pub.dartlang.org" source: hosted - version: "1.1.1" + version: "1.2.0" google_maps_flutter_platform_interface: dependency: transitive description: name: google_maps_flutter_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0" matcher: dependency: transitive description: @@ -102,6 +102,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.0-nullsafety.5" + nested: + dependency: transitive + description: + name: nested + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.4" path: dependency: transitive description: @@ -116,6 +123,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.3" + provider: + dependency: "direct main" + description: + name: provider + url: "https://pub.dartlang.org" + source: hosted + version: "4.3.3" sky_engine: dependency: transitive description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 6512e38..660939b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -25,6 +25,7 @@ dependencies: sdk: flutter webview_flutter: ^1.0.7 google_maps_flutter: ^1.1.1 + provider: ^4.3.2 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons.