From b2dbcd2d08e40580124b973c6ad98a790a4e80af Mon Sep 17 00:00:00 2001 From: Vitaliy Zarubin Date: Mon, 26 Jun 2023 18:28:16 +0300 Subject: [PATCH] [flutter_example_packages] Add filters, refactoring --- example/assets/images/leading.png | Bin 0 -> 2274 bytes example/aurora/icons/108x108.png | Bin 3940 -> 4793 bytes example/aurora/icons/128x128.png | Bin 4189 -> 4980 bytes example/aurora/icons/172x172.png | Bin 4191 -> 5624 bytes example/aurora/icons/86x86.png | Bin 3359 -> 3899 bytes example/data/raw/icon.png | Bin 11470 -> 8718 bytes example/data/raw/icon.xcf | Bin 0 -> 116555 bytes example/data/raw/icon2.png | Bin 0 -> 13003 bytes example/lib/base/app/app.dart | 2 +- example/lib/l10n/app_en.arb | 18 +- example/lib/l10n/app_ru.arb | 18 +- example/lib/packages/battery_plus/page.dart | 12 +- .../packages/cached_network_image/page.dart | 12 +- .../lib/packages/cupertino_icons/package.dart | 24 ++ .../lib/packages/device_info_plus/page.dart | 12 +- .../packages/flutter_cache_manager/page.dart | 12 +- .../flutter_local_notifications/page.dart | 12 +- .../packages/flutter_secure_storage/page.dart | 16 +- .../lib/packages/google_fonts/package.dart | 22 ++ example/lib/packages/intl/package.dart | 26 ++ .../lib/packages/package_info_plus/page.dart | 12 +- example/lib/packages/packages.dart | 13 +- example/lib/packages/path_provider/page.dart | 12 +- .../lib/packages/scoped_model/package.dart | 24 ++ .../lib/packages/shared_preferences/page.dart | 12 +- example/lib/packages/sqflite/package.dart | 20 ++ .../lib/packages/universal_io/package.dart | 24 ++ example/lib/packages/wakelock/page.dart | 12 +- .../lib/packages/xdga_directories/page.dart | 12 +- example/lib/pages/home/page.dart | 251 ++++++++++++------ .../lib/pages/home/widgets/home_app_bar.dart | 153 +++++++++++ .../home/widgets/package_info_dialog.dart | 52 ++-- .../pages/home/widgets/package_list_item.dart | 57 ++-- example/lib/theme/colors.dart | 7 +- example/lib/theme/theme.dart | 18 +- example/lib/widgets/base/app_state.dart | 44 +++ .../lib/widgets/base/app_stateful_widget.dart | 5 + .../widgets/base/app_stateless_widget.dart | 21 ++ example/lib/widgets/base/export.dart | 5 + example/lib/widgets/layouts/block_layout.dart | 45 +++- example/lib/widgets/texts/export.dart | 11 + example/lib/widgets/texts/text_base.dart | 27 ++ .../lib/widgets/texts/text_body_large.dart | 15 ++ .../lib/widgets/texts/text_body_medium.dart | 15 ++ .../lib/widgets/texts/text_body_small.dart | 15 ++ .../widgets/texts/text_headline_large.dart | 15 ++ .../widgets/texts/text_headline_medium.dart | 15 ++ .../widgets/texts/text_headline_small.dart | 15 ++ .../lib/widgets/texts/text_title_large.dart | 15 ++ .../lib/widgets/texts/text_title_medium.dart | 15 ++ .../lib/widgets/texts/text_title_small.dart | 15 ++ example/pubspec.lock | 53 +--- example/pubspec.yaml | 8 +- 53 files changed, 949 insertions(+), 270 deletions(-) create mode 100644 example/assets/images/leading.png create mode 100644 example/data/raw/icon.xcf create mode 100644 example/data/raw/icon2.png create mode 100644 example/lib/packages/cupertino_icons/package.dart create mode 100644 example/lib/packages/google_fonts/package.dart create mode 100644 example/lib/packages/intl/package.dart create mode 100644 example/lib/packages/scoped_model/package.dart create mode 100644 example/lib/packages/sqflite/package.dart create mode 100644 example/lib/packages/universal_io/package.dart create mode 100644 example/lib/pages/home/widgets/home_app_bar.dart create mode 100644 example/lib/widgets/base/app_state.dart create mode 100644 example/lib/widgets/base/app_stateful_widget.dart create mode 100644 example/lib/widgets/base/app_stateless_widget.dart create mode 100644 example/lib/widgets/base/export.dart create mode 100644 example/lib/widgets/texts/export.dart create mode 100644 example/lib/widgets/texts/text_base.dart create mode 100644 example/lib/widgets/texts/text_body_large.dart create mode 100644 example/lib/widgets/texts/text_body_medium.dart create mode 100644 example/lib/widgets/texts/text_body_small.dart create mode 100644 example/lib/widgets/texts/text_headline_large.dart create mode 100644 example/lib/widgets/texts/text_headline_medium.dart create mode 100644 example/lib/widgets/texts/text_headline_small.dart create mode 100644 example/lib/widgets/texts/text_title_large.dart create mode 100644 example/lib/widgets/texts/text_title_medium.dart create mode 100644 example/lib/widgets/texts/text_title_small.dart diff --git a/example/assets/images/leading.png b/example/assets/images/leading.png new file mode 100644 index 0000000000000000000000000000000000000000..654a57a878ccfa0551c37df93205c6ff97a9a23d GIT binary patch literal 2274 zcmV<82p#u{P)EX>4Tx04R}tkv&MmKpe$iQ?;TM2Rle{$WX<>f~bh2R-p(LO0CeUgUO{|(4-+r zad8w}3l4rPRvlcNb#-tR1i=pwR~IKm7b)?7NufoI2gm(*ckglc4iM^PrkWk&fT~$W zDjpLv*;O&{iY|oFi&0EV%+%+S$pk#d*FAiEy^HcJ?{j~SJ|$-|z$X&VGTpFlA>%qQu! zmKHez`nQ3L>y{?(0hc?#;FB&Hk|X(P3i&+nen#Jv1qN<`o;A0(<~~jzfHZZLxB(6h zfsq1buY0_^yS=x6&ouk{0mtET$=HyLa{vGU32;bRa{vGh*8l(w*8xH(n|J^K00(qQ zO+^Ri1{w=B5woSvWB>pF8FWQhbVF}#ZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b z2FpoAK~#9!?VR0H8fO&7pIulavJj&yDybjXnT)2!5;K`J$t2BGYc-SWPWzYjwm0px zlbg&mHK|c!w9yzRif9ujZ8gUFg)1Tf1lHZR7e)nH*hO{$l{3Q?3-7)^&U4P$!=9yv zep)3cT9VO41oCFg&$0x9ARrQrAR3E65Clk)xcf`d1~3eR5|bI`5;GWv0YIHhFp?x; zE3k?64KLRD-B&R90g{wn#WYQUWv!^>?7OcDJI>n9fu{9$bV{!nLkNM-&tqY69`oT8`SFXKQ_)bRi#iaS_bUcl?w8Sp%>>#xdj94|jgTYvs zU?fSx`=xofJrf870y&KbHk%Eu);83gcWNdxO~Cm4JjP#*V$JK#YbL3(+i~^Eb(EKJ z`2{12BHp~6hTAg3-A3sdOYRChpML|7`yLh?lz3ZSS;phOhw%9~as$T8ucEiV2f<*l;H%eQFo@p% z9(egxePfK5Uq%05F9bo*ryjPPfzVi&`L7!a!#KB?@_mM3(0->AcCK3c7~}JAVBpyk z{h+X=;J^PC5zd~`=M2#(Dt~*B_837BF!1aNI@|A}ysSbyDTTK~7#!|HEEdxTiZweZ z%-;)&$HrnY3=a1pydBa8j3|m285`0qrVwi>`0w(gb-ygK0mK%=PlccR!=AZ!1KIphDrjnusDBWV@fKM+cSMQjm^KCJFzh( zmCe7KOG@1dV73CAnsoCEIi|>2C=|k0U^6wC^$qW-k8pLhoQV9X_E&@`nPoODpOK5N0F zFFN2A=)#F9GzD{sSzbykYdzAJ9)_a?rT1nB{Img+5ee%Nl6NQoz_M0(DFGBJGfcm7 zaE#kwMJQVzV+sLO!OcJAgsjSapZO zah&XZ!AW2!io(UF7EKqgem;yY&&#xM=uIA^=MhLax-Y9-z`5AeB0G;D>#wzrdf03> zZQ+dkiSDT}Sva)M3-aJTNHno}mUM<=v)NGVs84@&olwpjjBvHKX?`MAqtDSjH3lXQ z4!yAka{ot=hzQ7B;Y$Gi&0RcixFAyImhR?iXMP0ll#T^79WM0t1v- zk!oOTPgYAB!l|;`QFq>{+>c4VsG@Q8%5`0artB|9&^^f=nl;nF2Pab&%-gom(BM$8-v6$ii#1z{6OO$v80u0+$d(#ZEZoF-IA)$auod%dcYK z*%RI73bZzp$%L=I{5m5js-=|R_FOeO+wbZYbF?&;WzpGwH)AMA0<)XOE6~+(Pq%EP zg*j>*=<2wqdJHFPDaBiHSTs#4Z)tYHQS(W0yf|h0EDoeA$*cGXgS1wB=!Hs|6(5tL w&Yy}8)=5>!GmHrgV}cbn6rvTMQI*2}2Z@Yg5!Sw(6951J07*qoM6N<$g4UW7j{pDw literal 0 HcmV?d00001 diff --git a/example/aurora/icons/108x108.png b/example/aurora/icons/108x108.png index f7af7fcba2afd66e6898c5a6d7f810a2049e53d4..a0b871d264511187a4d1a902bbdbfb47570ae3f7 100644 GIT binary patch delta 4703 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 delta 3843 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 FV1n?gB0B&8 diff --git a/example/aurora/icons/128x128.png b/example/aurora/icons/128x128.png index 1b8ffce98a175ad0534a975a74cb00f96069cc2b..5a4abc739cc7fb2640f39efddd77e8f51d9a71b3 100644 GIT binary patch delta 4892 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 O002ovPDBK*LSTZjPN9PU delta 4094 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 diff --git a/example/aurora/icons/172x172.png b/example/aurora/icons/172x172.png index 6da2b55a96938ead4493dee4eaf053d0873db03f..2979270f667fb36bb47d32ad51cbda2ae1cbaedd 100644 GIT binary patch delta 5541 zcmV;W6f~bh2R-p(LO0CeUgUO{|(4-+rad8w}3l4rP zRvlcNb#-tR1i=pwR~IKm7b)?7NufoI2gm(*ckglc4iM^PrkWk&fT~$WDjpLv*;O&{ ziY|oFi&0EV%+%+S$pk#d*FAiEy^HcJ?{j~SJ|$-|z$X&VGJoB$h&PC*H!Yp>K5>W@ zC58B$c+8*+5DV^%a&;wj>YqH2^cWL#D_Z*f-3 zRo1*Ge_=4Ett@k$<`Cjo#1fJaA)|^C%CHcnRU^ejiuPk3{;=aul1nC635*;Is6d6} z_`(0+ceiGKa(}{23dVrW7u)_A1_HZ4qh{OR$F|)#0sPOvmDciC>cGq=>9v*?IRg5( zfs5;wChq~4JHX(RE*X*|`DqIIJn()--;@OgZh@XPx3}g#P9K0Yb(OdQ4i15l0%fmz zyt})-w|~zx`}+aM;d05?kc@Kx000JJOGiWi{{a60|C7K0BnTP{DLam7TJMwW0VjVG z&q+iB^Reh`KnZC?;Y>xw8V?>Y$;4$W6h@43tcG-Q1vhc9G4H5IrCq{0n`L2P7kG$*PY{(Y{`KkqId#7CaTr2J4=>*UV1Mgp2Ec9r+W@2i za3F1F*#Hy(s{qadI04`|fa9}s)8__#Qf>f9(*Pa>@Cbl?05bI6kou4e;6nhf05~!` zH?8;r?9s!^B7lbh`~bjBwC*Giv;^Qq0I$x@O*cFN_UPed4#0f?UT%Hu(^r2z$!qIy z0>GmHKA4@Gw!8f?e+^g@0Dc1CO#pidR+10mT5P=u;3qBS`j418EYNkLZz!2UL{BvKf(p9ht)Na4{;9L}~Dl23oKZ5z7Qz{=Vh z&R;l>DBeWmU}NXbuVMStR>YG6IL^1%xH}GK4;IM>>6(VcGYk0L#~(pa>);}M$NQ6o zk1-~WVeg(hanp@ABauw_ahYx0(ZkCYsCU3~sj7;1kN!KpT)70>wl~e|<~R=5?YItq z@<(4sDkXUSg~b!B{@8zjg~e02w0v<>!PBR*AP9nQ*J-ECR^}7J;RGxxI8_0u47J%HU`fH3Wm%A25-kFj6gX9-G7Qro zU`fH3u4|~um7e~VfF+GSy2_QF2W}9sq>)N#)FIcTp8uYJC5=?&O0loMCtyh(DPiz>V{-GTAV)z?vL~_ov43v6x_T zy)nzipB8G^qUuEBHPqBpRHZToIjtZbRaoEKI*#|#NhX7WvX+f+mFfg*uhF$y!k|ZM z@KJ^J7$aCSmW}TgYS^x5L}CxBE487#={WTF$>eC9tYzan1Zy8Tg|n$} zn5o?HD8c$(3sx3#BCCw;3fX{ORjbL+_2Jfwj|!~ES~h@%vg6M zEbD*BN;Y7)=-O<0H^iAISbMPn1nWTWm1SbBxZ>$^#={2dF^a6AQN1pEespI%Ot7-A zvl6U>O4FMtcbJW}DJ%i&$V#vduc}mmWtpBoZ#)dJQi2sO>AHqmUH0X4L*pl9%F0+s725l4cj^xx(G`) zfD*0H082I?+$xsWJikd0SW7U9IxE=#@6>FnOin8oh4knnEJfCkCt9|JHJ=kL0N{BZ zQ2-~&+@6%3!@FrS@j$*0c`*nDZM?QZy zIl82a8d;(tNv^n__Tr_sY}pE)=SP!tQ6o!qqN`WiUb-onOkq5oS^quG8rJqi7D}+f ztyLfU1=`{`4ihaaz#Lez0nw4ts6*45zF%i7J&v?E#va(wZ5Sk2z1E;(GW%657DFyO zan--aS-?t>H9D%wRWuny*L-#o$;5xv%-SpSe?I<)u!q#u++#BP02NB=rNhSD3{Gc=n`Ek)uMMv7i}1frfh%PYMn>m zf1;JkyGw{R0N{uX$H3KMDOTH&s9LHfYzXhDjd1|_T`G+PxEUd@K21HV7 zQ)RNLP!!Tv^$UDu1)M`XHY$HUD6C;fuvXGZC^2>?Ax>&0a!n%=z?Lf|CfCVd(T%lH zN~4atQX3A~uq0TEIT5ca2@d5l8ZDVg2TcgoG9TgJx~pMybyu;Rp4uow~8wsz~LIO*Zj1;_y-gk8Sdk+ED*zNqt4!t#Oysw?_6t~+1xc!Oe5_|+wHSx<$r!`P+JA4rVot;n zhBjbN)4(@YWF#X3E34@($z-bQO@gXahUqd}w&${zXjph~MaB(=$pF^=djr_p03F|4 zks<>t08dYQ>6)D8x43^k*3_D)bh)$ER~>dtH}SxVjNQ6F&<;8`;B-#J>yvD4!2J=5 ztbj8n^U93emw=SXK@`&N-t`(En!axwjOix6y((ju$B{N`+4x>T#&p0Ftf<+5^{-*M z!X(kkcI_9aUbBU9pgUb-y6M;hk0Nbmz!t%E&&n{eM$HB|p0R(zWK&^2H;F_%(K*qw zEmWjye`p52H9Mx8cwlvSPuupa(}UQ62{tyshEuwVVq`T84v}rYZ*(bReNr-@uY#f-$ZN>8(;%CDG2zP zAmSs<#zn<~-v~uD!Rj?5_tLw%NmUz=q~3SpdbZ=B*F$HndmTgF&kSCj|k| z2qN6_*i#-u+wQuGYGidXa+%3|fovuZp6`4+zf-U4NPyjF588>?pm(rN3Mu?t5U_F$ zZ~Lic35JqgY<^{W{4+@~X*$8&#Fc12x(BHmazdh~1(Y_})MXmSY2Y zot{5zq;1z(6A^|LfNK|&_lcIf70`8U;Od00!{Ekr6W{()LafhyK~93@ZUfx(sb<55 zg`H`>uklDT5$p}(VcA@@YE2nwl&|Qr;U0wV55{q9nC&7^1)#3 zJSNk5k8PC7!yWG#7+~8rpx_bwr!*U1bb)rJbq6cC31GEt8-*g9v$V2Z8?!6W^x>Lp zMt*;=oZW);F9i`^rvvkv4X%SdaQ0wrj>rl)`=eO&3ryrDUHb)`CY#~k;gLt!kA)PT z@d4J2o_1rTZP!^h3#^*nWO55Ol@hu}SE*Ko<-vz$q!IT2gcP0@MEG45oNpy!f5w}* ze^uTTHefx`Vl-c1BG+ZxOH=jiLo?C{J8pkkn6lZxb7{2<{@8C3Gt5l`tJ-WZ8A2?I z>8?YFz3d1ZDX=%_I{rdYaEs5-W-Dbh-+mX*f3k=-Po09vU>kEF5-k>o7IQqNCbo6` z&@@yf8o&a;t`@Yn`UGvJQik^Sf1+7)CYe09^f}&|pN~AWN~6wX2=Q2Y9PxN(XK8=g z7FO51J%BC{WvyMhjzc~`o2iu0eCr*kwaY)@FD#zJTc@H6tzj5U`UMh+1STiky=%QL zdtRLgOda-XEog7^2-*M8$e@!-gP#1q^pU`HD%TQlG3{_SDKJNVVp%+e{#k&g&utFMXZQI65;Y;7I!*M*e zZrR?oI?>epYqH^k{3cx2g7%JUK$}^+1ofZ(7MfIdKOcGqnw6>pYAgjLMCZQ;&9VXf za^bTUwBhJEC|8R;jrkc?lM_>}XK9(H0ZI1%L&Jw9iu_(H((Y?PG`@d&9?if1Yv{5H zWOe|#oj_(9NTdgju5IZ6o?iG2{}BRDs~b9#F_~#`tm~M}LTSzS=n4d&A9fIX@K+5P zAHDI9FvJ^yiR{pTy6L&opMm2z{PE2J+{Fzpy4W2zZmV=`GZ*>D_(ZBskKm2`h~jI_Bt9>4c4+#{rX zzgEKro}3Q`w5DnL(pYj;f^&@_#BxnyHu5MIi-jN9Hncz7e<;M*3P^vf}_00Aqwl@Klk?OuDfgaVVAxBY(}7ZFTEU zP>WN~7-En4geK25_98otr)f;6qxE(aW}Nlmd{c2UH&(Japh( zyXf``t;gt9S87c5M}<_c0AJndIs#yc)?{=tP1E-=KOxpqi%|#I*|}*2z>5IL>5oXx z9W8%a{!UH_z>5bD9Z)t#SO9nxRN@+m)Mf*cT%m>NtP?FZaT&0)bJGm~j{>OE8ZnNp z)iS7^qqD6C@aVxq2O3ua+tLRBo~Q37cB<7SPmcwPm=$=w#UwfcJ3BXR19$Y)JfENxPI$*m3+k#dH@ECu9HwapPCD$Y-+g?Hl>l*+bJ9y~8Rg2TH zQ+9T4S_1G8MOy!47&=N7x=G*?Ssyxh=s?G23fCP6EodJB@FXQ-J|tSyFVHE$dJ@1R zZm^=4)b!}#We&i70A2<#L+R}B(sT_Mzx;w0;;X270#1eMgDX92-@tAFR|N1dfFFMV zxQW(z@I>p&l?!NUODzx6W%U^jqm0McX~u9j(L@eP_+ zSP|HYPeFY?EZr14gb{&P;6HCjx(O5P$~{^tB~+O-4$uH?h5 z^_hkBv*IJYW-6MWKsI%W_s`3F1ADkCV(olhw>* z`6umsZ=)2g=V9}4ukL1C@^C__`30bQZD`GsfSXjc+@%2G5;u=s`}v#P=U&HiWVoF( zsW6CtqP*6n{U;__S6}|Qqp<7ZGeZ_>co)|Zw5>_yWDO9YdXX2Z;o^OGTYz*u7Uu69;4Uw;M$Z3W;u7kjqjUGnHizOF%+1d{UAKv2p z(ZtedJ3W(gsP+(~IAZe)qNaAjAU>mIX=~jz%NSJmRk>o6>#vKI|#I$6qm+2O{%SiGSY0%sGKwx6(%zVa>Pf6Ijj zy**p{?B`L@eN2XtJ7a%7*mdJOIwyp&OcCti zf~-FsKZ>M5oS_U?v)8)a)`1g5;x;ckTXFc0|Kzsq$$v)D zpSd(CZf2x0>YGFk`2lU_`khcX`2onTN{L5jq1W!ufoH0C;0;$m(m$PQxS!(7zJ3{% z(uW#5gjZ}T6ue*30ll9w62SA>l?R^ES(5W^C*$ei+AK9I-_*emO*?6R|EWAAinwn%A?MgVxP=)$u zReuyoH+hePzFg)(SMyPw2?cFXy)*Gg)^bdFnk*kg0^iOa1XL<2LWtU~e0$SECtpn3 zFXd5Knx4`{k{>QE?w)6b-cJl1*p&3&JxzR1U@3`BI27Rl8hHC@*9QSUYIXTFcjYma;cgVDpTUA^Noq%ND-fqBi-AbZCzihh1{oz4Yu zT}h&3kqvsmiByd4+5acqB$QSn*rFT-3HaS?5(_x?wy zcZV15l;r}%Pq#Wl2jwO&UuG7&K-gmgpQ`%(z}%*Cy=0ex zlel?Mtg!$0t~yI;C%R2F=g!L8^&4GY?;cfM|9pjn-%*?P0%Wn`yX8}U@`3DVM|vO!K%Xmy@?RR4??rg*c{nFtFUFC;C9 zb~oN7r+fZ=YKns8YS#JU>;?jzQM7a2(r!*Y|CzjpG9U8L+G?dCQap?2==T~_NSL}Vg)6n? zosDTbnPy%)zSN1bK54hWbYh)Ob&s@LFQU$Omr@&yrAoVP47w*r|uIQy|Vhz&pn&~opIL(Ivgn^ z9^@O+3>8g;m>!biPgDt!HV#}<^@l+)`ZZd%uqqi*#fXbNq+DlQZB&H510B6;&!{&bW9POgN4Esjx5%FC)%p=l|a-tIvf3| zdWCx=p}&qn7+`fVWCr@snko#m{_2jQJez%cyV*YUfL1ZzRsHBGg}Ltr1$}5l1)-ma zZYij{EA+x>P7y-dZmyNCGqKC&ptX@zT0bmkvcM|{L4x20JiJ0k7M6>Nsi#66Y-h7b zJT!Cm&8m)@>?!02NV}Z6_<7b01JuScDgCufHz4gc?SYc3Wt}x-t`;VhVVsOnFnW21 z{l-dO(9WELZ05gs&z(?e<6Zw)51YsR{m%~goP8aaAH))QD#lKb;>07Hg}q&%D(5!)ULSSsNZ zGV80C#PG#fzBU*_>%r;y;G9_9h?udlU_tfKPK$nY?=6~=isi5O#j#qML0`MtmXeRU zU}I3vMMpMzkZ1oogjb#(@-IG2uRdQSLirXNfqO#G7CKfsk_fJN6G&qY0aHh`y7zL$ zmZswgm|C6l=SfWz2Dl@ z_{H@!V+Tf$pn_FjfY5auS+)w|ldjV@Z|-$;sm)x#L%Fo{d5~rqkjhxa5=!Qq+2q zW*uWQr_ZF@hi)4=ep610;M*NCaWE^ctQjVWhWEaM%J`urem_1=Uh?UX-wd12MM_@AdYp&#kK_q(ziXAw63qdc;2 zRM@$9IOwc5@^<2w|K{n6!XYoEiY1b#)M{puT@~JH>U_d!aDKT%hnEuapaSEw|Kj?P zfeJ~fC|~<8S6L%xgX4KzRw}?_By8(N)a~?I==i!sv52W}iG$FaY%}Y5 zhd$K@sT>npv_#E}g^7twxP&`oRG$<*b10vvk44b6_=BZINpAZ0&IF<2W8)K<#v#3O z5=fC}2yFd;eJFdFM8g>uHNJhYPU4j1_UCODTbd*tRr@uO|M!jrWXk@mxU(BCAX}kG zSAlygs0~MQ+A6qyDkCr@oJ>Kwl_+LAhzQzR&8agP({gYB zt&Xc%9FF_n{JBfcCpoCgWbT+yCpRNFu?xXDZ3jPWd;ZrsK})1ZNIPE!yF%g==B%9r z8sS~l(@5LN3u-7ln-7pBH3tdAp&urljecY=&AP_a-55(*YVsuY*IUth=iH`Kko?=a zgVozEh>V?DldyCBEs`MtVQq{75)_4P8~FQPcdllubqEOPJ%8^vtL}px0jSQAo_D!N zyh}6wXNA`HQC-K(9bx+}!!pkLUrQoLN86r>a8him_Tm2YGoZhFaYweStf;k7I3^=8 zmHe*ANim{EdB~o>zbpC6Ayvnyh)FF6sh;1Qk2IEX+b*ZvUM?&1##9S>h9`SeZmbmh z4d@s-wI1PReeRuqpk1i~`&q$dY7fiJCGUv(+?KGmZm1be?60C^>2Ifkf46KqyzMbR zWjK7H%@pbH0Klo3a(E>n=;B&h%}Hxi!>>=?=3FG@{#e}?A*0SEP~tb(RM*gju2>;! zEW*2WC|}a~9U-I-ACO6_E!~(goSkfn6o1B-vM~6Pfm!lc_|C1OO!9$oShAI;W*A!% zG)w>Q%Md|4&d`8n!uqT#0%ut~G{gTS!0GEL1|J~s7Iy7*kgRb~Y0`9umP}=4@lm@o zWG4Ld<#Pg$U0K=p!fF_}jPzJr2JU*%^uT;g;0VEf{5#5C#{6%THhc4y##mG$>6@9z z=cli+=`$W+pK=NhvcRMX@BJ*t%E1>~sk|e$>NQvIqrAB&YBbh7 z&(u|FI%~B2XlzQhZ?TjjW`T5vzWbRLokB)m^AdXlr{2_z06Q(?02BGOZu z6sk@#bVE0p7@kTK*fpD2&*(lz2xF5z*kBQ)Fsz?ByzH#Y;&Te-u`o8l0L`rfXV{zY z{y6tIg5i*;$@AZwDqD~2t`C{m?G4FWz|of@z{F*V8IK8%)0I68dSY0=UGgc-48;{o zq!gpfKT4H=?be*D^yd|i(`z?Af?>I~S^}@Aukrp;-#^4mx~q&lYCwlV~z#8i+@*<{hGL=LY8FY<&tnAHlQ54%h>EBb$Evm?_g)buw6M}kVC!?T<%FPt` zW_Ek7ZN%Iyv002?XS=)LX7qfNltK#{os_)NG@+#9rO(`us6skU9*FtnN!E<3@`6vE`ftiweCDTtHyu7Z6S2_ eV0!D<@h`}fpWag@b;j-qGS;`aUUkhi`u_m$_tJs@ diff --git a/example/aurora/icons/86x86.png b/example/aurora/icons/86x86.png index 8bf935b92211158124c649324306f89d05c0e016..b4e9f1fbf699c022aed26cedc038e66ec414337a 100644 GIT binary patch delta 3802 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 delta 3258 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

LmXVG)zL}*0`|b^CW-Nqv*w%3a6z#eY-8m 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 u6~BZWfb{>L!_ogQ{{isdLzTH# MaterialApp( localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, - title: 'Flutter Aurora OS', + debugShowCheckedModeBanner: false, theme: appTheme, initialRoute: '/', routes: routes, diff --git a/example/lib/l10n/app_en.arb b/example/lib/l10n/app_en.arb index c94f232..fb75208 100644 --- a/example/lib/l10n/app_en.arb +++ b/example/lib/l10n/app_en.arb @@ -1,7 +1,15 @@ { "homePageTitle": "Flutter Aurora OS", "homeWelcomeTitle": "Welcome!", - "homeWelcomeText": "In this application you can find 100500 Flutter plugins supporting Aurora OS. If it happens that something is missing for you, you can write to us or add it yourself.", + "homeWelcomeText": "In this application you can find {count} Flutter plugins supporting Aurora OS. If it happens that something is missing for you, you can write to us or add it yourself.", + "@homeWelcomeText": { + "placeholders": { + "count": { + "type": "int", + "example": "0" + } + } + }, "homeListStateDependent": "platform dependent", "homeListStateIndependent": "platform independent", "homeListVersion": "Version: {version}", @@ -12,5 +20,11 @@ "example": "1.0.0" } } - } + }, + "homeSearchTitle": "Search...", + "homeSearch": "Search packages", + "homeFilter": "Filter", + "homeNotFoundTitle": "Not found", + "homeNotFoundSubtitle": "What you were looking for is not in the list of verified plugins, but this does not mean that it will not work, check it out and you may want to add it to this list of verified plugins.", + "commonClose": "Close" } \ No newline at end of file diff --git a/example/lib/l10n/app_ru.arb b/example/lib/l10n/app_ru.arb index 40dd9cb..e410b5e 100644 --- a/example/lib/l10n/app_ru.arb +++ b/example/lib/l10n/app_ru.arb @@ -1,7 +1,15 @@ { "homePageTitle": "Flutter ОС Аврора", "homeWelcomeTitle": "Приветствую!", - "homeWelcomeText": "В этом приложении вы можете найти 100500 плагинов Flutter, поддерживающих ОС Aurora. Если вдруг вам чего-то не хватает, вы можете написать нам или добавить самостоятельно.", + "homeWelcomeText": "В этом приложении вы можете найти {count} плагинов Flutter, поддерживающих ОС Aurora. Если вдруг вам чего-то не хватает, вы можете написать нам или добавить самостоятельно.", + "@homeWelcomeText": { + "placeholders": { + "count": { + "type": "int", + "example": "0" + } + } + }, "homeListStateDependent": "платформо-зависимый", "homeListStateIndependent": "платформонезависимый", "homeListVersion": "Версия: {version}", @@ -12,5 +20,11 @@ "example": "1.0.0" } } - } + }, + "homeSearchTitle": "Поиск...", + "homeSearch": "Поиск пакетов", + "homeNotFoundTitle": "Не найдено", + "homeNotFoundSubtitle": "То что вы искали нет в списке провереных плагинов, но это не означает что он работать не будет, проверьте его и возможно вы захотите добавить его в этот список проверенных плагинов.", + "homeFilter": "Фильтр", + "commonClose": "Закрыть" } \ No newline at end of file diff --git a/example/lib/packages/battery_plus/page.dart b/example/lib/packages/battery_plus/page.dart index dd45d52..eb358aa 100644 --- a/example/lib/packages/battery_plus/page.dart +++ b/example/lib/packages/battery_plus/page.dart @@ -2,9 +2,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_example_packages/base/package/package.dart'; import 'package:flutter_example_packages/packages/battery_plus/model.dart'; import 'package:flutter_example_packages/packages/battery_plus/package.dart'; +import 'package:flutter_example_packages/widgets/base/export.dart'; import 'package:flutter_example_packages/widgets/layouts/block_layout.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -class BatteryPlusPage extends StatefulWidget { +class BatteryPlusPage extends AppStatefulWidget { BatteryPlusPage({ super.key, }); @@ -15,9 +17,13 @@ class BatteryPlusPage extends StatefulWidget { State createState() => _BatteryPlusPageState(); } -class _BatteryPlusPageState extends State { +class _BatteryPlusPageState extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/packages/cached_network_image/page.dart b/example/lib/packages/cached_network_image/page.dart index cbbf32f..919471a 100644 --- a/example/lib/packages/cached_network_image/page.dart +++ b/example/lib/packages/cached_network_image/page.dart @@ -2,9 +2,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_example_packages/base/package/package.dart'; import 'package:flutter_example_packages/packages/cached_network_image/model.dart'; import 'package:flutter_example_packages/packages/cached_network_image/package.dart'; +import 'package:flutter_example_packages/widgets/base/export.dart'; import 'package:flutter_example_packages/widgets/layouts/block_layout.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -class CachedNetworkImagePage extends StatefulWidget { +class CachedNetworkImagePage extends AppStatefulWidget { CachedNetworkImagePage({ super.key, }); @@ -15,9 +17,13 @@ class CachedNetworkImagePage extends StatefulWidget { State createState() => _CachedNetworkImagePageState(); } -class _CachedNetworkImagePageState extends State { +class _CachedNetworkImagePageState extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/packages/cupertino_icons/package.dart b/example/lib/packages/cupertino_icons/package.dart new file mode 100644 index 0000000..ead2d69 --- /dev/null +++ b/example/lib/packages/cupertino_icons/package.dart @@ -0,0 +1,24 @@ +import 'package:flutter_example_packages/base/package/package_dialog.dart'; + +/// Package values +final packageCupertinoIcons = PackageDialog( + key: 'cupertino_icons', + descEN: ''' + This is an asset repo containing the default set of icon assets + used by Flutter's Cupertino widgets. + ''', + descRU: ''' + Это репозиторий ресурсов, содержащий набор ресурсов значков по умолчанию + используется виджетами Flutter Cupertino. + ''', + messageEN: ''' + This is a platform independent plugin used in this app, should work + for you too. + ''', + messageRU: ''' + Это плагин независимый от платформы, используется в этом приложении, + должен работать и у вас. + ''', + version: '1.0.5', + isPlatformDependent: false, +); diff --git a/example/lib/packages/device_info_plus/page.dart b/example/lib/packages/device_info_plus/page.dart index 2d31fda..ee5b816 100644 --- a/example/lib/packages/device_info_plus/page.dart +++ b/example/lib/packages/device_info_plus/page.dart @@ -2,9 +2,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_example_packages/base/package/package.dart'; import 'package:flutter_example_packages/packages/device_info_plus/model.dart'; import 'package:flutter_example_packages/packages/device_info_plus/package.dart'; +import 'package:flutter_example_packages/widgets/base/export.dart'; import 'package:flutter_example_packages/widgets/layouts/block_layout.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -class DeviceInfoPlusPage extends StatefulWidget { +class DeviceInfoPlusPage extends AppStatefulWidget { DeviceInfoPlusPage({ super.key, }); @@ -15,9 +17,13 @@ class DeviceInfoPlusPage extends StatefulWidget { State createState() => _DeviceInfoPlusPageState(); } -class _DeviceInfoPlusPageState extends State { +class _DeviceInfoPlusPageState extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/packages/flutter_cache_manager/page.dart b/example/lib/packages/flutter_cache_manager/page.dart index be1249d..63d0a0c 100644 --- a/example/lib/packages/flutter_cache_manager/page.dart +++ b/example/lib/packages/flutter_cache_manager/page.dart @@ -2,9 +2,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_example_packages/base/package/package.dart'; import 'package:flutter_example_packages/packages/flutter_cache_manager/model.dart'; import 'package:flutter_example_packages/packages/flutter_cache_manager/package.dart'; +import 'package:flutter_example_packages/widgets/base/export.dart'; import 'package:flutter_example_packages/widgets/layouts/block_layout.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -class FlutterCacheManagerPage extends StatefulWidget { +class FlutterCacheManagerPage extends AppStatefulWidget { FlutterCacheManagerPage({ super.key, }); @@ -16,9 +18,13 @@ class FlutterCacheManagerPage extends StatefulWidget { _FlutterCacheManagerPageState(); } -class _FlutterCacheManagerPageState extends State { +class _FlutterCacheManagerPageState extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/packages/flutter_local_notifications/page.dart b/example/lib/packages/flutter_local_notifications/page.dart index f63fe9f..7c89cd5 100644 --- a/example/lib/packages/flutter_local_notifications/page.dart +++ b/example/lib/packages/flutter_local_notifications/page.dart @@ -2,9 +2,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_example_packages/base/package/package.dart'; import 'package:flutter_example_packages/packages/flutter_local_notifications/model.dart'; import 'package:flutter_example_packages/packages/flutter_local_notifications/package.dart'; +import 'package:flutter_example_packages/widgets/base/export.dart'; import 'package:flutter_example_packages/widgets/layouts/block_layout.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -class FlutterLocalNotificationsPage extends StatefulWidget { +class FlutterLocalNotificationsPage extends AppStatefulWidget { FlutterLocalNotificationsPage({ super.key, }); @@ -17,9 +19,13 @@ class FlutterLocalNotificationsPage extends StatefulWidget { } class _FlutterLocalNotificationsPageState - extends State { + extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/packages/flutter_secure_storage/page.dart b/example/lib/packages/flutter_secure_storage/page.dart index c502819..79d1eb9 100644 --- a/example/lib/packages/flutter_secure_storage/page.dart +++ b/example/lib/packages/flutter_secure_storage/page.dart @@ -1,11 +1,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_example_packages/base/package/package.dart'; import 'package:flutter_example_packages/packages/flutter_secure_storage/model.dart'; +import 'package:flutter_example_packages/packages/flutter_secure_storage/package.dart'; +import 'package:flutter_example_packages/widgets/base/export.dart'; import 'package:flutter_example_packages/widgets/layouts/block_layout.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package.dart'; - -class FlutterSecureStoragePage extends StatefulWidget { +class FlutterSecureStoragePage extends AppStatefulWidget { FlutterSecureStoragePage({ super.key, }); @@ -17,9 +18,14 @@ class FlutterSecureStoragePage extends StatefulWidget { _FlutterSecureStoragePageState(); } -class _FlutterSecureStoragePageState extends State { +class _FlutterSecureStoragePageState + extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/packages/google_fonts/package.dart b/example/lib/packages/google_fonts/package.dart new file mode 100644 index 0000000..9adab97 --- /dev/null +++ b/example/lib/packages/google_fonts/package.dart @@ -0,0 +1,22 @@ +import 'package:flutter_example_packages/base/package/package_dialog.dart'; + +/// Package values +final packageGoogleFonts = PackageDialog( + key: 'google_fonts', + descEN: ''' + A Flutter package to use fonts from fonts.google.com. + ''', + descRU: ''' + Пакет Flutter для использования шрифтов с fonts.google.com. + ''', + messageEN: ''' + This is a platform independent plugin used in this app, should work + for you too. + ''', + messageRU: ''' + Это плагин независимый от платформы, используется в этом приложении, + должен работать и у вас. + ''', + version: '4.0.4', + isPlatformDependent: false, +); diff --git a/example/lib/packages/intl/package.dart b/example/lib/packages/intl/package.dart new file mode 100644 index 0000000..5d004a5 --- /dev/null +++ b/example/lib/packages/intl/package.dart @@ -0,0 +1,26 @@ +import 'package:flutter_example_packages/base/package/package_dialog.dart'; + +/// Package values +final packageIntl = PackageDialog( + key: 'intl', + descEN: ''' + Provides internationalization and localization facilities, + including message translation, plurals and genders, + date/number formatting and parsing, and bidirectional text. + ''', + descRU: ''' + Предоставляет средства интернационализации и локализации, + включая перевод сообщений, множественное число и пол, + форматирование и разбор даты/числа, а также двунаправленный текст. + ''', + messageEN: ''' + This is a platform independent plugin used in this app, should work + for you too. + ''', + messageRU: ''' + Это плагин независимый от платформы, используется в этом приложении, + должен работать и у вас. + ''', + version: '0.17.0', + isPlatformDependent: false, +); diff --git a/example/lib/packages/package_info_plus/page.dart b/example/lib/packages/package_info_plus/page.dart index 0a02708..d2e2457 100644 --- a/example/lib/packages/package_info_plus/page.dart +++ b/example/lib/packages/package_info_plus/page.dart @@ -2,9 +2,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_example_packages/base/package/package.dart'; import 'package:flutter_example_packages/packages/package_info_plus/model.dart'; import 'package:flutter_example_packages/packages/package_info_plus/package.dart'; +import 'package:flutter_example_packages/widgets/base/export.dart'; import 'package:flutter_example_packages/widgets/layouts/block_layout.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -class PackageInfoPlusPage extends StatefulWidget { +class PackageInfoPlusPage extends AppStatefulWidget { PackageInfoPlusPage({ super.key, }); @@ -15,9 +17,13 @@ class PackageInfoPlusPage extends StatefulWidget { State createState() => _PackageInfoPlusPageState(); } -class _PackageInfoPlusPageState extends State { +class _PackageInfoPlusPageState extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/packages/packages.dart b/example/lib/packages/packages.dart index 793886e..299810c 100644 --- a/example/lib/packages/packages.dart +++ b/example/lib/packages/packages.dart @@ -1,30 +1,41 @@ import 'package:flutter_example_packages/base/package/package.dart'; import 'package:flutter_example_packages/packages/battery_plus/package.dart'; import 'package:flutter_example_packages/packages/cached_network_image/package.dart'; +import 'package:flutter_example_packages/packages/cupertino_icons/package.dart'; import 'package:flutter_example_packages/packages/device_info_plus/package.dart'; import 'package:flutter_example_packages/packages/flutter_cache_manager/package.dart'; import 'package:flutter_example_packages/packages/flutter_local_notifications/package.dart'; import 'package:flutter_example_packages/packages/flutter_secure_storage/package.dart'; import 'package:flutter_example_packages/packages/get_it/package.dart'; +import 'package:flutter_example_packages/packages/google_fonts/package.dart'; +import 'package:flutter_example_packages/packages/intl/package.dart'; import 'package:flutter_example_packages/packages/package_info_plus/package.dart'; import 'package:flutter_example_packages/packages/path_provider/package.dart'; +import 'package:flutter_example_packages/packages/scoped_model/package.dart'; import 'package:flutter_example_packages/packages/shared_preferences/package.dart'; +import 'package:flutter_example_packages/packages/sqflite/package.dart'; +import 'package:flutter_example_packages/packages/universal_io/package.dart'; import 'package:flutter_example_packages/packages/wakelock/package.dart'; import 'package:flutter_example_packages/packages/xdga_directories/package.dart'; /// List app packages final packages = [ - // Check with preview packageBatteryPlus, packageCachedNetworkImage, + packageCupertinoIcons, packageDeviceInfoPlus, packageFlutterCacheManager, packageFlutterLocalNotifications, packageFlutterSecureStorage, packageGetIt, + packageGoogleFonts, + packageIntl, packagePackageInfoPlus, packagePathProvider, + packageScopedModel, packageSharedPreferences, + packageSqflite, + packageUniversalIO, packageWakelock, packageXdgaDirectories, ]; diff --git a/example/lib/packages/path_provider/page.dart b/example/lib/packages/path_provider/page.dart index b443716..003bfea 100644 --- a/example/lib/packages/path_provider/page.dart +++ b/example/lib/packages/path_provider/page.dart @@ -2,9 +2,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_example_packages/base/package/package.dart'; import 'package:flutter_example_packages/packages/path_provider/model.dart'; import 'package:flutter_example_packages/packages/path_provider/package.dart'; +import 'package:flutter_example_packages/widgets/base/export.dart'; import 'package:flutter_example_packages/widgets/layouts/block_layout.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -class PathProviderPage extends StatefulWidget { +class PathProviderPage extends AppStatefulWidget { PathProviderPage({super.key}); final Package package = packagePathProvider; @@ -13,9 +15,13 @@ class PathProviderPage extends StatefulWidget { State createState() => _PathProviderPageState(); } -class _PathProviderPageState extends State { +class _PathProviderPageState extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/packages/scoped_model/package.dart b/example/lib/packages/scoped_model/package.dart new file mode 100644 index 0000000..c928823 --- /dev/null +++ b/example/lib/packages/scoped_model/package.dart @@ -0,0 +1,24 @@ +import 'package:flutter_example_packages/base/package/package_dialog.dart'; + +/// Package values +final packageScopedModel = PackageDialog( + key: 'scoped_model', + descEN: ''' + A set of utilities that allow you to easily pass a data Model + from a parent Widget down to its descendants. + ''', + descRU: ''' + Набор утилит, позволяющих легко передать Модель данных + от родительского виджета до его потомков. + ''', + messageEN: ''' + This is a platform independent plugin used in this app, should work + for you too. + ''', + messageRU: ''' + Это плагин независимый от платформы, используется в этом приложении, + должен работать и у вас. + ''', + version: '2.0.0', + isPlatformDependent: false, +); diff --git a/example/lib/packages/shared_preferences/page.dart b/example/lib/packages/shared_preferences/page.dart index 6954810..617b53b 100644 --- a/example/lib/packages/shared_preferences/page.dart +++ b/example/lib/packages/shared_preferences/page.dart @@ -2,9 +2,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_example_packages/base/package/package.dart'; import 'package:flutter_example_packages/packages/shared_preferences/model.dart'; import 'package:flutter_example_packages/packages/shared_preferences/package.dart'; +import 'package:flutter_example_packages/widgets/base/export.dart'; import 'package:flutter_example_packages/widgets/layouts/block_layout.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -class SharedPreferencesPage extends StatefulWidget { +class SharedPreferencesPage extends AppStatefulWidget { SharedPreferencesPage({ super.key, }); @@ -15,9 +17,13 @@ class SharedPreferencesPage extends StatefulWidget { State createState() => _SharedPreferencesPageState(); } -class _SharedPreferencesPageState extends State { +class _SharedPreferencesPageState extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/packages/sqflite/package.dart b/example/lib/packages/sqflite/package.dart new file mode 100644 index 0000000..48b374e --- /dev/null +++ b/example/lib/packages/sqflite/package.dart @@ -0,0 +1,20 @@ +import 'package:flutter_example_packages/base/package/package_dialog.dart'; + +/// Package values +final packageSqflite = PackageDialog( + key: 'sqflite', + descEN: ''' + SQLite plugin for Flutter. Supports iOS, Android, MacOS and Aurora OS. + ''', + descRU: ''' + Плагин SQLite для Flutter. Поддерживает iOS, Android, MacOS и ОС Aurora. + ''', + messageEN: ''' + Platform dependent plugin. Preview of work in development. + ''', + messageRU: ''' + Платформо-зависимый плагин. Превью работы в разработке. + ''', + version: '2.2.6', + isPlatformDependent: true, +); diff --git a/example/lib/packages/universal_io/package.dart b/example/lib/packages/universal_io/package.dart new file mode 100644 index 0000000..ca3687e --- /dev/null +++ b/example/lib/packages/universal_io/package.dart @@ -0,0 +1,24 @@ +import 'package:flutter_example_packages/base/package/package_dialog.dart'; + +/// Package values +final packageUniversalIO = PackageDialog( + key: 'universal_io', + descEN: ''' + A cross-platform dart:io that works on all platforms, + including browsers. + ''', + descRU: ''' + Кроссплатформенный dart:io, который работает на всех платформах, + включая браузеры. + ''', + messageEN: ''' + This is a platform independent plugin used in this app, should work + for you too. + ''', + messageRU: ''' + Это плагин независимый от платформы, используется в этом приложении, + должен работать и у вас. + ''', + version: '2.2.0', + isPlatformDependent: false, +); diff --git a/example/lib/packages/wakelock/page.dart b/example/lib/packages/wakelock/page.dart index a3b69c4..9e5688d 100644 --- a/example/lib/packages/wakelock/page.dart +++ b/example/lib/packages/wakelock/page.dart @@ -2,9 +2,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_example_packages/base/package/package.dart'; import 'package:flutter_example_packages/packages/wakelock/model.dart'; import 'package:flutter_example_packages/packages/wakelock/package.dart'; +import 'package:flutter_example_packages/widgets/base/export.dart'; import 'package:flutter_example_packages/widgets/layouts/block_layout.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -class WakelockPage extends StatefulWidget { +class WakelockPage extends AppStatefulWidget { WakelockPage({ super.key, }); @@ -15,9 +17,13 @@ class WakelockPage extends StatefulWidget { State createState() => _WakelockPageState(); } -class _WakelockPageState extends State { +class _WakelockPageState extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/packages/xdga_directories/page.dart b/example/lib/packages/xdga_directories/page.dart index e0dd17b..39b7f95 100644 --- a/example/lib/packages/xdga_directories/page.dart +++ b/example/lib/packages/xdga_directories/page.dart @@ -2,9 +2,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_example_packages/base/package/package.dart'; import 'package:flutter_example_packages/packages/xdga_directories/model.dart'; import 'package:flutter_example_packages/packages/xdga_directories/package.dart'; +import 'package:flutter_example_packages/widgets/base/export.dart'; import 'package:flutter_example_packages/widgets/layouts/block_layout.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -class XdgaDirectoriesPage extends StatefulWidget { +class XdgaDirectoriesPage extends AppStatefulWidget { XdgaDirectoriesPage({ super.key, }); @@ -15,9 +17,13 @@ class XdgaDirectoriesPage extends StatefulWidget { State createState() => _XdgaDirectoriesPageState(); } -class _XdgaDirectoriesPageState extends State { +class _XdgaDirectoriesPageState extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/pages/home/page.dart b/example/lib/pages/home/page.dart index 70860f9..a6a566e 100644 --- a/example/lib/pages/home/page.dart +++ b/example/lib/pages/home/page.dart @@ -1,13 +1,18 @@ import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/base/package/package.dart'; import 'package:flutter_example_packages/extensions/keys_ext.dart'; import 'package:flutter_example_packages/packages/packages.dart'; import 'package:flutter_example_packages/pages/home/model.dart'; +import 'package:flutter_example_packages/pages/home/widgets/home_app_bar.dart'; import 'package:flutter_example_packages/pages/home/widgets/package_list_item.dart'; import 'package:flutter_example_packages/theme/colors.dart'; +import 'package:flutter_example_packages/widgets/base/app_state.dart'; +import 'package:flutter_example_packages/widgets/base/app_stateful_widget.dart'; import 'package:flutter_example_packages/widgets/layouts/block_layout.dart'; +import 'package:flutter_example_packages/widgets/texts/export.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -class HomePage extends StatefulWidget { +class HomePage extends AppStatefulWidget { const HomePage({ super.key, }); @@ -16,107 +21,183 @@ class HomePage extends StatefulWidget { State createState() => _HomePageState(); } -class _HomePageState extends State { - double _hH = 0; +class _HomePageState extends AppState { final _header = GlobalKey(); + double _hH = 0; + String _search = ""; + PlatformFilter _filter = PlatformFilter.disable; + final ScrollController _controllerListView = ScrollController(); @override - void initState() { - super.initState(); - WidgetsBinding.instance.addPostFrameCallback((_) => setState(() { - _hH = _header.getHeight() ?? 0; - Future.delayed(const Duration(milliseconds: 100), () { - setState(() { - _hH = _header.getHeight() ?? 0; - }); - }); - Future.delayed(const Duration(milliseconds: 200), () { - setState(() { - _hH = _header.getHeight() ?? 0; - }); - }); - Future.delayed(const Duration(milliseconds: 500), () { - setState(() { - _hH = _header.getHeight() ?? 0; - }); - }); - })); + void didChangeMetrics() { + setState(() { + _hH = _header.getHeight() ?? 0; + }); + } + + List filterPackages( + String search, + PlatformFilter filter, + ) { + return packages.where((element) { + bool result = true; + switch (_filter) { + case PlatformFilter.dependent: + result = element.isPlatformDependent == true; + break; + case PlatformFilter.independent: + result = element.isPlatformDependent == false; + break; + case PlatformFilter.disable: + break; + } + if (_search.isNotEmpty) { + if (!element.key.contains(_search)) { + result = false; + } + } + return result; + }).toList(); } @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final localizations = AppLocalizations.of(context)!; + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { + final packagesFilter = filterPackages(_search, _filter); return BlockLayout(builder: (context, child, model) { return Scaffold( - body: Stack( - children: [ - Container( - height: _hH > 0 ? _hH : 0, - color: AppColors.primary, - width: double.infinity, - child: Center( - child: Align( - alignment: FractionalOffset.bottomRight, - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 20, - vertical: 60, - ), - child: Opacity( - opacity: 0.2, - child: Image.asset( - 'images/logo-head.png', - width: 250, + backgroundColor: Colors.blueGrey, + appBar: HomeAppBar( + onChangeSearch: (String text) { + if (packagesFilter.isNotEmpty) { + _controllerListView.jumpTo(0); + } + setState(() { + _search = text; + }); + }, + onChangeFilter: (PlatformFilter filter) { + if (packagesFilter.isNotEmpty) { + _controllerListView.jumpTo(0); + } + setState(() { + _filter = filter; + }); + }, + ), + body: GestureDetector( + onTap: () { + FocusScope.of(context).requestFocus(FocusNode()); + }, + child: Stack( + children: [ + Visibility( + visible: _search.isEmpty, + child: Container( + height: _hH > 0 ? _hH : 0, + color: AppColors.primary, + width: double.infinity, + child: Center( + child: Align( + alignment: FractionalOffset.bottomRight, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 40, + ), + child: Opacity( + opacity: 0.2, + child: Image.asset( + 'images/logo-head.png', + width: 250, + ), + ), ), ), ), ), ), - ), - Container( - key: _header, - width: double.infinity, - padding: const EdgeInsets.only( - left: 20, - right: 20, - top: 60, - bottom: 80, + Visibility( + visible: _search.isEmpty, + child: Container( + key: _header, + width: double.infinity, + padding: const EdgeInsets.only( + left: 20, + right: 20, + top: 30, + bottom: 90, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextTitleLarge( + l10n.homeWelcomeTitle, + color: Colors.white, + ), + const SizedBox(height: 40), + TextBodyLarge( + l10n.homeWelcomeText(packages.length), + color: Colors.white, + ) + ], + ), + ), ), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - localizations.homeWelcomeTitle, - textAlign: TextAlign.left, - style: theme.textTheme.titleLarge?.copyWith( - color: AppColors.primaryDark, + if (packagesFilter.isNotEmpty) + ListView.builder( + keyboardDismissBehavior: + ScrollViewKeyboardDismissBehavior.onDrag, + controller: _controllerListView, + padding: EdgeInsets.only( + top: _hH > 0 && _search.isEmpty ? _hH - 20 : 0), + itemCount: packagesFilter.length, + itemBuilder: (context, index) { + return PackageListItemWidget( + index: index, + item: packagesFilter[index], + ); + }, + ), + if (packagesFilter.isEmpty) + Container( + width: double.infinity, + height: double.infinity, + color: Colors.white, + child: Padding( + padding: const EdgeInsets.only( + left: 20, + right: 20, + top: 20, + bottom: 0, ), - ), - const SizedBox(height: 50), - Text( - localizations.homeWelcomeText, - textAlign: TextAlign.left, - style: theme.textTheme.bodyLarge?.copyWith( - color: AppColors.primaryDark, - height: 1.5, + child: Center( + child: Padding( + padding: const EdgeInsets.all(20), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + TextTitleSmall( + l10n.homeNotFoundTitle, + textAlign: TextAlign.center, + ), + const SizedBox(height: 40), + TextBodyMedium( + l10n.homeNotFoundSubtitle, + textAlign: TextAlign.center, + ), + ], + ), + ), ), ), - ], - ), - ), - ListView.builder( - padding: EdgeInsets.only(top: _hH > 0 ? _hH - 16 : 0), - itemCount: packages.length, - itemBuilder: (context, index) { - return PackageListItemWidget( - index: index, - item: packages[index], - ); - }, - ), - ], + ), + ], + ), ), ); }); diff --git a/example/lib/pages/home/widgets/home_app_bar.dart b/example/lib/pages/home/widgets/home_app_bar.dart new file mode 100644 index 0000000..d3819bb --- /dev/null +++ b/example/lib/pages/home/widgets/home_app_bar.dart @@ -0,0 +1,153 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/widgets/base/export.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; + +enum PlatformFilter { + disable, + dependent, + independent, +} + +class HomeAppBar extends AppStatefulWidget implements PreferredSizeWidget { + const HomeAppBar({ + super.key, + required this.onChangeSearch, + required this.onChangeFilter, + }); + + final void Function(String) onChangeSearch; + final void Function(PlatformFilter) onChangeFilter; + + @override + State createState() => _HomeAppBarState(); + + @override + Size get preferredSize => const Size.fromHeight(56.0); +} + +class _HomeAppBarState extends AppState { + bool _enableSearch = false; + PlatformFilter _filter = PlatformFilter.disable; + final TextEditingController _searchController = TextEditingController(); + final FocusNode _searchFocus = FocusNode(); + + @override + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { + final theme = Theme.of(context); + return AppBar( + centerTitle: true, + shape: const Border(bottom: BorderSide(width: 0)), + leading: _enableSearch + ? Padding( + padding: const EdgeInsets.all(8.0), + child: ClipOval( + child: Material( + color: Colors.blueGrey, + child: IconButton( + icon: const Icon(Icons.close), + tooltip: l10n.homeSearch, + onPressed: () { + setState(() { + widget.onChangeSearch.call(""); + _searchController.clear(); + _enableSearch = false; + }); + }, + ), + ), + ), + ) + : null, + title: _enableSearch + ? TextField( + focusNode: _searchFocus, + controller: _searchController, + style: theme.textTheme.titleSmall?.copyWith(color: Colors.white), + cursorColor: Colors.white, + decoration: InputDecoration( + hintText: l10n.homeSearchTitle, + hintStyle: + theme.textTheme.titleSmall?.copyWith(color: Colors.white54), + border: InputBorder.none, + ), + onChanged: (value) { + widget.onChangeSearch.call(value); + }, + ) + : null, + actions: [ + if (!_enableSearch) + Padding( + padding: const EdgeInsets.all(8.0), + child: ClipOval( + child: Material( + color: Colors.blueGrey, + child: IconButton( + icon: const Icon(Icons.search), + tooltip: l10n.homeSearch, + onPressed: () { + setState(() { + _enableSearch = true; + _searchFocus.requestFocus(); + }); + }, + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: ClipOval( + child: Material( + color: () { + switch (_filter) { + case PlatformFilter.disable: + return Colors.blueGrey; + case PlatformFilter.dependent: + return Colors.deepOrangeAccent; + case PlatformFilter.independent: + return Colors.blueAccent; + } + }.call(), + child: IconButton( + icon: () { + switch (_filter) { + case PlatformFilter.disable: + return const Icon(Icons.filter_list_off); + case PlatformFilter.dependent: + return const Icon(Icons.filter_list); + case PlatformFilter.independent: + return const Icon(Icons.filter_list); + } + }.call(), + tooltip: l10n.homeFilter, + onPressed: () { + setState(() { + switch (_filter) { + case PlatformFilter.disable: + _filter = PlatformFilter.dependent; + widget.onChangeFilter.call(_filter); + break; + case PlatformFilter.dependent: + _filter = PlatformFilter.independent; + widget.onChangeFilter.call(_filter); + break; + case PlatformFilter.independent: + _filter = PlatformFilter.disable; + widget.onChangeFilter.call(_filter); + break; + } + }); + }, + ), + ), + ), + ), + ], + ); + } +} diff --git a/example/lib/pages/home/widgets/package_info_dialog.dart b/example/lib/pages/home/widgets/package_info_dialog.dart index 73e269e..27babda 100644 --- a/example/lib/pages/home/widgets/package_info_dialog.dart +++ b/example/lib/pages/home/widgets/package_info_dialog.dart @@ -1,7 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_example_packages/base/package/package_dialog.dart'; +import 'package:flutter_example_packages/theme/radius.dart'; +import 'package:flutter_example_packages/widgets/base/export.dart'; +import 'package:flutter_example_packages/widgets/texts/export.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -class PackageInfoDialog extends StatelessWidget { +class PackageInfoDialog extends AppStatelessWidget { const PackageInfoDialog({ super.key, required this.package, @@ -10,44 +14,34 @@ class PackageInfoDialog extends StatelessWidget { final PackageDialog package; @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return Dialog( + shape: RoundedRectangleBorder(borderRadius: AppRadius.small), child: Padding( padding: const EdgeInsets.all(20), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - package.key, - textAlign: TextAlign.left, - style: theme.textTheme.titleSmall, - ), + TextTitleSmall(package.key), const SizedBox(height: 15), - Text( - package.message, - textAlign: TextAlign.left, - style: theme.textTheme.bodyLarge?.copyWith( - height: 1.5, - ), - ), + TextBodyLarge(package.message), const SizedBox(height: 20), - Row( - children: [ - const Spacer(), - OutlinedButton( - onPressed: () { - Navigator.of(context).pop(); - }, - child: const Text("Close"), + Row( + children: [ + const Spacer(), + OutlinedButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text(l10n.commonClose), + ), + ], ), - - ], - - ), - ], ), ), diff --git a/example/lib/pages/home/widgets/package_list_item.dart b/example/lib/pages/home/widgets/package_list_item.dart index fab01b5..2d7a60e 100644 --- a/example/lib/pages/home/widgets/package_list_item.dart +++ b/example/lib/pages/home/widgets/package_list_item.dart @@ -5,9 +5,11 @@ import 'package:flutter_example_packages/base/package/package_page.dart'; import 'package:flutter_example_packages/pages/home/widgets/package_info_dialog.dart'; import 'package:flutter_example_packages/theme/colors.dart'; import 'package:flutter_example_packages/theme/radius.dart'; +import 'package:flutter_example_packages/widgets/base/export.dart'; +import 'package:flutter_example_packages/widgets/texts/export.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -class PackageListItemWidget extends StatelessWidget { +class PackageListItemWidget extends AppStatelessWidget { const PackageListItemWidget({ super.key, required this.index, @@ -18,13 +20,14 @@ class PackageListItemWidget extends StatelessWidget { final Package item; @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final localizations = AppLocalizations.of(context)!; - + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return Container( decoration: BoxDecoration( - color: Colors.white, + color: Colors.blueGrey, borderRadius: index == 0 ? const BorderRadius.only( topLeft: Radius.circular(20), @@ -47,35 +50,27 @@ class PackageListItemWidget extends StatelessWidget { SizedBox( width: double.infinity, child: Card( + color: Colors.white, child: Padding( padding: const EdgeInsets.all(20), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - item.key, - textAlign: TextAlign.left, - style: theme.textTheme.titleSmall, - ), + TextTitleSmall(item.key), const SizedBox(height: 10), - Text( + TextBodyMedium( item.desc, - textAlign: TextAlign.left, - style: theme.textTheme.bodyMedium?.copyWith( - color: Colors.black.withOpacity(0.6)), + color: Colors.black.withOpacity(0.6), ), const SizedBox(height: 12), Divider( - height: 1, - color: - AppColors.primaryDark.withOpacity(0.2)), + height: 1, + color: AppColors.primary.withOpacity(0.2), + ), const SizedBox(height: 12), - Text( - localizations.homeListVersion(item.version), - textAlign: TextAlign.left, - style: theme.textTheme.caption?.copyWith( - color: AppColors.primaryDark - .withOpacity(0.7)), + TextBodySmall( + l10n.homeListVersion(item.version), + color: AppColors.primary.withOpacity(0.7), ), ], ), @@ -115,7 +110,7 @@ class PackageListItemWidget extends StatelessWidget { margin: const EdgeInsets.only(right: 16), decoration: BoxDecoration( color: item.isPlatformDependent - ? Colors.orange + ? Colors.deepOrangeAccent : Colors.blueAccent, borderRadius: AppRadius.small, ), @@ -126,15 +121,11 @@ class PackageListItemWidget extends StatelessWidget { right: 6, bottom: 6, ), - child: Text( + child: TextBodySmall( item.isPlatformDependent - ? localizations.homeListStateDependent - : localizations.homeListStateIndependent, - textAlign: TextAlign.left, - style: theme.textTheme.caption?.copyWith( - color: Colors.white, - fontWeight: FontWeight.w100, - ), + ? l10n.homeListStateDependent + : l10n.homeListStateIndependent, + color: Colors.white, ), ), ), diff --git a/example/lib/theme/colors.dart b/example/lib/theme/colors.dart index 3048166..a5c47a7 100644 --- a/example/lib/theme/colors.dart +++ b/example/lib/theme/colors.dart @@ -1,8 +1,7 @@ -import 'dart:ui'; +import 'package:flutter/material.dart'; class AppColors { - static const Color primary = Color(0xFFCBDCF8); - static const Color primaryDark = Color(0xFF3c67b5); - static const Color secondary = Color(0xFF00b3ad); + static const Color primary = Color(0xFF080614); + static const Color secondary = Colors.blueGrey; static const Color warning = Color(0xFFfb7d4a); } diff --git a/example/lib/theme/theme.dart b/example/lib/theme/theme.dart index 39900cf..ed714a4 100644 --- a/example/lib/theme/theme.dart +++ b/example/lib/theme/theme.dart @@ -44,36 +44,36 @@ final appTheme = ThemeData( /// [Text] textTheme: TextTheme( - headlineLarge: GoogleFonts.ubuntu( + headlineLarge: GoogleFonts.roboto( fontSize: 44, fontWeight: FontWeight.bold, ), - headlineMedium: GoogleFonts.ubuntu( + headlineMedium: GoogleFonts.roboto( fontSize: 36, fontWeight: FontWeight.bold, ), - headlineSmall: GoogleFonts.ubuntu( + headlineSmall: GoogleFonts.roboto( fontSize: 24, fontWeight: FontWeight.bold, ), - titleLarge: GoogleFonts.ubuntu( + titleLarge: GoogleFonts.roboto( fontSize: 44, ), - titleMedium: GoogleFonts.ubuntu( + titleMedium: GoogleFonts.roboto( fontSize: 36, ), - titleSmall: GoogleFonts.ubuntu( + titleSmall: GoogleFonts.roboto( fontSize: 24, ), - bodyLarge: GoogleFonts.ubuntu( + bodyLarge: GoogleFonts.openSans( fontSize: 18, height: 1.5, ), - bodyMedium: GoogleFonts.ubuntu( + bodyMedium: GoogleFonts.openSans( fontSize: 16, height: 1.5, ), - bodySmall: GoogleFonts.ubuntu( + bodySmall: GoogleFonts.openSans( fontSize: 12, height: 1.5, ), diff --git a/example/lib/widgets/base/app_state.dart b/example/lib/widgets/base/app_state.dart new file mode 100644 index 0000000..99d0804 --- /dev/null +++ b/example/lib/widgets/base/app_state.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; + +abstract class AppState extends State + with WidgetsBindingObserver { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ); + + void onPostFrameCallback() {} + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addObserver(this); + WidgetsBinding.instance.addPostFrameCallback((_) { + didChangeMetrics(); + Future.delayed(const Duration(milliseconds: 100), () { + didChangeMetrics(); + }); + Future.delayed(const Duration(milliseconds: 200), () { + didChangeMetrics(); + }); + Future.delayed(const Duration(milliseconds: 500), () { + didChangeMetrics(); + }); + }); + } + + @override + void dispose() { + WidgetsBinding.instance.removeObserver(this); + super.dispose(); + } + + @override + Widget build(BuildContext context) => buildWide( + context, + MediaQuery.of(context), + AppLocalizations.of(context)!, + ); +} diff --git a/example/lib/widgets/base/app_stateful_widget.dart b/example/lib/widgets/base/app_stateful_widget.dart new file mode 100644 index 0000000..cd58702 --- /dev/null +++ b/example/lib/widgets/base/app_stateful_widget.dart @@ -0,0 +1,5 @@ +import 'package:flutter/material.dart'; + +abstract class AppStatefulWidget extends StatefulWidget { + const AppStatefulWidget({super.key}); +} diff --git a/example/lib/widgets/base/app_stateless_widget.dart b/example/lib/widgets/base/app_stateless_widget.dart new file mode 100644 index 0000000..66f5e64 --- /dev/null +++ b/example/lib/widgets/base/app_stateless_widget.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; + +abstract class AppStatelessWidget extends StatelessWidget { + const AppStatelessWidget({super.key}); + + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ); + + void onPostFrameCallback() {} + + @override + Widget build(BuildContext context) => buildWide( + context, + MediaQuery.of(context), + AppLocalizations.of(context)!, + ); +} diff --git a/example/lib/widgets/base/export.dart b/example/lib/widgets/base/export.dart new file mode 100644 index 0000000..bcf7e29 --- /dev/null +++ b/example/lib/widgets/base/export.dart @@ -0,0 +1,5 @@ +library base; + +export 'package:flutter_example_packages/widgets/base/app_state.dart'; +export 'package:flutter_example_packages/widgets/base/app_stateful_widget.dart'; +export 'package:flutter_example_packages/widgets/base/app_stateless_widget.dart'; diff --git a/example/lib/widgets/layouts/block_layout.dart b/example/lib/widgets/layouts/block_layout.dart index 6d8c137..1b459bf 100644 --- a/example/lib/widgets/layouts/block_layout.dart +++ b/example/lib/widgets/layouts/block_layout.dart @@ -1,9 +1,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_example_packages/base/di/app_di.dart'; import 'package:flutter_example_packages/theme/colors.dart'; +import 'package:flutter_example_packages/widgets/base/export.dart'; +import 'package:flutter_example_packages/widgets/texts/export.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:scoped_model/scoped_model.dart'; -class BlockLayout extends StatelessWidget { +class BlockLayout extends AppStatelessWidget { const BlockLayout({ super.key, this.title, @@ -14,21 +17,39 @@ class BlockLayout extends StatelessWidget { final Widget Function(BuildContext context, Widget? child, T model) builder; @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return ScopedModel( model: getIt(), child: ScopedModelDescendant(builder: (context, child, model) { return Scaffold( - appBar: title == null ? null : AppBar( - backgroundColor: AppColors.primaryDark, - title: Text( - title!, - textAlign: TextAlign.left, - style: theme.textTheme.titleSmall?.copyWith(color: Colors.white), - ), - ), + appBar: title == null + ? null + : AppBar( + leading: Padding( + padding: const EdgeInsets.all(8.0), + child: ClipOval( + child: Material( + color: Colors.blueGrey, + child: IconButton( + icon: const Icon(Icons.arrow_back), + tooltip: 'Back', + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ), + ), + ), + backgroundColor: AppColors.primary, + title: TextTitleSmall( + title!, + color: Colors.white, + ), + ), body: Padding( padding: EdgeInsets.all(title == null ? 0 : 20), child: builder.call(context, child, model), diff --git a/example/lib/widgets/texts/export.dart b/example/lib/widgets/texts/export.dart new file mode 100644 index 0000000..9c6ea5a --- /dev/null +++ b/example/lib/widgets/texts/export.dart @@ -0,0 +1,11 @@ +library texts; + +export 'package:flutter_example_packages/widgets/texts/text_body_large.dart'; +export 'package:flutter_example_packages/widgets/texts/text_body_medium.dart'; +export 'package:flutter_example_packages/widgets/texts/text_body_small.dart'; +export 'package:flutter_example_packages/widgets/texts/text_headline_large.dart'; +export 'package:flutter_example_packages/widgets/texts/text_headline_medium.dart'; +export 'package:flutter_example_packages/widgets/texts/text_headline_small.dart'; +export 'package:flutter_example_packages/widgets/texts/text_title_large.dart'; +export 'package:flutter_example_packages/widgets/texts/text_title_medium.dart'; +export 'package:flutter_example_packages/widgets/texts/text_title_small.dart'; \ No newline at end of file diff --git a/example/lib/widgets/texts/text_base.dart b/example/lib/widgets/texts/text_base.dart new file mode 100644 index 0000000..76caf65 --- /dev/null +++ b/example/lib/widgets/texts/text_base.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +class TextBase extends StatelessWidget { + const TextBase( + this.data, { + super.key, + this.color, + this.textAlign, + }); + + final String data; + final Color? color; + final TextAlign? textAlign; + + TextStyle? getStyle(BuildContext context) { + return Theme.of(context).textTheme.bodyMedium; + } + + @override + Widget build(BuildContext context) { + return Text( + data, + style: getStyle(context)?.copyWith(color: color ?? Colors.black), + textAlign: textAlign, + ); + } +} diff --git a/example/lib/widgets/texts/text_body_large.dart b/example/lib/widgets/texts/text_body_large.dart new file mode 100644 index 0000000..33f2abb --- /dev/null +++ b/example/lib/widgets/texts/text_body_large.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/widgets/texts/text_base.dart'; + +class TextBodyLarge extends TextBase { + const TextBodyLarge(super.data, { + super.key, + super.color, + super.textAlign, + }); + + @override + TextStyle? getStyle(BuildContext context) { + return Theme.of(context).textTheme.bodyLarge; + } +} \ No newline at end of file diff --git a/example/lib/widgets/texts/text_body_medium.dart b/example/lib/widgets/texts/text_body_medium.dart new file mode 100644 index 0000000..bffef81 --- /dev/null +++ b/example/lib/widgets/texts/text_body_medium.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/widgets/texts/text_base.dart'; + +class TextBodyMedium extends TextBase { + const TextBodyMedium(super.data, { + super.key, + super.color, + super.textAlign, + }); + + @override + TextStyle? getStyle(BuildContext context) { + return Theme.of(context).textTheme.bodyMedium; + } +} \ No newline at end of file diff --git a/example/lib/widgets/texts/text_body_small.dart b/example/lib/widgets/texts/text_body_small.dart new file mode 100644 index 0000000..c6db243 --- /dev/null +++ b/example/lib/widgets/texts/text_body_small.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/widgets/texts/text_base.dart'; + +class TextBodySmall extends TextBase { + const TextBodySmall(super.data, { + super.key, + super.color, + super.textAlign, + }); + + @override + TextStyle? getStyle(BuildContext context) { + return Theme.of(context).textTheme.bodySmall; + } +} \ No newline at end of file diff --git a/example/lib/widgets/texts/text_headline_large.dart b/example/lib/widgets/texts/text_headline_large.dart new file mode 100644 index 0000000..f8b4935 --- /dev/null +++ b/example/lib/widgets/texts/text_headline_large.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/widgets/texts/text_base.dart'; + +class TextHeadlineLarge extends TextBase { + const TextHeadlineLarge(super.data, { + super.key, + super.color, + super.textAlign, + }); + + @override + TextStyle? getStyle(BuildContext context) { + return Theme.of(context).textTheme.headlineLarge; + } +} \ No newline at end of file diff --git a/example/lib/widgets/texts/text_headline_medium.dart b/example/lib/widgets/texts/text_headline_medium.dart new file mode 100644 index 0000000..25aa2d8 --- /dev/null +++ b/example/lib/widgets/texts/text_headline_medium.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/widgets/texts/text_base.dart'; + +class TextHeadlineMedium extends TextBase { + const TextHeadlineMedium(super.data, { + super.key, + super.color, + super.textAlign, + }); + + @override + TextStyle? getStyle(BuildContext context) { + return Theme.of(context).textTheme.headlineMedium; + } +} \ No newline at end of file diff --git a/example/lib/widgets/texts/text_headline_small.dart b/example/lib/widgets/texts/text_headline_small.dart new file mode 100644 index 0000000..bc5a8bd --- /dev/null +++ b/example/lib/widgets/texts/text_headline_small.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/widgets/texts/text_base.dart'; + +class TextHeadlineSmall extends TextBase { + const TextHeadlineSmall(super.data, { + super.key, + super.color, + super.textAlign, + }); + + @override + TextStyle? getStyle(BuildContext context) { + return Theme.of(context).textTheme.headlineSmall; + } +} \ No newline at end of file diff --git a/example/lib/widgets/texts/text_title_large.dart b/example/lib/widgets/texts/text_title_large.dart new file mode 100644 index 0000000..c719464 --- /dev/null +++ b/example/lib/widgets/texts/text_title_large.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/widgets/texts/text_base.dart'; + +class TextTitleLarge extends TextBase { + const TextTitleLarge(super.data, { + super.key, + super.color, + super.textAlign, + }); + + @override + TextStyle? getStyle(BuildContext context) { + return Theme.of(context).textTheme.titleLarge; + } +} \ No newline at end of file diff --git a/example/lib/widgets/texts/text_title_medium.dart b/example/lib/widgets/texts/text_title_medium.dart new file mode 100644 index 0000000..3ad7f5b --- /dev/null +++ b/example/lib/widgets/texts/text_title_medium.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/widgets/texts/text_base.dart'; + +class TextTitleMedium extends TextBase { + const TextTitleMedium(super.data, { + super.key, + super.color, + super.textAlign, + }); + + @override + TextStyle? getStyle(BuildContext context) { + return Theme.of(context).textTheme.titleMedium; + } +} \ No newline at end of file diff --git a/example/lib/widgets/texts/text_title_small.dart b/example/lib/widgets/texts/text_title_small.dart new file mode 100644 index 0000000..19316fb --- /dev/null +++ b/example/lib/widgets/texts/text_title_small.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/widgets/texts/text_base.dart'; + +class TextTitleSmall extends TextBase { + const TextTitleSmall(super.data, { + super.key, + super.color, + super.textAlign, + }); + + @override + TextStyle? getStyle(BuildContext context) { + return Theme.of(context).textTheme.titleSmall; + } +} \ No newline at end of file diff --git a/example/pubspec.lock b/example/pubspec.lock index 6a679dc..c4b46e8 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -106,13 +106,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.2" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.5" clock: dependency: transitive description: @@ -170,19 +163,12 @@ packages: source: hosted version: "1.3.1" ffi: - dependency: "direct main" + dependency: transitive description: name: ffi url: "https://pub.dartlang.org" source: hosted version: "2.0.2" - ffigen: - dependency: "direct dev" - description: - name: ffigen - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.7" file: dependency: transitive description: @@ -297,19 +283,12 @@ packages: source: hosted version: "0.6.5" json_annotation: - dependency: "direct main" + dependency: transitive description: name: json_annotation url: "https://pub.dartlang.org" source: hosted version: "4.8.0" - json_serializable: - dependency: "direct dev" - description: - name: json_serializable - url: "https://pub.dartlang.org" - source: hosted - version: "6.6.1" lints: dependency: transitive description: @@ -450,13 +429,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.3" - quiver: - dependency: transitive - description: - name: quiver - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.1" scoped_model: dependency: "direct main" description: @@ -483,20 +455,6 @@ packages: description: flutter source: sdk version: "0.0.99" - source_gen: - dependency: transitive - description: - name: source_gen - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.2" - source_helper: - dependency: transitive - description: - name: source_helper - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.3" source_span: dependency: transitive description: @@ -609,13 +567,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.1.1" - yaml_edit: - dependency: transitive - description: - name: yaml_edit - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" sdks: dart: ">=2.18.6 <3.0.0" flutter: ">=3.3.0" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 88ab1f1..a71b4d2 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -13,12 +13,10 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter - cupertino_icons: ^1.0.2 - google_fonts: ^4.0.3 + cupertino_icons: ^1.0.5 + google_fonts: ^4.0.4 scoped_model: ^2.0.0 get_it: ^7.2.0 - json_annotation: ^4.8.0 - ffi: ^2.0.2 intl: ^0.17.0 universal_io: ^2.2.0 @@ -28,8 +26,6 @@ dev_dependencies: flutter flutter_lints: ^2.0.0 build_runner: ^2.3.3 - json_serializable: ^6.6.1 - ffigen: ^7.2.7 flutter: generate: true