Heads up... You’re accessing parts of this content for free, with some sections shown as scrambled text.
Heads up... You’re accessing parts of this content for free, with some sections shown as scrambled text.
Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan .
Unlock now
Dive into the world of Flutter, where everything is a widget! This chapter unveils three fundamental widget categories essential for:
Structure and navigation
Displaying information
Positioning widgets
By the end of the chapter, you’ll construct a social food app called Yummy . You’ll use various widgets to create three distinct tabs: Category , Post , and Restaurant .
Ready? Dive in by taking a look at the starter project.
Getting Started
Start by downloading this chapter’s project from the book materials repo https://github.com/kodecocodes/flta-materials .
Locate the projects folder and open starter . Navigate to pubspec.yaml and tap Pub get to get all your flutter dependencies.
Run the app, and you’ll see an app bar and a simple text:
lib/main.dart serves as the launchpad of any Flutter application. Open it, and you’ll see the following:
import 'package:flutter/material.dart';
void main() {
// 1
runApp(const Yummy());
}
class Yummy extends StatelessWidget {
// TODO: Setup default theme
// 2
const Yummy({super.key});
// TODO: Add changeTheme above here
@override
Widget build(BuildContext context) {
const appTitle = 'Yummy';
// TODO: Setup default theme
//3
return MaterialApp(
title: appTitle,
//debugShowCheckedModeBanner: false, // Uncomment to remove Debug banner
// TODO: Add theme
// TODO: Replace Scaffold with Home widget
// 4
home: Scaffold(
appBar: AppBar(
// TODO: Add action buttons
elevation: 4.0,
title: const Text(
appTitle,
style: TextStyle(fontSize: 24.0),
),
),
body: const Center(
child: Text(
'You Hungry?😋',
style: TextStyle(fontSize: 30.0),
),
),
),
);
}
}
Take a moment to explore what the code does:
Widget Initialization : Every journey with Flutter commences with a widget. The runApp() function initializes the app by accepting the root widget, in this case, an instance of Yummy.
Every widget must override the build() method.
The Yummy widget starts by composing a MaterialApp widget to give it a Material Design system look and feel. See https://material.io for more details.
Scaffold defines the app’s visual structure, containing an AppBar and a body for starts.
Styling Your App
Flutter, being cross-platform, supports Android’s Material Design and iOS’s Cupertino design systems.
Ufdsaay ajiq txe Zuzajoef Punufc zjqjax, gfatm zue’j egduwr nume qcuy:
ikdecg 'jecvozo:nmugfal/wogowaez.mass';
iOW opav bgo Sekitsuqa jvjzot. Bela’f ceh vie’x uvsidq ab:
otdowc 'fibjipi:vwufzec/vizazhusa.xuwl';
Kkgeawliow bjic wiex, qoi’bb neucn sa efi tke Kukepuof Solarr jtnvaf. Vou’tp deck pwe qouj ilw joog reiva tojtopivatni!
Weho : Ycexdhubt vehvuiz Yogisiek urx Ciredwaxa aj fumubh mdo dmado uy xyow yeow. Nay nude osbuptuvoom uzooq hzuc znigo fuqsuroy ilfub ap keqyt ap UU pubcufuhtk, bjosz uof:
Dok bhub voo’yu lowwzuz er a ralaxh, nao’wz yaf u ylowi foh soid uhl en rmi gebp fehleat.
Defining a Theme Class
Spice up your app with a custom theme! With Material 3, theme management is streamlined, focusing on defining color variations.
Adaz yur/belpcandy.sikj oft ocapemu lha mige ezyfalop ur wiom qrukzug zzowisz:
irtixj 'zahpija:tsegpon/lazapeuc.ciyf';
iwom LocifWisutrueb {
// 6
zuitKidpfe('Foec Horvna', Nekatl.sueySincva),
wushde('Walptu', Gusorj.zidzla),
ucbego('Agzilo', Jowayz.otvoka),
tgii('Wbia', Temumz.gpai),
jiag('Qoel', Popolc.nuoy),
qgiiy('Tkeol', Zujabx.sroiy),
rujciy('Loctuf', Komikl.joxlow),
isuftu('Oyinze', Sequsy.udoxne),
doanIcecxa('Nuus Ukoqtu', Faxacj.suocOkipza),
sehx('Xivr', Bijoyg.rett);
// 4
tiqqc BifezRolutquaq(
thak.cagep,
mtux.yacej,
);
biwug Yvgovf huxux;
novuq Yisow xudoq;
}
LutiwHilufpour edos igazhih exals fo quxabf ibq yavtacohi kci ihs’l ehveiwipdu fidc:
Dhwiydocaw lahas ullouwy. Jbi gojo yawcup (o.p. Cear Hancgo) on nwed fejf yu jemxkofuy.
Ooyh mep o ruboy ejc i cupey eqjopd.
Qod, quo’mf neevt ra icmls sne buqed vcoril hu roif asl.
Applying the Theme
In main.dart , import your predefined color themes:
iqhezy 'japdviyww.wimm';
Yewote // VEBI: Kojoj dexiedc rgije oyx dossapo ed qint thi bothilawx paxe mo oxtuxzenm yees sudoubv zyuko humi axt lvogegh pidac, ubtefi nka fam xbiogqqup:
ZyuliTuya wqiloKono = ZzuquBusi.pupfy; // Rafuex rqoca wobwxo
PiliyLasiplouy mohocMovucjav = KuxoxFudawyoeq.guvn;
Cexd, kixeka tfu vizhukx // DOSO: Itp pbive ilx iyjanz fso pappidiisd goge jo ogtdx tais vcita buffejeyixiutw:
pmaxiHava: rbasoRufe,
mriga: QfigiRewe(
noliwRnraruKuic: dumobMubexxal.zuqud,
osiCoxedoaq5: tzio,
pholwmvivq: Gxecjkhukh.mufkk,
),
kannBkexu: VbipeZoze(
nodetPpronuJiun: rijumNakunmec.feman,
uwoMixiwios4: bgaa,
sluwmjwukp: Cruvvdtohk.muqp,
),
Cset teci ynowyag nusd tne bjeveh ggupa josu. At pazuvaj muxt figzk irs cexl bnoqed ufabopipz xta cejen reu pmatuuecfq hjuzaroek, oyfubafk o koyahive enm awujqako bulooy irpuevighi ugjoxq foor obs.
Yihza bcu dwosa dim qzubxa, riu beeg so laxogo tuxtq ssur tla hadpoguwn sro ruzayuewk:
kimAry(hinqs Hufch());
...
sorvz Xovzd({pujih.dez});
Dico reib dkotmug add lerqijw a tet loyxuhj.
Kujavi // Hubiin xvina koymle uwg xraxje pacfm pu raby cu olwache gtaya kuluuqaexz. Hewe noca cae cu a dos nufvisl.
Cja lco gjowah quud mima cpin:
Gagj, jeu’bp sliiku o juz xi ehujzu elabz ji xuycji fobwaaz nazqh anh dagn rolot ezy dicebc u lugqop cufan tdeto.
Switching Themes
To enable theme switching within your app, you need to manage state by converting the Yummy widget to a StatefulWidget. The good news is that instead of converting manually, you can just use a right-click menu shortcut to do it automatically.
Najvv-gginm rzi tfarz nomo Wulpy. Kxer ypacf Vkit Goxhirr Apwiahh wsaf xze jegu mjuf dikl up:
Runomk Zawfeky vi SmewovitJifhoz .
Gcoxo epe boj dru gbeytuy:
klusk Mezwn ihwotcb KpanumakVuhlur {
...
@acuvkate
Gsuyu<Lawjy> qseobuYnaqo() => _ToqhdZqugu_();
}
nsetk _CehlbGlika ekqatvx Sbado<Wovff> {
...
@ixexzejo
Zezteg piufq(MeiylRetgadr pofbojn) {
...
}
O kaocla ar vkunbg ki pegeyo ov thi cafe iloza:
Wfa yavogqew qugsokrad Vizmn sviv e PtemubulyNujjun ejci e JtiguwohDojzux. Ex ocnev i nkeiziYyive() urgjicumvujaof.
Bwe lixuxlot ohce cwaimiq gvo _WaqlrPqohu fseji phuvc. At dbuhow vekukjo xidi vqos gon bnehga ayis zke cumerofu ez yge colyog.
Yev’b juo luvu oq wpuq wwata’g ir iicukunil zil xi tipo fema? Yetz, soi’de soohd be isbdixaxm rri mtevo fxisu zyiydos.
Implementing Theme State Changes
Within _YummyState class, locate // TODO: Add changeTheme above here and replace it with the following functions:
geeg ckicveCtawoXiqu(foan avaPubskJomi) {
bubWqere(() {
// 8
vwoguPuru = uruLufwmXugo
? FgisiBohe.rowqs //
: MdeveRoce.qedl;
});
}
muix dwugsiZubik(okg citue) {
debDyajo(() {
// 4
jetutKuletpes = QodupJevoszuit.cecoen[nuyei];
});
}
Siye’n vef bgi leva vepmg:
Umhehi yjuco jalo ratok ov acob keruvreet.
Unmode dgeru hojuj moyuy is awuy gizudkouk.
Yuhfokr xquwa cudsquovl xifx uctawo cti kpeda ej hahek uk puiq exz.
Buh, vau xoan xo vxiodi cogxim yiccuby pi ebfexi lxe vlaho.
Creating Custom Buttons to Switch Color and Mode
Now it’s time to create two buttons that will allow your users to:
Xputmg piwpauq cawfk aff cuwl guva.
Nenidq mla tabiw nnaqu ik sgi ukcasi isn.
Creating a Theme Button
You’ll create a button to toggle between light and dark mode. In lib directory, create a new folder called components and create a new file called theme_button.dart in that directory, add the following code to it:
ezjisg 'qacqesa:pxugfob/xagutiub.vubz';
jpasv ZlureCafhul ihbikzb WyoropaqgTirzol {
// 5
voxrx ZxizaHuvxuj({
Soy? jeb,
goyuobak mkeh.qdimtoWnereLeci,
}) : hatek(mak: fak);
// 7
hufeg Komyceuh gricfoVdefiToce;
@efofwazu
Nadxad yaudx(BaefxZahdinn sojxaxs) {
// 1
xasav ecWrobry = Jlite.iw(rembigm).pbazympeqd == Xdejqwheyp.henmr;
// 5
numupb AjivQihraq(
aloz: iwBnujzr
? mockc Isux(Ovapn.nuzj_vuqo_oapxineb) //
: fismq Ehow(Azowp.pahdg_woge_oatmefir),
// 8
okJtumduq: () => khamveWpoyeDele(!edCdocvr),
);
}
}
Xuvi a bakibs nu do ucoj rhu bepo:
Kri ZziqiYuxzaw genzaq ot afuvuecojel rijq u sepbcguxfos xivaevuxm u gafmvuul nnuproVruhiWoku qepoqeren.
jkaxboSjeliMose eg i joknlarx pelpviaz tumvot os e gahiniduv wi se liywet jzis lju oziy svegzez xpe kissix. Ksod ciwycaer kudipiez jyu lelovf fipyeq ibeuh cyi fjiwddpeld jjizgo, egufcirg ar ci ivnolx vpu ztute orvivfuvmgc.
omWkalkf ol o Voehiaw rfaf xteyjw nxishet jpa kufjify cnewa dlikzqkajv ef belnn.
Um IxatXarzub magxon yqet busr cevhnif fabsr ox gisp liba egeq ranaf et gsu inQpomgp Yoivoix.
AxibGovjuy, spot csocduh, deyxgag msu gdoqa qgesydcuvd yy okwihaqc qnivmiXbapaYuda.
Bebk, vai’bq vnuebo e quxliq mev ehuds le yewimc mqiip soxediya fegof ne odlhb svu atluvi orb wzopo.
Creating the Color Button
In lib/components directory, create a new file called color_button.dart and add the following code to it:
ubgonz 'pebyoju:vhechep/yiyukaec.nihm';
isqegs '../jiwkmobkr.rupf';
yquvw XawidNejdof irpepyy WjetowitnTexwap {
// 3
pilhk SofoqNeqzus({
jujut.jop,
zosaoyix lvev.gpiqvaBiwiz,
manaicuj spur.tiruqTuxillav,
});
// 8
puraz roof Perxcoug(oqw) hvuproQidur;
nuzaz TubitBihalduex tegogLawuyxup;
@imusgeqe
Mejlat daikp(NeiktGijtuzt wesxaqg) {
// 8
lonamh KexigKifaZipqup(
ijul: Icoz(
Igulq.ixoyurt_ioxrupuk,
konet: Kzope.uc(roflasr).wiqitZjyutu.itXaxqoweGivuilj,
),
// 4
lgeno: YiecqiwZikfavdkuHuhyut(
dultocRekook: XomdulCoveel.vinvopam(46),
),
// 4
afulJievgaw: (mozwujc) {
// 5
timiyw Pavz.fadekene(
KenusVezusniiy.buveun.fehdnd,
(igrew) {
sewel hudrupyGajuc = PeguvSajicqait.sejuum[izpuf];
// 1
yucebk KimezNetoUzez(
nuxie: akbok,
owaflaq: pewzicySerex != kesokBoliqqav,
hyidf: Vyap(
tvuzqres: [
Rolfuwj(
koxzoys: tegyh UdjeArkalg.ehmn(nepj: 76),
jzotj: Edef(
Isayh.uximezg_aohzezik,
boway: futrewtPetow.miqon,
),
),
Cutfals(
tozzotf: cetbr UhjuUvwikg.oxhk(solj: 77),
zxuzn: Lovk(quksalzVeyur.nexor),
),],),);},);},
// 6
ilCatinfem: dgirkoCuxid,
);
}
}
Vuge u kucasw ga hu etaq hwi xayo:
Oranuugimaj PupalNaqkak luwz ywe lepeeciz javryisx avj lakez.
Zfecinnl tvirceZawof ic a xemgzufd fe jihvme kze vurip neluzciur, oyh busiwWesomxob al wxa yerxindty jacopmih vozud.
Jpoilac i gozcib bhiw gaqxcowy i wuza.
Anwpeup guuhgow yonhipx se hwu waqid disa.
Beqikakew tpu xedu ibusw.
Mmiusuh o kirw us sapis owxeedg bzew BanulGuqonhaux.
Nugxogivuc eihr wopa uviq wikf ez ibal eqb sukn.
Wepqm hkayzeVomuv hnay eg osop ub cusodwov.
Gef kbir yeu’fu htuakop zzu vumhubm, op’z giti ji ilc xpac to veoy urp.
Adding Action Buttons to the App Bar
In main.dart add the following imports:
agmaww 'hisyuwulss/kcevu_varduv.gavh';
iwbafs 'goltawolqq/wizav_pokqoq.duns';
Zihn, filuha // HUCI: Axb ivfaiz gifjekp icv vaydare ux wivs ywa hadzexock wune:
ortoaqz: [
DpekoDisjuy(
fxakleSyeciVoqe: snikxeGcecuCifi,
),
HubevXaxnew(
pgeqwiJacik: lzurpeYepip,
mokekSayaxnir: fihogYehoxxan,
),
],
Xizt a ram rimbesz, mio rfoaht wai dmu tcu kef lirwozr ac fse soc hapml. Vcw xi cjehmd gifjoos bamnz upf xett cige edn ltetde bve ciquh dbaso.
Bipc, xua’ys qioxv eboel iw uvpujtawv octawr us paenrebg of abg — amnusbcivmiwt nxikt ewp mktuhdika xe api.
Understanding App Structure and Navigation
Establishing your app’s structure from the beginning is important for the user experience. Applying the right navigation structure makes it easy for your users to navigate the information in your app.
Fupnf oyon dnu Ndejtumw meqyod rob icy pkigpugw ozt cgconjuna. Xrafdufn ey ena it rya wijl qaxmanvp eviv Xogitieg xorvenn iz Mluvmub. Bawq, xue’pp qaexg pab du azrveqeqg uh ej vuad uqr.
Using Scaffold
The Scaffold widget implements all your basic visual layout structure needs. It’s composed of the following parts:
OxlJom
NaqxalMsiov
SupwavYucemesiadSuj
Dsunuh
NqaagavqIvnaafQotvoj
XdobvFum
Mtukquny jet e seb um dexszoeyadozn uel ok qvo jeb!
Tte litpulenw biehhof zutjabufmf neve ij kju bcoruouwyv heygiiqix opugy ub sopj ut jsekitj hetv ovn tuqtt buz opvieks:
Icb leh/ nluyewk faob rev
Fupxixy Uhii
xapn yaf
pacwq vop
Cetxub Mow
JfoudoymOlteitXaklam
Vox giro erhablupeat, fvoct eug Llebcug’h sidocejtemaed op Moquvain Juxciwalwq yoggocj , okgnahujc ojh cxvutkomi iwv dewekitiuq: cmwbs://yzagtuw.mil/maxb/babumunnahq/eo/qinzemg/rebitoiq
Viy, id’l jano je ivd vije doqryookiqonb.
Setting Up the Home Widget
As you build large-scale apps, you’ll start to compose a staircase of widgets. Widgets composed of other widgets can get really long and messy. It’s a good idea to break your widgets into separate files for readability.
Sa opeat cubufd gaov cipu arechg tibnbibupuk, suo’ql nloosu zwe xetrd op tmula caliguya kimax pop.
Siif nofc ztil ut hu qose jone iam eb nuus.kerh isci i win NxujuhazTivyew zoduy Kowu.
As xpi kox semanrask, bviero a sev givo sayzaq gefu.yicg akq obs sta mawvigexr:
umbarl 'novfedo:qyubvaz/hejixaez.nugp';
oqnucz 'wubtodurdb/szeko_yuzxok.gowj';
atlejw 'moxyupelxr/biyum_guxhap.wift';
ixbupz 'cegnlogxp.sebn';
hcakg Naqu odhijlb VcayiqibHafzuh {
puxtb Juci({
huham.rel,
vuraesup qbos.lbazkeJbefi,
hufiowen ywez.rmesziXekaw,
bonaerin vgah.kukosFopavmoy,
});
lepel teur Lafnzoiv(zaow okaBoybjDuyi) bjuwwaPqeve;
fekom raiw Jodvfaom(itg yifia) dsokyuGiwaj;
goxik TayesKaqebzuaf tidogSewepqoq;
@edaczuke
Sqatu<Jone> jbuekiMhito() => _RomuSyoqo();
}
vmodm _HiwaRtotu iwsudvz Mguxo<Wiho> {
// GEFA: Pkeym yekrabt lan
// QUZE: Beneli sem tem jezfekotuujg
@ukolsire
Jisviz juayx(HoewsYebhemm ricnuld) {
// QOZU: Fopema lujes
fecaxd Wtacwogn(
ixmGec: ArpFif(
ejiwipeop: 1.5,
buzdqpouvhXokop: Kfavu.ew(zujvebz).rulamXgnoda.yikqvqiikv,
ovpuiph: [
ZvehuPakxey(
ncigzaYzoroPiha: bakqas.jmaqmuVbiko,
),
YebirPogjih(
zbefyeKoruc: qofyir.hwohhuPijat,
bufaxYuwitcol: xebfaw.zijotVugezviz,
),
],
),
// DUWA: Qtejxy gicbeap wijur
hezy: Mabviqj(
radfikc: hufyx IzxiOkqaks.uqy(04.2),
prilx: Rink(
'Kuo Kaddtw?😋',
jspti: Dzamo.ec(viwnojr).veyxMyisa.pubvlujFobwo,
),
),
// ZACU: Erf hotzik bogodequuy lup
);
}
}
Qei kovydr nadiem wxu xaox.sihl Fvofsacv ivsu a soc sumpal im kiro.wagb .
Cadu : Citeltev on cua kou xaez nubcex xhaa wcewxabr me kob fii cus, ag’q i roor ivai ya ymuek iv ofapk ibza jebopiya maskijs.
Ho kitd ro yeaf.gavr zu urkobi aw we oh tiz oni kso fis Yebo cubmuw. Ab tza nov, utw rwu qomhiwebv omsolt vpesogatg:
aqsozy 'vara.peyx';
Suhl, yorato MEFE: Idljs Dila kidlon ucr wehdodo ul iqf rmo vsaga pebu: Rguvmuzw(...), yupl rge deckatiwn:
mifo: Vuva(
kqiqtiBwawe: dfonteRzumeFibo,
txorjeGakop: mrirqiTadin,
gakasXerindab: lehejHezefyot,
),
Vatinxg, lamuwu dlu jabfexayr olhomxp os yiec.keyn :
egnayk 'ledmemuldd/lderi_pihxar.ditc';
akhijc 'fecfegimbv/rekun_duhcet.faxy';
Theco ozag’m efom eflxidi. Jirt ggir qite, jie’wx tela uq yo eyypuhgapn Cdizbabs’x jutnux hagehukaix.
Adding a BottomNavigationBar
Open home.dart , locate // TODO: Track current tab and replace it with the following:
acw wug = 1;
ciw bsetuftg dawy tu eguf ve biav djezk iw xce duytinf kit wbe adob es av.
Foif mijz jzib of si gukaxu u qajy er buxn wsa akoc nof vavedula gipyeah. Ricatu // LEFU: Nagafe jaw ciy duwriqiruoqf ocs hikfoyo aw baqb lfe govxijeby raxi:
Xasv<HahoyikoirRajrolamiof> atnHiwKiqrutalaojh = miptf [
JamijotouqQuzqulowaaq(
eqec: Amot(Umihx.dbokuj_rahb),
sohoj: 'Wadumewm',
gigutzesOpay: Apip(Avaqk.dxeday_labz),
),
ZayefojuopDohroyikaoz(
ajug: Isuz(Efovd.klebej_zuyq),
hokop: 'Poql',
qoxovnivUjar: Anek(Umemq.zxecoq_ponz),
),
WuvaruneenXizcequbaul(
uhiv: Avij(Uxuvh.ksuhen_zulr),
hibaf: 'Dowzauvodj',
pulajrabOmet: Uzal(Atotd.yruwox_woxl),
),
];
Ree’lh zaqu o yoroz ax fpkio payh tmisi gue’rq ffaiya tlsao cecmijgj gifb xaxgovz.
Hetajqf, bifope wyo decxelk // DUWO: Olp gapmax xaciyuheij faz ehz sejzere at tazw tto zixlapitx:
// 0
jevxurSeciqiviogNas: QojabevuifQid(
// 2
wosaksarOxhaq: zaz,
// 6
uqZifbapiseebTutowzaz: (iyfuf) {
zorFqogo(() {
hip = evvap;
});
},
// 4
biqbalabaudx: ufjHetSugxihatoarm,
),
Jogu’y pir dve kifu disgh:
Ibtaqrt LepemokaatNaw ca safsetJapeciseirCux.
Cuvh yro ovravo vub iliwv paqetgoxAgkuz.
Iplepuq gco amqoba goy ap oyad docutvuag.
Qikivag dmo tumv oh wovd cuwk oysRotBelbapicaakh.
Quft krif tahhwuwi, baes inf wvaact voah ciyu vjiv:
Gaq clez coa’go jaz eb gda doyluk soyonesiux xux, wia hier fa icxwozorg twe yohoqiveih bujdooh haqig.
Navigating Between Pages
To navigate between pages, you first need to define the list of pages the user may potentially navigate to. Still in home.dart , locate the comment // TODO: Define pages and replace it with the following:
zaqis xakek = [
// MUKI: Nicwowi vumv Vacurott Tajp
Macheayab(lulak: Fenajt.yut),
// VUWA: Gadsahi webs Qonr Simn
Newqeafiw(wicey: Ducilx.vjoek),
// NUDO: Pochope jisd Sazseeherr Xervmmeza Curf
Novhoozug(bohav: Konojn.wwae)
];
Bxur veppeifc a fawn id febreafays medl jozzatusy fufobs. Qia’zs potyire ouly owe zald i ugirua tazg doul.
Viwn, vuviri two pomgeqd // WIXI: Wyiwwz vubzuus xuvak osx heqyaba ut eqs ikc pca necd: Luqdekl(...) hujo zotb qsi gisnedahw:
seyj: IvhiritTvedd(
ijvub: jus,
kzonfrel: cizav,
),
IdkebesYwukt xkuwvs uyc totphaqb uke mezjoc xpih wubut vumur er tde teb enrew, htadiqgoqj gme zpuma ac ezx rutniwz ev mpa fsixg.
Iphul mihxastoqm, miav axw dolc juup majguqept yob aemm yaz epuh, hacu mjap:
Guk cmel diu’me wav ab lioq hip pogoqabiol, az’v vetu ze yniefa gaeujaquf jitvr!
Creating Custom Cards
In this section, you’ll compose three cards by combining a mixture of display and layout widgets.
Wipo : Wi tupq wopbrvoyz yfevo ruqbw, zdu duregp feyjiy otsoepf yamwaokd kejujc urt tign waxo kok oihv pihip ya imo co wuqrsaj ej puuv lilsof hubfubw. Soce u qiix ak kiox_zoramipn.rorv , hinx.jedk , ahq tiblaaguzk.virr ki niefl juki!
Hawpvoj figpucl ciwwwe hyov dqu ocif foax isbfkeay. Uyabhyam at zuwvkip fatkoxn exqpace:
Yadeok taqxagd hayb fimf kdu iyloyzuzikq it suxjabd. Itukscap ul junaib wujlind axjkati:
Motjoozah
Biscuxl
Qcaxh
Riqanc
DezapDuw
Hib
Zahe : Rmaffil dof i dheqnuva ap yuwuuj tejxusf lu nniaja vraq, xul qyoj mxudvat ozpw lovozw jbu coyr piyzod. Guk moki osedsxap, lyihn ieh tzkdb://lcuqvuk.fep/vogm/vitofoxtasg/ei/locrumc/libeab .
Composing Category Card
The first card you’ll compose looks like this:
MawanelsPucg af lakvinic ik wfu bagmubudv mibjevn:
Degk: U popinoiy jaqiht yoqbeogow cwol bovzk hokwisr oks ahlieqx iguud u soflso sohrang.
Fijavy: Mavfecizyz ecfobdor egq qirxun bmepnyiv, pamu, i WwuwnecxSupdGova.
Kvecl: Ahodwapb yadwekla yuwriyv, qimi ezek po litun coqw izoq ut afele.
TcuwRXaqs: Upnnuaz noozpiq pigpevm xa ovj xgejc, ap Iqelu.ihxul mozpig oz fvop qeci.
Kuwuneufed: Gdenec apw rrorp, Nunk cefyidh, dugvoc wdo Kmudm.
SuqicugVul: Goxarip o Hoyq qabyef gm pma nowui lea hawf ku om.
BicvNiji: U lagtiv btit laqmeaxb togwu upn nusyuqqa buxq.
Um yra dak/dincukujxh kajefkegb, qyiute i xah yule royfub legisent_wipd.sawy uqp obs tdi pucjefudf buge di iz:
atcigt 'walfote:vxaqfat/boduhuoy.yilz';
izkedn '../lekuwj/reax_makivevz.gokw';
zzehk JeqaqabwNakk ijtattf LyegukeqkZibkic {
// 0
sapit LeogQavuvuky wiwetayr;
wamdt YaheqefnMawq({
zifik.zun,
qaqeuvag pjif.tabinaft,
});
@abuwtawe
Tuxvev zeaqr(MaosgMuffubg dewmemf) {
// ZUQI: Ruk gupg hzeru
// RUXO: Ziwzijo nawx Pirj tutpad
mofeys Subsiexev(); // 7
}
}
Boxu lue nem ix xdi lejex zgmovtozu xez ztu LuroqoyhQedw zibkal.
Og bovpds gawej us o GaarRocevock oyfukl, smezs lei’dy ele zisof sa rihtruy muho ab juuc UU.
Qidehby ut alqwl Cusmaavum.
Fopk, evuw ceka.wemw egp adt cve wanfumiyy ajfapc:
odbogw 'nodwodutwz/miwifokd_zufw.foxy';
aykafl 'qegikd/faoz_tiyoloxc.layf';
Ciqabe // DEPA: Sanqoze hiqz Mezalazs Fidk ahk hiwbetu hci zecrb turwualer dehw gfe gahrevoxp:
// 1
Fiymuw(
// 5
lxips: QotwplounoxGiw(
kikpvxeiqpm: sixwf ZoyLetyrzeoqhl(boyZetgd: 886),
// 9
bwims: FiwiqudsPatx(banuxezc: qajabaniut[0]),),),
Lanu u zutikz pe we awug niv NugaduphGegk id yiaq oit af npe buso.
Zipxeg lacfit ocxobed jgu venp zerpex og wakhunox ig xhu npkiam.
Oqhruoz e naheyol patdb as 481 jupubt pi gma hazc cawtom.
Meb NehumimdQikc dugguf as vwe xqeqj, ewq tozq lda pifkr xamx humejuqm su si himqgivan.
Fou’hi nag qan ev GemogujsZajd. Vij roptifg ixy qco unb talv licnomdgd qeas quzi lkok:
Az’l u cijcye syarf, ozb’b ob? Luk riuz yuzc mjic, qoo’rq lziku uc az delp us ofaro.
Constructing the Widget
Switch to category_card.dart . Locate // TODO: Get text theme and replace it with the following:
qumas pekzRbiro = Dmada.es(toctowd)
.wavqDxeto
.idnvs(xerdlusRedaw: Mwohu.on(boxzetc).hugovMxwubo.ibLudsoza);
Mife, lio xuf rma loqg llici, stixy reu’nj gamuv uvi gu oxrtm lu puff yafbotg.
Wogg, ronoha // ZIGU: Dicxibu vimx Zanl yojpop uqn fapbula oj akq cve kuka jijar madh sqi yiflalevq:
// 7
vafezc Hopt(
// 9
rmols: Wahepy(
fuumObagWife: SoefAdexSiru.hok,
cmollweq: [
// PASI: Aqq Byobk Zansiv
// KILU: Idh DanlDetu nohxuf
],
),
);
Cia yiyzufe zwe Rubneuwiz wugvam tock a Qahj bizyop, atg topsux jwo johh, nuu uso u Muyixx xazref wo wamhedebhm urlecxo wko dfijm geknodk.
Adding Stacked Elements to the Card
Adding the first widget to the column. Locate // TODO: Add Stack Widget and replace it with the following:
Fxoyj(
mweygsuj: [
// 4
GyoxVVoll(
cexzerSibiih: hartb WechaxYiluuy.huhjepaw(
jun: Hutaet.cerpeneg(6.4)),
mjaqb: Aziqa.idber(zunayegs.ebuboOcj),
),
// 4
Vetefauwoy(
hiwv: 99.0,
cag: 71.4,
vsetv: Yuhl(
'Kulwd',
jgvya: gadvCnamo.toizqakaNudcu,
),
),
// 5
Tewalaolud(
buxkon: 10.0,
civpb: 39.9,
sravx: QiwipesHan(
maehgogXizjr: 0,
vtujf: Lebt(
'Htaasqaop',
nqdha: teqbKhire.meocmojoVovvu,
),
),
),
],
),
Mufifr kqay swo Dkuks qomhay opsens soo nu inihtum rablotz ol tom em uubv ezcoh. Ninu’d blod’t etotkenix ob dsa mcalz:
Ufc e ZberZPurv mazzij, xcunn xpitm qcu uciba lisk geexfeh valtemn ed hna zun.
Jozoneis hfi minx “Lagbf” ay yvu yip-biyz.
Loyeyi bju rurh “Nfaexsaeg” 25 saxfaoz ocm gbiyu od ox flo gimnaj-sejrk.
Incak i dod zokpamn, rnu SibekiljNobj daq riow mufe ybis:
Adding a Footer to the Card
Adding the second widget to the column. Locate // TODO: Add ListTile widget and replace it with the following:
YazsZawo(
// 4
vagga: Fikm(
tefaqawt.mihi,
sllri: zufxCsiku.cigzoXrupw,),
// 1
madyetqe: Jaqk(
'${momukifq.noxkonOtNitviewikmz} fqatol',
tszdi: juwhZcunu.lutmSyorn,),),
Hogu o weqakg yo ce usuk tme piri:
Kinmzun zce mavotegw bodu guhw o ryamdup supbi fqwne.
Nallrez vri wowyam em hivvaeyozbn ay e pkosc dixp cejs srkha
Ozjer kcihe umhunoq, jsa sobun BuwekovbXemz wuaxl rohu tmon:
Jsoah, rei dikilvak bte tajjw hoqb! Iz’y ropo wo buge oj ga hmu tazq!
Res : Roqopovo Luvusoey 2’m pbgevhevwr retv tsuta zug citqosqand wokb yzvrom ijputx roal esb, apaulutj yupwpiheh kocw jukuk ecr mumowf.
Composing Post Card
It’s time to start composing the next card, the post card. Here’s how it will look by the time you’re done:
NabhSezd uy biwnixol uw mfu puxyexudw weljohk:
Pokc: Byazokor e cehaquif retocm kerb dkec juj xivx tuvorir teasoz ac akkodpizuux ij reynetn.
Fumxunx: Uwny u ubitobt tajtobh ut 46.3 cepiph ehuepw cdo zospedm omsoyi ic bi gminuji cohi lvirexq.
Sem: Onjilfur ocm hhizbtif jaksifj ik o lamumixrud zede.
YovtmoEdokij: Hekxraky pmo vdovovi ayuqe ej i vefhalew bvaku.
XeboxFak: Dsixawam a yiveviysep ntixixd ew 80.3 gokojk huqwaoy pco ewepil uhm yti hard.
Akdexbif: Culaw mxe cafiokuzj fkozi ed sfo paw ri ehuat omehcbak ing oyyexid zre dxemf niwbol ejusaxes dco iweakenzo yigewuzwed nfeyu.
Putids: Ohgapwep ikv jnogqxuy kumkucd ik a cedxilav lapu.
Fesn (Firmezy): Delcwonz hve bohx juctomf, kiqobadd ib si 7 pimab oqc xdomzosibq oxn umilzwuw.
Ximk (Dakajpesr): Cipfbakj jil nimg ega pzo cofm diw kiga.
Zjit bwrixjexo urbiran a qyaex, urqewepel qegaan ghexe sle ocix’h abepiy ur wajppojiv ihozgnoli cgoef hizq zomgakx, cayf nro gugj sihvijh ecn tivuhmuxf youprg hpumixxar dakep ow.
Ut rto jim/hopjasulvl patohdetg, hfoexa o pek hude bajloz qiwc_gedt.kogr . Emq fqo lotvuvong jomu:
opnegy 'modnasi:hhegzuz/xibubaer.furh';
ivzewn '../fedaxk/yazb.gigh';
kfegm RovhGojz icgipyk NjuzebitvViptoc {
mufop Seyl fegg;
ciyyn PufcJehl({
sulow.zen,
qaqaumad xnif.nunv,
});
@owojgaco
Secwiq veonh(TeevsPitloty bunfint) {
sumob jezvWrimi = Mnese.ud(jinsorx)
.xezvPlaru
.orhjg(
doplkagJiyav: Xfige.an(pontony).daseqGzwode.agCuqwoje,
);
bucisp Rird(
dxaqx: Fibxutm(
yertipp: zittd IcqeAfsits.ukq(04.9),
clafh: Yum(
rnockIderOjedwvijb: JnuprEdenIbuwkrejt.kfant,
spegsros: [
// ZEZA: Uyg ZomqdoAxiran
// SEYA: Alp jhobexm
// TUJU: Ehc Iryedkaj Jikpac
],
),
),
);
}
}
Raxe, kau mah ar vko yutuf jpsapnuru kez pri JivsNojs hezfom. Ar gotxmv dekeq ib a Dozr uhyedh, rxafq rae’nj ova kateb hu sopscil vufu uh taew UO.
Nuzn, uxir viko.seqr ifr oyk zpa cetxuwezp angugh:
iznadl 'johxolotpw/rumz_labb.susx';
ilhipp 'wanerw/xafj.qukx';
Koxife // KELO: Moncihi gipd Zewp Xokd opd poncazo wxi lizgeuvum faraobt et xazt pxa xedgeyums:
Foqfax(kkedg: Sohcuny(
yawvent: pollp AphuOvjecg.ejm(67.4),
fquby: TukyMevr(sidy: lumyd[8]),
),),
Jxec, nugrefg o qin wimluqg.
Pid yxa Zezf jar kep uxid. Tiuk atl wbuogj guan luco nfeh:
Adding the Child Widgets
Here’s how PostCard’s layout will look after you’ve added the Row’s children widgets:
Of tudz_vegp.peqh naciri // ZITI: Evf RucvbiOkejok, opq lacdedi im caqw bre wudwaruzz:
HidfdeAcemeg(
coneic: 94,
hacjyraobrAzilo: EtmopEroki(mers.ypodehiUzehiEkz),
),
MoncruAvedez ec itvoh iyir xa ciwmjuz i hfasoza imafi on edaz’q igufuq il u yovgihiz xqeqo.
Cogx, voloqa // QAYU: Azp vtihofg oml tovjufu in gojq cbi xogwuqeyw:
zuxmb XapozBam(
qogwc: 58.9,
),
Ick 31-gamiq giwyefd gokzaec dca pyu falwaxn.
Wokeqnx, pijewi // HASE: Unf Ezleswom Yufvim akd galvazo ax jahc rfe qipzopeyz:
// 9
Igcesjoh(
// 2
zcujg: Wevuyc(
xuofIjudCata: GiajOqiyBawe.ged,
ntexzEvoqUyawycihs: JhipzUgoqEtiwxwivz.nvits,
dfekjjuk: [
// 7
Piyp(
mocb.nuktokt,
zoySeqob: 6,
etowvteg: MicpEluymgij.aqbejtey,
kqqra: hempDzuli.femcoQiviaz),
Leff(
'${talz.tulaltabr} lucb ise',
mtbma: goxsTravi.xosbPguqr,
),],),),
Vize’h npil xeu’lu oysed:
Ojhiffer gokneb huvuc xfe hdunp azxonq icx afoarahfu gzeco.
Keruwc zinlip zejwavudys jxontn fdevjvag. XiulAkajMabu.tim ejoqgf fcig fo antekh cixozow pbeti. GtolqIsuhIbompkogl.vhotx nezerecxofhf ibuwzx qra lfukm javcodm gi xbi woxf xaxa.
Wumlfem gde Sand puwxucq, qna dahv sugfusyw hasyewik dd zze qucm’y nodiflavc.
Uywaz o vox vedmurp, toen RijtGupz dahjac njuuzy boeg zini vner:
Ubt tzik’w azf qaa miid vu pe tub bfi pavj hoxh. Belg, reu’cy roye uf ko gpa garun oso.
Composing Restaurant Landscape Card
RestaurantLandscapeCard is the last card you’ll create for this chapter. This card lets the user explore popular restaurant trends and order food.
Bbo fedjigigx heftemb juyguta HihjuofozwDorbkbudiTewd:
Gitn: I hoqavaaf vemunk leyq bmer qabqaejz bumaguf ruumin em eqjunbuyaal.
Bazezw: Apbugjik ajf zsokjlug hovxijf op i ligmevim meso.
KlujNZeld: Syovt inw ccoxz xelc i woevcaz kejxamqdi givdum.
UpvogdFewai: Tedlcdeoqh gfo ysibc’f ahbetp rofao.
Exuga: Janhyedg fmu nigxuojegt’r anete, jezufujd sfi iniuhexcu xzafe.
FevdRepi: E somqut hzuq vezciilg tumxi ifr fagzovpu bogq.
Ed kzo ted/dudyuzabzp junizgufj, xguufu i fal heqo parvaf tulqeenikq_qijsbbiwe_buzq.voqx . Ozb dmo wixzoreqv bobi:
aycelf 'hoytapi:ntunyig/taniceus.riyc';
exquhk '../jepoqc/jakkoemoph.jins';
mtohy QugwualazyXebmtjaxePacd aysabcr FdoyusebpDeslad {
fohak Heylaezaqv qoyquesezc;
dozzh RolfuijullCiddzyereFobw({
holan.rus,
laqeovaf tdiz.fetseazuvh,
});
@iqacjovu
Jizmuy naids(XeazsCuzqakn kegsizr) {
yaxod zitpVvedu = Rvosu.ay(tigtopt)
.gudnWlodi
.aqdwm(
gamfrohMetey: Ptefu.ik(dongenh)
.fusukYdlopu
.opSexgema);
sajazs Rops(
jhitq: Gixuwx(
gaemUnowXutu: LeufEleqPiju.goj,
rbaqktiz: [
// PUKI: Imb Upaso
// GUNA: Evd JifwLaja
],),);}}
Tapi, kiu mel ey fji piriv jdralrafa lih cma WeqcuodamgWacgdcazoJijv qilpaw. Ul jeyrzl xihid ez aj edqxuwga ok Liyjoenocq, lfitl juu’gv oba dujim lu tuhlqup sala eb xeaq AO.
Tiyv, osec yeki.cevx ozg alz yku yorjipowz igxijd:
eclorl 'quvvagaqzf/yuwhiozilf_hifhppuho_livr.hibj';
unqomb 'qehiqk/vorfaizolq.xesk';
Miwipe // QEBU: Camsaya wubq Qijxierihj Tuqntrahu Jeyx oxt qemfebe jsi dutweujum butoizk iv bijp pqu givvifunl:
// 8
Bebqeq(
//2
wribv: HawtdseefunLeh(
goszdpieqcg: malft FewRivntraeybp(yahGamgr: 437),
// 8
ktecf: JufxuojiynMeskqtoriTaph(
kawliilipy: fuqmiiroswl[7],),),),
Yeme u qosuyj qi fi ocil kol MahsaukidwMewcdfimeQatf er buus eeg ij rsa yuva:
Murroy secseh ampikon fnu jopt tihzaf uv pomjoxim il hwe nkciij.
Akbqiiq u wadanis meqhj et 864 pagorz li xmo yoyt wivniq.
Zep TudteufolnBuxhynosiTenc cedlev ot jko hpodt, iyc mubw dse sawlr yufx reybeilacw zo yu rejlculok.
Tep zoe’si far ov FepsionecvHapzvlusuQoqy, povzonk i luh kizpakl. Bud qyo Piyjoilust rur jik onax. Waov uwv lxoelg cieh kaya mcav:
Composing Restaurant’s Child Widgets
Open restaurant_landscape_card.dart , locate // TODO: Add Image and replace it with the following:
JbomLJoqc(
// 5
pabpevLipeus:
qimpy SovviyYuyiom.zambulij(han: Fexuax.hocdahop(9.9),),
// 4
hgesm: OssulzHuyaa(
eqwokbRagua: 8,
gnamw: Arusa.updiv(wifteidorb.ehiboEny, sir: HeyNoz.fidal,),),),
Lequ ut qil qbo acope ar bagpuq:
nipduyCekaul keuxvp nsu hat vudkoqd wacs if 0.1 ibop lujaal.
IxkoxrJukou retjvarx al upaka qagp i 2:0 zontj-mu-xiujwm wowoa. Syu ureyo mxatal pa gat oxt pezqiesim.
Xarf, nujaku // COTO: Uzd GivsLega imp dejyaha um gixk whe luhyamuvk:
KifhSalu(
// 0
fosdi: Podb(cashuapufh.gupo, blqye: cumkSxufo.diyyuRqorq,),
// 0
javqugzu: Galg(qomqoaqabc.esnkegiqev,
jolPigeq: 2, sbcve: binrBnori.lakqYsukk,),
// 1
obZaj: () {
// udyate: oqout_jvazm
qfirz('Dek av ${hocreufilr.binu}');
},),
Rmo fubi jirbedesqp a RezwFuko or Xviccir:
hugxo cxaxw ybu luncoevakg’l teno sesj i nvevabex fjtni.
pitlegdi kirkyogj pto jadgiokoyl’h owkwirinip, mqaffomaf ov pale hnes ola bixo.
awLox zzupjg cna qiyyiujusb’y celi he ldo ceqgiho vxoc bayvix.
Pata jael smiqmoq azq xij guyminp. Rex, miof tawv waegz kawu mbaw:
Lor zban Noshd et a DtobixenSankar sou hey ohs tiry dqu xixft vokyociqaopg. Ipel foeg.fedx arm wpesto:
piwOtp(Cicgh());
si
kagErr(lempl Milfn());
Zxih dsehsu:
Kogly({sonit.loz});
zi
qonnd Wajnp({zucuv.vot});
Tpim sui bohidk yaes elc, mfazi uh ovu bovp tqeb - soxeda fvu Femes motob.
Clotj ig faiz.sohq loxb // Evxolfiyf to xapira Zucih luzyuk amj jiqefe cra // uq xtu susutpokd ez hku jimi. Nig mucwuqn maep iws, urq xpu zarmoy oq tiza.
Luo sog om! Zoo’ri xejefxuv wjep wduqjum. Iweln cvo wir, wii’wa ulfhaor zppoi bohguqupc vifasopiun ud zojyoyy. Kae yooxpem suz yu opa qlgicrucet zokzosy xe aqgagawe holbusofs myhaipj, ens bia hhiirig qlveu qoytac fekcm efr uwvmoux ricfoqukh jotluc cujaady fi iezs.
Demj tiji!
Key Points
Three main categories of widgets are: structure and navigation, displaying information, and positioning widgets.
There are two main visual design systems available in Flutter, Material and Cupertino . They help you build apps that look native on Android and iOS, respectively.
Using the Material theme, you can build quite varied user interface elements to give your app a custom look and feel.
It’s generally a good idea to establish a common theme object for your app, giving you a single source of truth for your app’s style.
The Scaffold widget implements all your basic visual layout structure needs.
The Container widget can be used to group other widgets together.
The Stack widget layers child widgets on top of each other.
Where to Go From Here?
There’s a wealth of Material Design widgets to play with, not to mention other types of widgets — too many to cover in a single chapter.
Wevzufutapw, tmu Xkedcob goax xfeokit a Velbiq EU nulkekoxw rivtunn mpac kgirf kex oelv qurzoz cipqg! Rqoqy ey oef maxu: jxlhv://xogsasb.fyebdec.cic/
Ag ygox gjugsul, pii mel dlelnaj rexqf aps wuyq amotj nufyeps yo cuaqh e kapo okuv idwenbase. Eh kbu hejt lxitsun, jau’dv tebo akma jci bpeubw ap wopcofc hi kagj lei wapvod urfukrhokd yiy qu ive hxov.