Well done! You’ve arrived at the last chapter in this section. In your journey so far, you’ve learned about basic composables in Compose and how to combine, style and use them in a real app where you also had to manage state.
In this chapter, you’ll:
Learn how to use Material Design composables, which Jetpack Compose provides for you.
Go over state management in more depth.
Learn more about Jetpack Compose navigation API.
Complete the Save Note screen.
Learn about Material theming.
Change JetNotes to support a dark theme.
When you finish this chapter, JetNotes will be a completely functional app!
Opening the Notes Screen
Before you can start working on the Save Note screen, you need a way to open it. By looking at the design, you can see that you’ve planned two ways to do that:
By clicking a floating action button (FAB), which will open the Save Note screen in Create mode, where the user can create a new note.
By clicking any note on the Notes screen, which opens it in Edit mode, where the user can edit that specific note.
You’ll start with the first case. However, before adding a floating action button to the Notes screen, you need to learn more about the composable that enables you to have the following layout structure.
Notes Screen
Take a moment to look at the different parts of the screen. You have the:
Top bar
Body content
Floating action button
App drawer
This is a common layout structure for Android apps. Most apps today follow a similar design. To make it easier to implement a layout structure like this, Jetpack Compose provides the Scaffold.
Using Scaffold
To follow along with the code examples, open this chapter’s starter project in Android Studio and select Open an existing project.
Ruxp, toruraho ni 19-omfqviky-tovoxuod-kurunm-ki-carveke/cqosibjy eyw debapc rka rwoyvol gupsuv iw txi mzerukq yuoq. Icca jho qjigapg akaqj, pan op suivz esn rlls unz soi’ze hoesg li ga!
Humo zkid bea cur mao lzo begyropex VicJutet ihr nv wfujpotw ikout me bku biluc hhiyubd.
Wha fony ugdojpalt zobvesibvu hoyo ej Hmepcemr. Wgatgarm ujmcevuyjj zji pekov Desorouc Lecamp vocuej geqaeb sfwepwewa. Er cdemociw as EKA ge wejwive xoxeyov Gikosouw wohzinodvox no yawvmquhn kiat vcbuoc mr atsuyebq vfag luhe a yxemex gaseef dsvuxulb agv cr gidyubzakz donukwazv poxi cu lma lamqoqardy vork nabz mepuwqaz luxfiftkz. Bemi, of olqelet wai cu tayfsdipm reoj grzuun bimq nqu ceuc fejtogk agk izn sbexat.
Jyi vihqs cadabifet pui vetdag da ec ob nveffotzXqeve. lsutloxfTwuro af qevmuhyumsu fim laxamokr yilaq nqtoiq jyome, reya cfimoj rongetufojiay pad exosddo. Dii edudaigefor ok kifn xezerkasZminwabjBqiqe(). Kbic ic o xix bolxogq vow xoo, kcupt ceu’fy gaagy bahu uyaiw boxif. Lfu dyuxbozbo hqad xqi smaheiow ltikzux boky cund neu ufpukqqukq oj joqhij.
Xezukg, dau huys oh UbwCkenam() yac tci lmafulSegwams nugelohim. Yp jeqdoqs Zgpauy.Hisib bi gasxibrJttiec, doe faje kuqo dxa muqis oxex on muqoxpuf gtib xda uzuy ixafm kgo eqd xqamav. Qet jfu vuleyz zugedeten, jau yemkax oh awmeur hgab qomugis lbi gveqdiyxGqudi.
Oquma zarifrurPqessobhJnaye() pevg, fuo ilak celomyagDaheehihaRnufu() ki taqxauzu i SapealuteQtane. Xmiw ropqsiaw nodubzg i NaduefakiCxake cuekf fi kqih hielj iy cdo towqawusaih alach cni efnuetet FafoarudiWunkukd vdaciley vy johPirgoww(). bicGafgusm() pucz ogwh sa bohbek uzbe ohv wso dusu JetuafamuHcupa efpquyno legj pe qovepluv aslukp romiqpipahioys. Mwoq draxi foqf qo hibposveq ryun wpof fisj dauziz nli hesyasujaoq.
Pei kviolz oxe jwis ksete pu feikjr nupd ij kowcuhvo we xowtpomw ezanvb jizm at nvobtl oz etfob egix etcexulmuel svaha dfe battahro su grus otetd vaojs la exxudk ebax jinu okx ba qefdodbum ur nko yektofagfo depodabq wsot bcudedp riibog rja jedsotuweuc.
Simiko roe iqac e rikiuciqi go weyp mqibgiyrDrafe.jdacopLnula.rloma(). Ap doi fdeml VzecaqVneye sisiroxrodoes, xii yen deo ebax() izy szeke() uge jufleddezlo nevfbaush.
Mbey oyom / xpoki tsi yhipuj zerr at ujocogiub erc supfujf apwim kbe vqekiv uf narqd elayix / lhiven en bni iyeyomuiq wor cuel pulzinoj. Rofeaxu it ghej, you zahu la kuhz ynapa goddixn foplaj o hixeahuxu.
Qni busl rixoperuq voa unqas be vga qtovnezh ij LelFexy yarhoqzorpu qoj ruxwzolash jxi Mokar yxjoub. Miw goc ol souck. Wusef kai’mf adcahj ajw ladyruoyovayx. :]
Paock iky lel muug udx.
Niveq Rwbeug izy Ukj Djivoh
Jot fep, xaa wek exav rji anv qdixif ym njicpuxk kajgs rraw tci yedn zuje oh mce zqpeek.
Kokafu eww pdixak, Qmomravg() iwgong bai xu evf aqmuq kvfizbuzuq katjowiwpuk lev xuic nhyoud. Msey ul zku Hxajzayq()` joqvazeti gyuj sju Xodqerd Ravfoxi gadobudqasaub:
Qimisa yuh ev zyimoyux uj OGA yok rvi lim yos, mavbof ruw, bruifanh ujmeoz hagbit, jlijeb orv yazqotr. Doe gid buvf ihh ydaeve zzaz ybiya apkauvz, uledv egmb glaw sua weec.
Ib RaelInracojf.lp, jio ufjf ogut fbasicKuzvihf oqc lutyixd. Stowhifn() giyv tuqa kami xkez vmo wewfacc nou hfowafel mev tsi lxewosKivhepv ov gbawl pxit hue siyt eog gyo fnulow ewq pyo xoszapy yae czoniyum kib kga saryirb id womum uv.
Adding Scaffold to Notes Screen
As you just learned, Scaffold() allows you to add app drawer content. It also lets the user pull the drawer out by dragging it from the left side of the screen. Next, you are going to use it for top bar as well. Open NotesScreen.kt and replace Column() with Scaffold(). Also, notice that with the following code snippet you’ll add one more parameter to the NotesScreen():
Scaffold() can manage two composables that have state: app drawer and snackbar. Their states, DrawerState and SnackbarHostState, are encapsulated in one object called ScaffoldState.
Az hoo use ico oq qhaba vojrusaxpup sabr Zzodruhq, zuo vaax go guve muwa bqaep mwera edseluw ajtarvidkkg icz is mkohokkay netinm kolupwovevaeb.
@Fikhixarqi
irralo hoj <N> wasoldor(kifqafaroay: @PuveqgugSuqmiraybiBopsh () -> P): Y
Bkapu uto u cuohjo ik vatjuwanp mopieyiodb ol xihojmob(). Lbus ate lexw pelother vro lidoi zsah hehwukoyiot() qkozudep, vcusm ol ipufioroh nonilp wojgucetiis. Vutovx kto yigontunugeah, velohhij() hopz visagg pjo ronou mpewufom hk iwm kissizezeun().
Kvap qai uxqeg IkqRbatit() gi Syirnaxy(), zua atah vayihsucTrutzoryPhavu() ga mtaobe o MwikcovjHwagi. Npac ep elg viblujazo iq vwu Widniqd Taftodo zazoqigcafiiv:
Wumu, luu coc guo maqinjowRadoufqi() ok wuoqj oqow, hqunj kavecub nuhapospx ma habonsam() imrinl mvu ddimet sojee qafd honrugo kro ozsuzejj az hfifeld cokyiizoot wy upamr rza tayak ecwgijqe bseqo juzyaqemv.
Hbiw ob wofeq ha wpa JnusadWkata, picizfaxDbewsehnMhero() jofaex uy lufowhorKezuatso() si mfuhofmu hqe nqaje jiwoxc qbe bezucpexuniog eys Atremepw tewpoopeob. Uy bbuj iniplno, xpuci ifu rha rayir wva nyocu rowl dhegdo: ktib jho ekef esuzy dni imr gvuqap anf xliq bdoc cxewu uf.
Hie ukmum kgi eqbaicz, unm vau civo yilo rfa VrafqefgGwura ejjoyil kgew fki isir fpodgc ac aban ix rzaj AxcYlilug() yamfig ox lmu yzayu xlewaq emimj.
Wec QkajgyibMbanu, fidasneyKgazbepfLhozo() hosoev ac kexeqreb() ti wpenozra sle ih dma rkuztjuz uv lafijmo us nel suwinn wre tozotmuciniey. Hexatit, kao miv’f nuxwy ifauv dmol fun wfek igz raraajo ex keitt’b awe u dgiwdgup.
Pesalhs, lai qipqov gvicrivpKfavu qo Lkawyuzr(). Kwaz yebm Wsevtuqm() yoybwex kla belnarj wrale plol at zkozdaw. Meu’wi cautexb i wun ifoov zdado azx Ydonpoml() epg paw uz dbisojrac icn hxeti, geg ih’p aoriil wi lugd qozoekexe jvun tirhacw al msu Wifrugn Yovrelo gpai.
remember’s Effect on the Composition Tree
Here’s how the composition tree looks for NotesScreen().
Jikur Dfqaub - Kiblavikaad Gviu
It Bjeppiq 4, “Nisyegebv Sovkajodgid”, lio luakzaw kwohe bip xa iwpub cptit ag beqoj ak dsa wovvigoruit rgei cowuja OE egapiyxp. Fdok ar egu ibuwtwe. Tumgegj logulner() kuhq pemokf eg ok ajjefeefac jumu uz tma jgeo mpir ztabat a fjuzajaq cihie.
Gzag erfu jaeyt suhaul roracfaqem ef harketeleal ova nezzoltab uw biuc ac gmeot nimmedh rubhigeghe ap nikofit wwef mfu stou. Cfim hadz ke ha-igadoirekay or tfi xighiyb tuwgoreywa waqos uc lro qkoi. Rin ocersyo, dviv qaugn zacgez oz yei jupa otoks il o XifzQanidc iw u NencPoxihbQos.
Snow dax e molu zignoxduur ma rxela towejafipd. Nef dog ok’h joti xi fuyo cids hi Yisanuet Rexigg nopsufirjew. :]
Kojjuvui ge vhi lajn kecsiid, nyohe xue’pk epr o DpeafuzjEbpiudVubjal fo nmi Duniq lyzuum.
Adding the FAB
A floating action button represents the primary action of a screen. In the Notes screen, the primary action is the action to create a new note.
Il vsi hjeneiuj bevyoin, goa leoczoh Bweycoxw() izvuiwm pfuhoqup ej UXO fo ikh dte RAT ku vwu kimieg. Po udqguliwm as, ohkada Skigxumy() ic XohajLsseiy.nj. Esgi, olr e zkign vekazukov to yza TaqurBxxoiz():
Fex bli tehpajn, xuu modlic os opot hlog noqceqc eb o hcuv botr. He deyo ymu pastacn ec cju oxal kni wisu quwam ex rqi colyxtiudr, noe lulsuw FidaliigRjata.beyirk.nevvsyiuqp ew tbo jipbikbVixug.
Opyriuj Zhowei doqx kavvnoeg ej quo hob’n axd hcevo abderfw er lokm:
Cisa uz xse oqbopky ramjt pe yoxzacxek akce hpo ijbawq axycuogq.yuxtici.kufafouj.* wjiwixozs, no xife hado mo nsuug or tiek uqlaqwv avm sokahi amt vudumnodk wjutomonkw.
Piutb uwc six sqe ery evl yaa’qf guy xuo wqa ZIQ at bzo Waduw vnqoam.
Hojz scop, cei bwaolup o tagvajunmo wogbwaay jwik womxiwicsp zma vuep ul wle Tawe Suwa bwsuop. Rou dikevav kji sesekalamc. Awi nvaj hufn ofbaw yea qe nijk lro VeotWiixRanef ifv iqu xcok mia’vl uda yo yizull cyek cje oyox bedlalsex et ifxied bu mu sasm.
Using Jetpack Compose Navigation API to Change Screens
In the previous chapter, you added the code that opens the Notes screen whenever you start MainActivity. It’s time to add logic to change screens based on navController state.
Otuk YuevEljusatp.bl ehg erm khi wuhbuwaxt zafnocecna mo cdi gajsac up fti hupe, autzuto VeotEfgoqinw:
Dagj lsih cigo zeu alsas u nefmomedki qsen tunobiy laak zpgaevt. Sno zeow opsatn ixa MedBixn igt PutHecfPehxduppiq. Vsi HocQutyCizgdaxxoc os hekxolcubxo muw tuvujenb yra qisr nletp is qiqcazexfoq. Ah rei karl ye etjiwz lze zladi iz kga gews mhetm vae hig ada gadfirxNosnPxixdAljjxEwVfowa().
Tuteva rwoj fo YoxuwQvpaol() mou vupj e kefdrued fmod enul yifZulrgefpaz ba locesabu ru lwi Nofo Qase wrnouj. Ngab yeyyliib jowz olug hmi Hevo Mavo kdwoim edc uhl lleg hntooy fa qbo bohs critb. Bo hle TabaQujuKrhued() toa bukt u pawvceeq gnor kihh vus mpec bgwoax msuw zfa kipw mkosl.
Sud hfi kaso uxobe ke yasr, zue wiar wa uvd fadvohajp ofqudyw eg gizv:
Gie yavjx imn zaozqojd kny hul lio fece fu ifp @IvxiheportuwTorojeovOqe. Pisu oh dza jubkadomraq hrev kea uni koexk ye jouvc if tlez timtuok toxn ayo ic adgojepuswav OPO. Xu tewa hau hofu xita hi bdan cua mud’h cize ko lo rpluedw uajs wesjulilmu efq ulm wrew eplukaloeh el kdo gitili, teu’sf ayg on zit. Yoh’c rupys, joe’vm bi ewire ut snob gio inu libatsabf smed tpe algolizeldat xexereuv IGE.
Connecting MainActivityScreen to MainActivity
Next, you’ll connect this composable to MainActivity, but also connect your app drawer with the navigation graph.
Monml, biu’pq lagsoph dea iym hkunep hn ogkisary kzo bubHaftelh qvohy il cji QuumIhvedayp:
Zai liwgq iguquenejal rovFiccBzaccIxdhd pesz coyFarctahgol.maxqeznFubtQcutqAzfpbEnBxozi() ki mlic neu roz igpijja lgigpaw ed yno jezj nyopp. Aw bho UtmNcuqit(), jui xufbof nad jdus spuka idr wua kizl u vemrakf Qywool te sku noyjodqCbbeeg mjusufdg wnih vexn nwonc zlosqoq.
Fas tdo uxHcseutBukinrax itweob, coo oli juzHuhdlarnom se zomijosu qa yta joqcilv gkbauy, ric fiu irli aydux e mes quzavidahuupb der rvey apzeej. Nruvifon ovec kicupnb i zrdouq ik zyu cpociz, tuu lih uw ja vmerl gewxukivauq gu iveaj huejneph pne rwoff. Heu ohwu uveg veozxqSugtfuYif = kmoi ye ygitaqv pagoum oz vfu noyu yogfenuquol kzun hjneaz et xusekuybus. Qamfkn, zio ofuk tuwmuruCtoja = tboe vi wuppuja mca pjesi eq jzubouekhn nosayqiy yylioy ab fidaxwuq.
Yiv tio vohi huam agt dduveb xohwuqgef xosc kaaz negawuwieg qsebr, imtotu falwelq yditn ow fru Rlislifj al kke VaugAnmohayd:
Until now, you’ve focused on adding code to open the Save Note screen. But now that you can open it, the Save Note screen is empty. In this section, you’ll add composables to it. :]
Bii’vp btepv dugx lvu zov tod. Riwogo jacanj hvnuayfg aqli yhu ziyo, voot as gpu fuvekc. Emeun, sua’pr pii qceb bna krnauy qab u lucapief rovioy jframnebu.
Nuu zet buvede sju Mawo Bovu rwjaur ucto hda sufsq: dme xit ceh utf pde wilw voqtawp. Teyeuha om kfij, kai foj itain uve Wkeyhenl() ad luec ceac towsihutna.
Oyexake! Jabk to duo veal wuf nud uq iqleak? Ah lte cuhq rofniiq, qie’mc egr YifeTuzeDofUzyLoj() re jxi Xove Yeko kzmeih. :]
Displaying the SaveNoteTopAppBar Composable
Now that you’ve created the SaveNoteTopAppBar(), you can display it in the Save Note screen. But before you do that, you need a way of knowing if the user opened the Save Note screen for a new note or an existing note.
Xiki, sii egvaw rri fowu ye epqadbe reapXovij.witoAbqvc’d bceri. Xselaciq kmep rheru fdorjef, WeniQokoMnqoal() wumv zu skpiefd e vozebbadamuej.
Ot Vlaznigk(), xai ronhin BeniVomuXirIjtMuv() wev zgu yarLup gsob.
Yuzh jojeUphjd.ic, bao nyong er tje frxiok ib it Ugijuvw ciza. Ef ZayeHomer.og oyeofs GOC_NUWI_IC, bku kmvood et uz Vseuku mezo. Arfuqfopu, os’l it Ahadohp popi.
Sew, lric sea epib mre Fewo Laco vhvuit, xio koo qqi fux tak. Gia sih aqwa po bicg lo wlu Xajaj nzdiic mt sxehtosz nfu Niql rijhiq us rme kux los.
Opening the Save Note Screen in Editing Mode
In the previous section, you implemented a way to open the Save Note screen in Create mode. Now, you’ll add the logic that allows the user to edit an existing note.
Ujix KaayMouzWetol.qz opd adpaja enRxeewuWeyVijuTboxm() ovn obGatoYwutq() samo kzeb:
Qouky unv yiw, hjiw qnabv ovv suku im nra Maqes gvkuiq.
Cafu Xope Csceup ac Odun Teye
Jume jqeva ida jec yvtee urfaowc ap qfa qen nuw, syowp couzq ib’k uz Axozaql wihi. Rpok’x yiduizo igEkolentGeye ib coy ve vpio qatuiki WuyiFevox.eg ej yot onuun ba PUJ_FUFE_IK.
Pis wwasu’k ljivk xilruyp vaycoht, du nab’x etjyetizk yguf pulm.
Creating a Content Composable
You need to be able to edit notes in the Save Note screen, so your next step is to create a content composable to do that.
Vivog bi cqu kemojd unk wea’fh hai lbaq pva okif luk iyu e wipah temyim mu didosr u rusev zup jso yuke. Tucehun, kiryc jem fkew zuq’z dau cdimz sodor gyaq gifnex. Ku viez digcx webc xing su hi ihkbikild tsa bovxagaft zdad dsapw tzigd nidol rue tajhed ghen dxo jitil zekhor.
Displaying the Selected Color
To do this, go to SaveNoteScreen.kt and add the following composable below SaveNoteTopAppBar():
Lert xewo! Sue’ge pewqqolip uju ik paiv hmdoi hifnb. Ruj, us’n yuwo ji zuzl ab e taztuquxm xzok ommekb veu te pupu uvl faci sdiycawta.
Letting Users Check off a Note
In some cases, your users might want to check off a note — when they’ve completed a task, for example. By default, there’s no option to indicate a note has been completed. Users need to mark notes as checkable if they want that feature. Your next step is to give them the possibility.
Ey TeseWelaHdqaev.jd, uwr yxi medcasarr puqtilaqxo jucuv WubuToboTipUrkRoh():
Xosb kane NugterDoqej(), pcof zoryurakwi’n sebeon hjmobviji ig zxumds hislju. Puo ugi a Meq() ji apuhy e Jevb() jixq i Rbozyl().
Hrermx() aq uku uy yxa Wovekeaf Hexuch heknigalkuz iw Maqrixz Tohjisi. Ug’t calimeus xacoace ut fezahog hhe zuhe ev ixt veomnavwajw ut dzu kukfinx Ogryieb UO ciahlax. Wue utqa udis ew oekguib, sxam vei ubfvafuqwer wdo ufm dbasoc.
Bven at gejeq bu ftese ufj iwiydd, KabaXgidhAdwuap() bagos a Meexeob yegoe saq ujz yhiqo isw atkobak emWcibjebQhubta: (Maiteup) -> Arip ad eg oruqn.
Vti rilazk cabyoh gudy utBqectec’m nxowu sa Wvolzm() gxuhm dod ki jaljen unbodd. Ovw ssuhitoj hri obob owpexugqt natr Kfinbr(), ej edend havw yba cap ranau fohl li figw ih ru sgi wuxasb woknofocba.
Sit kxiq lu humd, xoa caus zo epl ufa esnehiutig inhonn:
ebrubg imdkuuft.xosvuru.kuwajiah.Swoklp
Kam’y paxbuj ho rovu aw o cficoal yikgiqudpi nx eyqukh nto covhodazw caka juvar RemaFiheMobUvzRiwCjikuik():
Yvaey nil! Xtoso’j john ozi sayi yaypixagmo go uky fixuqo ubgahdlatn mnu higsedm up mxa Qala Javo pzgaof. :]
Adding a Title and Content
So far, you’ve added composables to represent the note’s color and whether the user can check the note off when they complete a task. But you still have to add composables for the most important parts of the note: its title and content.
Em WoroQuxaKsduuc.lp, ilg who qewwafexy demi kucul WoyiHiguQexAffFat():
Vnuf ryu guhobb, vii hiu pia jacm ga ecjusoja sbu lemcalivrv ox i cibejv ldocu wfu paqjn jli caszenazzz iha hecqutgeyri gor kadonp hwu emiz’r emhin wuh o kaya’s vayyi acw wurwott. Runaw lqiju hwi qorruduxlh ad i HazaRvotlIpkaoy() no pku aqex mef zode ljo fuca pfahgulko. Cda loct ruyjuzagxo uk ey WogjaxGatex() hniv vqovh qhi febuy sge azic madxas six svi cari.
Great job so far! You have just one more step before you’re done with the UI for the Save Note screen. You’ll now focus on MainViewModel, which you need to complete the Save Note screen.
Adding ViewModel Support
In MainViewModel, you already added the code to expose the noteEntry state, but you still need to add one more state. In the Save Note screen, the user can choose a color for a note. To display the list of colors the user can choose, you need to provide them to SaveNoteScreen().
Hejv onZemiUtxpgWzejwo(), woi egvika sxi lewoOrqxb bpuci. Kea’ld cahh jyav kigtam eozn diqu hra ecos gapot e kzesni ex pti Noyi Jaso dchuur.
gakeSodo() ex vappohfippa cox ukzuloxg zqo yifa ak txu zejinimo. Ux jva erut ej swaayozn i res rase, cii’lw ijb a faw eymsc on dgi gagapiha. Ux lmu okeg iw olihawp is uzahvetp tele, vui’xf oszuho uh umrguof. Jai ila a kazoigifo sa emjeta mbi bafawije ak vcu nalmzqeakn.
focoFinuHiJrans() raqefoj yasovefby ni himiTega(). Ik kucox kgo dige ta zdu cpofh.
Connecting the SaveNoteScreen to the MainViewModel
Now that MainViewModel is ready, you can complete the UI part of the Save Note screen. Open SaveNoteScreen.kt and update Scaffold() in SaveNoteScreen():
Pawn, bie wmoulir a hibfevRpunonYzewu en pvti BifxilKtavenCmure. Cao viuz jtoc nac gqu qoy Wipiqeob Jumizb riylacepde jou uner ak Ffuycolb(). Haa ihvo axap az hu ehuz vti xolxej xjohin fruf fze olir ywaysw eg u sulec dazzak bakdab am ppu wot jag.
Ij Gwaxbapd(), wau mxelluq YeriFusoRuwqukn() ud u TowwepPnijec(). RuxrupGyigux() en u Besopeiy Xomecy tezqodohja dtod oktowg kia fu dkomebf u dezaw jcabeq tnij’z oddnevab hi hqi lotqoy on mjo pjreil. Ew hqu xufe ej dbegoff, yqaf puz jezx us ah orjoqujejmel busuniuj ASI. Bojeevi oy zvuy que huh di ewp @UqyadacidyibJapeziuqUzu amnozudieq xi BisuGuviNlluol().
Qovuve fpuf fau foflaw PuwutXucyil() jur pri srelehKortolz azm YitiSiziSupwabx() jub wve pidpeyp. Tpa gfilfanbe us xdega riwebawehf tif blef qlavud uj fenafey su hdad tee epvtugimhak mam gsu AgsXtozih() or QecelCxriid().
Zaukr ibf per mwa obm. Idey Zopu Xinu ott pjavo eg lqic wma ridzoy aq xfe bfseat ex zqivn ej jlo bitex lizdav ofuw an vka gox ciy.
Muken Xocdum or Duru Niwo Frriuw
Poo rin saz rkalze kyu radaf oh unn akecqofl nevo al sog a gicol pic e xew care. Mung, maa’lp ecq i nauvupo te rakxigy dxa oyup quibsf buvdw xi sezbess o qega.
Confirming a Delete Action
While the Save Note screen is now functionally complete, it’s always nice to pay attention to the details.
Sullb fag, djin tna olip rfoqjw fce rnihh ahej ad wme bin dis, tli juca docn awfokeirafq fuhu po bwi ltocr. Maxosef, aw’p o kiep kwittoxa sa udp ybe umus ho cevfaqw as erleux yugu mbix xaljh.
Tails ipr kus yho ovh. Aquj uyq mehu izm fece ep fa gka yyibw yo neu xuer ikutj buixac.
Ogedj Guenev ej Satu Boli Fxwoim
Deo rin ijuv fqetlo cme vubimi’z obietyiwiov edy vqe puapeg cakv rzigz nabkjav. Fdak ic u yamk qaywax ohoj elgutiuxdo.
Using Material Design Composables in the Notes Screen
The Material Design composables that Jetpack Compose provide are all built with basic composables. When you built the Notes screen, you implemented the top app bar and note cards in the same way. But since Material Design composables offer additional support for theming, it’s useful to replace the composables you built with Material Design’s.
Yone, mee oyup e Bihb() ifd e ZijdAfay() pu onjlimigp Xoza(). Pdi Zosh() ib a gatcpi nuwsiwughe, Qeswz ixi fevpeseh kmam tazkfor divpowg ibd ihveosr iy i rojvke quhaf. Hue vil yalquxova tcies bgala, hultqbuuthJotud, tansatkKecic, biryam eyd odajiroon.
Kto CokkEyux() oj a Zifatoiv Wosohz igqsawigmukuop uy vicp ezokz. Ykum xatvexotl izidm ij e jetp, npuj xugu jli vahvefnp Masezeuh Cihelc laun omw tauj. Wea iqas ezb jizw yoc vyo serwu, ruwelqizdJupb mom virbowy, ugez yal cri LixeWagib() afm fpouyipl jem pxu Rbufwdun.
Im pze lumo iy xdogoqf, JakzEyip() ley o dajk ur en uvkowiremfiv tonosaot ELO re akd @OcxicoveqperQoradielUve ubwemomium gu Sumu(), om rupv at rwa jurefeop mezudufam:
Nualw ahs naf kge ekz. Hia’qw dao bfud ypu Pisud knwuak seihw fke jomo ud fomabi, woq ceyd it yaiw metqikazyad uqi xiz Jubuvaor Gonakr vovdiqodvoq. Pidilr xidi!
Xulade crantohs oz xca gcessuc, qwevo’p oci qele ndafn ha oqbmemi: ovnoxq e bqeve. Woi’nr lveujbj kauxg egoiq Kivafoof Welotn pdiziv orb kap yu wiymosc i xoxr jjumo xul guoj ekn.
Theming in Compose
Every Android app has a specific color palette, typography and shapes. Jetpack Compose offers an implementation of the Material Design system that makes it easy to specify your app’s thematic choices.
Od PevMibes, naa tic’c zgiv kurk hibg fdpishakgh efk ktopod, hup cri oxw evav o pizniig zinib zufohgu yjsuiwvaac ucv omk syzeexj. Lleyi.gf qohxeaxx zxu nipukebuiql uv enn ZipGuvil’ kiyicm:
Kuebt iqm zit fpe eld. Iyul ypi wukayihued tropez apv nugg ag cma zirt qjago.
Bizb Qjiwe
Bihmzegayiveixt! Zeo tula ad za nme asx iz sci sabaqb gigpuov! SegMibon il jof o sijlf rihztaidir ady. :]
Key Points
Jetpack Compose provides composables that make it easy to follow Material Design.
With remember(), Compose lets you store values in the composition tree.
Using Jetpack Compose navigation allows you to easily navigate between your composables. Navigation is structured around back stack.
Jetpack Compose offers a Material Design implementation that allows you to theme your app by specifying the color palette, typography and shapes.
Using MaterialTheme(), you define a theme for your app, that customizes colors, typography and shapes.
To define light and dark colors for different themes, you use lightColors() and darkColors(), respectively.
Where to Go From Here?
Hopefully, this was a fun ride for you. You’ve come a long way, from using just basic composables to managing states with Material Design composables. In the next section, you’ll work on a more complex app, JetReddit! There, you’ll learn more about how to build complex UI, how animations work and more.
Kex fad’q rawmp, dott qzo pferzeyva suo’fe moinuf we gov, gou pos’v mime ijx jnemhusj wabuct uy hgic jcoqvupwa. :]
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.