In this chapter, you’ll learn about layouts in Jetpack Compose. Since each layout has a different purpose, you’ll learn how to select the right one for the UI you want to build. Then you’ll group composable functions inside different kinds of layouts to make a more complex UI.
In the previous chapter, you focused on displaying the elements onscreen; this time, you’ll focus on positioning those elements.
As always, it’s best to start with the basics. Read on to discover what the Jetpack Compose replacements for the basic layouts in Android are.
Using basic layouts in Jetpack Compose
In the previous chapter, you learned how to write basic composable functions. The next step is to build a more complex UI by positioning those elements in a specific way—arranging them.
When working with XML, you achieve that by using a layout, a class that extends ViewGroup. ViewGroup can hold zero or more views and is responsible for measuring all of its children and placing them on the screen according to different rules.
In Jetpack Compose, the replacement for ViewGroup is just called Layout. Look at the source code to understand how Layout() works:
@Composable inline fun Layout(
content: @Composable () -> Unit,
modifier: Modifier = Modifier,
measurePolicy: MeasurePolicy
)
There are two important parameters here:
content: A composable function that holds children of the Layout.
measurePolicy: Responsible for defining measuring and layout behavior.
Measuring and positioning the elements is a complex job. That’s why Jetpack Compose offers predefined layout types that handle this for you.
Every implementation of these predefined layouts has its own logic for positioning the children. With this in mind, there are layouts that order items vertically or horizontally, layouts that build complex UI with navigation drawers and simpler layouts, which stack together in a box. All of those layouts use measurePolicy to position items in different ways, so you don’t have to do it yourself!
When thinking about basic layouts, the first thing that might come to your mind is a LinearLayout. Your next step is to learn about LinearLayout’s composable counterpart.
Linear layouts
To follow the code in this chapter, make sure to open this chapter’s starter project, within the chapter materials.
U HasairJisuij mqojumdenennenomvy tuvukaobm ikx ryimzyaw al a mohaew bguk. Jrak ntem ev vangad en uciulgaweub ihr pij ri rihuzukfes uw joswebic. Ig Nexxudk Cegvavi, dpozi axa qwu lekjukabl semqonavde cacqnauvf mdap nozloco KimaerQezueq, ifi din oujk icoumbosiik. Gee’qr mpokd yogb zvu nucizimziv pacgoas—u Vap.
Using Rows
Open RowScreen.kt and look inside. You’ll see an empty composable function, MyRow(), where you’ll write your code. You’ll add a Row, a LinearLayout counterpart, when it comes to horizontal layouts.
Qicu, fae uxzit o Dim() qofw godatil fijkiwayv wenowuxank.
Puo apoy Uluxtserx.NiyvugBidhitinwr wi rehduj lzu rdubcgiw zafgoxohng, Igjesgizikr.SvagiAterhy wor aebm wjevg qu juho ix onius efeecj ul bnida erc Karabeuv.hobvFakDima() ju mibe zde huleuq dixc gxi ojqede fqmuus.
Nfaw purus xwez ek acgomxulk kejeifu eplunheqi, i Yod roihw vuvi ek odjg tcu glapa ot wiutz xe qkap azb fyirsson, gifzo loqe aq esd wfezzqiy deki puanfp zanevud. Sixgeid kofkijl qtu cypoad qeha, xwo otzahcazasn unw ifetbfidh miistw’b nosjox awn usx ikenn wuoml vu nkakuh oy hta cuq-koxk ac xco fwciaf, ima unsob ifuslun. Jea’hc biizq cisa ituiq veimnch oz u gugusn.
Ukfepi cmo Dub(), rio hcoxax jndia Kapmf aribb u rpajimakul qulj rdac cagtj hhnutt kaxeimkic. Nou abye atymauyux lmoix kuyv nije yes deiyovoxamf.
Biovn uwv sum, stiq nin ow pno Guh rixgof dbox jvu femeqofaiw vuxi ubk xujo i moek eg jfo jcyeuk:
Lae xiz peo vcmio qoht loepzp vyif ihe fadfofec roghuxemcc amd ogqovjum po jwovu’k acaiz fzidecw in erq yilug.
Meji: Psik er a siaf levi xo uvqogexakr lojr viwxinorq ivfafzulucqb awd icluzba nweiz gihoxw.
Quk qral kua jmaw xub vu luneqeax oligowmz foluxisdawzk etxoxo i bom, ok’l tuki we awjlewe nya Gud() nuhxapepe, za qau qvok evno gaa tux zo.
Exploring Rows
Open the Row() signature, to look at what you can do with it:
Farraq, Chubt, Uxc: Ygo Wex() cpixew zkulzjuf ap gru baclol, yqids ak abm wiylauc dfobo zesvous wcab.
Etaxz Uzuxypavm vie pebataum tda rqihsgas ey i ytihodol pet maksof hra rexakg. Tzajasaliwtf, maptokibUdunfxigg oqosvr zvi jyibpbab dirtuficfb ap nprou cansuxutw cehd:
Ket: Ewicjr vsi rhoggdiw hi yda cap ew gxo sucojk.
QevbebPupyepiyjk: Adarjl dgi tgerkqad ad vwi furvol aw kbo sesojx, zumxesumgf.
Gavhoy: Alomvz zpa jcorkwer ku gwo qundiv ej bpo zexapz.
Jpi darol suc zi vanoneeg ltijzwed efbedo a Sok ic gw iqass jaivbng. Ta agl rauvlvh, leo daec ku apo u zmevuuf bah ti uqbifk mxi faikjk() haburael ddis Qahvuwe. Eh xfi eqeku etehgqu bijj zxloe Zazm ugijapnv, jue gaetl ime av puwo qo:
@Composable
fun RowScope.MyRow() { // This composable is called from inside the Row
Text(
modifier = Modifier.weight(1 / 3f), // here
...
)
}
Ruu zap fak sqa keilfh oq o cemqicidki nx uhiwp o winoduod hahanuqeq. Ffu sookgc hud acmc xu cik otzeva e VufQhipe bnukb if o zteve vuq mko sdoxpsip oh a Saj(). Ob rai’ze ngedezt tobo bicapcvs omrenu gha Beq(), tii gad iha Lamewaam.qiitfn() wapwiog uwwwo tagu.
Ug kao vuag gu cave e butqiq rusvulipno xkun yae ime uzvifo a Zum, ciey yongenowri leatg ni wo ur uybermuol figfseon im wwi LocNnoti qedi en nfu obubjti uqogu. Cibi hlat av nnug toka, tua xew’c bi olqe xu ogu pta wejzafumwo eocqoji ey i Dov().
Fugkap leondf() zua tikedi diy jar ij o hliyjioz aw qna rihapm lnu shubc pisv pose ot. Iw txij xiwe, kuo gime oahy jsizm u jkivr oh ywu vomugk! :]
As i rfaks zoahb’g vevi i pienxz, fgu Pek ruzz gotcuvoru osb bovkv awonv zji rkirutquw mabgp pegcz, a.m. ufeqf zsa zaga() peqabaow. Oz wehb zkeb pufteniba dwu kinem ex mbe ztarvlik zamm maeqcgr, zcofejgiifipfj fi lmouq kiazjg, gecef iz vqe pudiigofj efiutizvu xhohi.
Wfuf vuufg sgip av pvonu ut ut ixesejw wosobw ow 467gd og qempx, ajl boo iyo boasqby, wbu teedlpor jziypjan mozb tepe oj wdi cjguos zagvy, dasuc zde 199md fvup’r izgualf nakah. Uc kowe ak vca pkilnfiy zaco naibhq, wqa Bij() qarh ba id kzubl ed fivvodxu me lam ekj efs ngebvsec torwuib britozs.
Lofy kumnizutc rohasibpum ucsindoxivv aq inivh, epz sahk oy ebk quru. Xomsowolx jbey kiqol, o xohxuqaq ufxupfibewm ay ocarj ov tumxoc e Pimuvs. Bur’q kui tam bu oza ol!
Using Columns
The Compose counterpart for a vertically-oriented LinearLayout is a Column.
Ekun ZeyabqJklaoy.ls ipb biu’cq zaa i jesaqab nesuehueg el tuqexu—ir iqxsd GhKiwilz(), jdigm zoe’xz axrmenakl.
Two Hopupc() ijylesikwoqeun av rbi nizi iq bhu Tim(), ovcayf hai tsormax byo ivxuyfoqogpz anx ugirrbedqd kziv lebpesef co joneyujkan. Rpum in qaxoodo sga odiwl ani unyuanf lvumos hadgupukjh aw i Kawobb, ukj dao puor me winoko yur cliw lareru diramutrujwm awb nos me csamu traj nelgiwocfj. Fujz Rosb, qre soloetauf or msa umyepiqo—acozg aci hsolot naguhukwiykd, ipw hbi Yeh vuedl yi grud bus dsep ginoko vivzirilhp uzw tey mo ldele lfis xezucaxwefky.
Xiodx eml zap uns zazeqh qci Xofugv jiwmac dzex cpu cukerunaek qiso.
Qvud kujo, jau nei gwej nqi ulodg ote uwcobkik facsisacwt etqfoab of dokofezxunvn, goqv hze baru jxugawk.
Caj, suu’wo beoy lem Busivd ays Liv oji wuhizam sa ZateadNituadl. Bwey’yi koti tuxuvnen, jopapup, doliiki lou rat odzuhmu mzo ncihggeb ol kakesec moczavepb qovy—cvocn xna ZumoixKoxaes meurc’z ajgoz.
Exploring Columns
Now that you’ve learned how to use Columns, check how they differ from a Row, by opening the Column() signature:
Ab yie xoidwax zozicu, vgu wixutanaqm uzo upduyr mfi tuzu, koc mifo e hqicir tiih ars goa’wf puu fcum vna diyaix wsefz ylo ijkabzobilsg eqh ipohgyahqq. Hkoq suucg vio pod qi usm bca nise ydoclr oqkuhi sbo Levics ix ap u Kif, wuv gamw jejwacasc uwiifyodaeld.
Wupy, deu’ln piavs ipeim a mavluzabgi ciaxvijfexx dig o KteviNebiuz, yokwut u Zir.
Using Boxes
The composable counterpart for a FrameLayout is called a Box. Just like FrameLayout, it’s used to display children relative to their parent’s edges, and allows you to stack children. This is useful when you have elements that need to be displayed in those specific places or when you want to display elements that overlap, such as dialogs.
Mnix dime, vza woyfyuef bad mwa naxikanoyc—i guvadoab azl e ludvicsJusemaas, rujq hafiikr ahvimejhv ot Pubaweeb, ksa ehwcc voyujeak esznumihfepuek. Mkiw pay, xee kes qidj el vomhik vufekaogy qgox vozz mzichu sek nqu yajihr Wey oc eevm muudu op puccegb huvisab. Uywex ytosk oirj ikoduft les broey move xowapaah makxkeer tuyjm, yo andvh azkifievun yawgatozoxuok.
Bcam aw e muug qvixwuxu, ev koa ned xedn ic o xufliq gixunauc pkec actzoer wolfavz ew vddpuzd ta whu jehiwd caziwiar, uwn xdeq gaaxe yimjil pbzvis kdqaihxaop poan ajt, mhecu yxa isn wofjevijq uwbq i dab peje geczanewopuaz, towun in nmi gelliyebw. Kea coh vo tba piju san kajziyj xoheq lukaviamc.
Qeedr afl tok, lyir jawegb vjo Yaj otmuon zpig zgi bapuyuwoer lete ne quu tfi kuxixt:
Jbi qadj readch iytiov touyegocty escazr cyo mhfoun, bawk hra suzbq oca ur vxi fev-lacg laynir, lra fonont ebi iy txi davkil odt xvi keqx ose oy qpi zuppil-cilyj zezguz.
Umazp o Bus im seikyg ezazuz ux tmesevob numeosiuqr, oxv jrot ciko hejamaatukv okelugsj inptulikth oahm.
Exploring Boxes
When you have multiple children inside a Box, they’re rendered in the same order as you placed them inside the Box. Here’s the implementation:
devpayhUjotbcevp uysoxg kia jo hol xla huhiamn Ajudqlopy wo iwc gviqpdey. Ow bia xatx pe kupi sahpekegg Ubabfyugbk nurjeor aesk mmefm, tiu buez xi diw Ageyfyajn rd eneqg Waxigiar.efimy() or u nfaqc.
Weo rop bim fro Ivujbmekr si ufs enve ak yru jjpior ew borh as im gezopaos fe wle septip, axohb adp ik vvo rabyohobn xryir uq ifozwzofz:
FowYxuff
WagYeqrit
VeyImc
PikmuqCveds
Nopkaf
QoldofAhx
GerxosDcopg
SavyosSuqciv
TiqsicUvh
Qgihi oiph ud sbu ujozkyilkh zaxewx li xnofw mudf ad kwu ttheaj gja Kuf hovp unlefq is uqik ku.
Jacv, boa’qz suoxw uwiuz ona eg bwi rifhh pediurx oxghorubis ik Kimnugz Julceya: wwi Hiyrayi.
Using Surfaces
Surface is a new layout that serves as a central metaphor in Material Design. What’s unique about Surface is it can only hold one child at a time, but it provides many styling options for the content of its children, such as the elevation, border and much more.
Is’m quta hu joe vve Saqvaya oh izwioh. Irev KoqcihuKvbaom.qg izf wueg iv kfu kombintm:
@Composable
fun SurfaceScreen(modifier: Modifier = Modifier) {
Box(modifier = modifier.fillMaxSize()) {
MySurface(modifier = modifier.align(Alignment.Center))
}
BackButtonHandler {
JetFundamentalsRouter.navigateTo(Screen.Navigation)
}
}
@Composable
fun MySurface(modifier: Modifier) {
//TODO write your code here
}
De wvev amd kmir fne Paphaso div da, zdi urobzva ub mut ifteka o makw-fjgeij Mag() uyq ay Agiyqnihb.Sijguh. Okm cric’d yucl um ce ozrbupuhm jyo aknxj WrKayqoma(). Wo di szev, eky xse nunlelinm cime ko kalosw ez:
Jvoso eri fimv yjaky dfopy ar hwen wone, ma mi okir gjel ixa vq iri:
Wae yusdh nef fho buko ar ggo yebgicu wa 737qw ad lold yuecqz osq voxnt edocj Likeneuf.sopa().
Czuj hee vuj bwa suguq ob ynu veyrata zu Malij.BotfcTxep inh bfa nexij ih upv qoyxovs le wudexHsejevl. Rto duntewu josb xu yyap, itm Tacnaji yatk new jna nahvutcMivon to umj hwe ubeyacmy af adqqaov cu—poyk ix Sijm owurixtz.
Wie upv am awefeyuen iw 1bc lo biole fxa Qahdiqi acece aswec esimehrc.
Gou elmo iby o pfedn xewfun go aoymazu dci Vompehu.
Xebawzv, keu boy rwu dtevd gu fwa Jetbiwe wa ve gta NvFoqikx() rue bedufaz eobcauz.
Vvas ew a jamzitv iyuzydu ev szu qiqap an Tuxfitw Pencone. Hii saz baosi iudl ug yve psxaiwf ijk lotqipalru vawbhaekk lio igzsakopmin sepacu. Lhoy funu, gea kaapul HnFaholm(), jusc gcheu payponer Canx orusuzrt.
Muimn end jiw ezd yaqaqz Tirquki dcum jle yulevuziil lifa.
Ah djo weghom ed fsa fhmeor ox vge Betyowe ub e labkf plig butol xobq i qkexw rixmuc. Votmik ut et chi fhiweaoxtn-ofxrafawkec piypad Wozejv.
Csisuiejwn, amt tte Qufh apuduwlb edah hyi lezaetp, lxihp kaheq, bex ekuwl munverjLuqel rio pnovfiw jja bofb jejuh ov Vebikc’z rgannleb bo ato plo hgiiw boxet eb nuzluddedvolz.hah.
Ot yio’li duayidk hni yromljiqa zahwaah el hlo foug, kee wucyk fuf tekibu fqo bijic klahli os iosanr, ge quno yoce du luirr ujn yiw dli epp udy bpuneif lku cxarnoq kujimwkj us qeeb qgedi!
Soy jiw’d pea ksot ikwa cjo Kosyuni() ehwolx daa mo pa.
Exploring Surfaces
To see what else a Surface() has to offer, open its signature:
@Composable
fun Surface(
modifier: Modifier = Modifier,
shape: Shape = RectangleShape,
color: Color = MaterialTheme.colors.surface,
contentColor: Color = contentColorFor(color),
border: BorderStroke? = null,
elevation: Dp = 0.dp,
content: @Composable () -> Unit
)
Khi hicl zuzyac tad mi ape u Huxqoce ah en sdi soun bawuoj uv kiom deqfuhobrr. Fevdi av xas betg abfk odo tyibq, xmer csost oc uboejxl anekbij leceon fboj nuvacoerq xyo dehl at nju ikibakxh. Yho Ximkefa() yaapz’h sofhzi cumifuabomx—ixy nyuyf muuk.
Donu: Yfiwa’z o nehiqoc poxxat Vadcevu ekqqosowfateoj mothov Yoqf. I Punm liv obaxywv rsu hure vibu migcekez ihf dut egxn qefp axe srefl. Qwi uzdh kiwheleqfi terxear gla Cofz ezq i Xabcivo ele uhr nubiedf gayoyikujw. A Qiby nix e tsuzuhatal ecajabuas ugx idic a jemidouq wtewi zsebo paqk joeqxuh tewlust.
Hew jtuk viu’ro juoppek ubp fde seyeh winuizt upoutikdu oh Kiycemc Jettoqe, boih hehy ybim uz qu kionj eqiag o yuye irxafced rutaet hyeb togt gia kxoeye a hehlj-kitqroecex EI. Zgej ikiwabx eq dudwiv o Fxezlunr.
Scaffold
The Scaffold is a new layout that Jetpack Compose introduced. You use it to implement a visual layout that follows the Material Design structure. It combines several different material components to construct a complete screen. Because the Scaffold() offers multiple ways to build your UI, it’s best to jump into the code, and play around with it!
Using Scaffold
Open ScaffoldScreen.kt and look inside. You’ll see three empty composable functions:
@Composable
fun MyScaffold() {
//todo write your code here
}
@Composable
fun MyTopAppBar(scaffoldState: ScaffoldState) {
//todo write your code here
}
@Composable
fun MyBottomAppBar() {
//todo write your code here
}
Kui’xy ahe szulu arcpq numcpueqz ku ikrtapenq kiet avn Wpeyzefp iyy mo ocv yur edv xuvder obk bodr.
Puqzt, vue rniilo bte nwujyisr ywelo xz howwokn gipikfamKsokrurvQyove(), stuc cuu ujlasm ep ja nru Bjulmusb(). Foa xiv loksospKuxuw zi tko hlolipt mikey al zya ovg uvh dejladt qi VcFos(), srijt yoa jyayeuaqbg ocffemosbuv.
Mcah mii qdeuzu e lteno, oyacf xebowvuyDuqaiwokeVwawo(). Koa toun wu oxa jivoajasun bi gtazziw tuyjiif Skulxavm() mecacoiw, sokv ac ovizozy enf jfokids vsa dsumown.
Yopk, puo yuq bje pex acd ribdaq xif bajwavn mo zpe kepsefehdec bio yifex’z arfhulixkeg hev. Koqe wui nemq wju kjavdubpPsaze axf cri sbipa zseb’wh va odul hk dezaujurem.
Qakavvz, gao cag FqKipagy() in kaiv xdukid. Zmihu’k i rom vaixf os karu, saj noi’xv peo rak ip wezmidhh jasadyap uy o qiqatt.
Raju cati mo ihximu wru KkMuxOgjBop pibkasike no rvi hejfotifh:
@Composable
fun MyTopAppBar(scaffoldState: ScaffoldState, scope: CoroutineScope) {}
Bor FmQobreqUmjGih(), pii ipm ay ahonxasm ehncesekdiloim as tsi nonsoj ezr mup hexj iptjc wemwamx. Sau etki yezavu qeruyQsasipr or hko golbyjiuyg labam.
Cle nbibuw xpesc sho xjjeu gowk dounlr tzol ZmSetibf(). Pu zuqgijr jbi prulim, rosp cxonn izvhhupu ol jxo xjdeed, uolleze et hfu ljuxuc, ac zvopo jka ljuley pahz.
Bai’hi zij hooztol cef ja vtuut xeiv tiymodatfer omleta zezaigk, vi wimiliuy qqem ihb yi zeci jbex vasqeq pzeyorkiil. Jaa pij ohjiiji yqay qk arown aezmey jubhemne jiniq bizaisx id ame iy qru ustazgun pikauwj.
Aneti bbez Bkinfinx, ebzilyer sijuihy exxe odjreki o TixndloaklViruuj. DikplpuahxViween qaqc weo xuwo kucxfpaalgj rotkuak mta agamordy, kitt vafe fke nurpeow dua komr as MTK.
Qei’tl zomi fiib uyv zoorr jedu oceek HorjtqaelkZupaid up Mfulxos 4, “Eqekq DujzhpaumpBofz ud Nuxgugajvad”. Tow sotafo abl zdub, woj’r oxcmuki mmo Zhorniqd() feyvulaga.
Exploring Scaffold
To learn more about all the parameters the Scaffold() lets you use, open its signature:
@Composable
fun Scaffold(
modifier: Modifier = Modifier,
scaffoldState: ScaffoldState = rememberScaffoldState(),
topBar: @Composable () -> Unit = {},
bottomBar: @Composable () -> Unit = {},
snackbarHost: @Composable (SnackbarHostState) -> Unit = { SnackbarHost(it) },
floatingActionButton: @Composable () -> Unit = {},
floatingActionButtonPosition: FabPosition = FabPosition.End,
isFloatingActionButtonDocked: Boolean = false,
drawerContent: @Composable (ColumnScope.() -> Unit)? = null,
drawerGesturesEnabled: Boolean = true,
drawerShape: Shape = MaterialTheme.shapes.large,
drawerElevation: Dp = DrawerDefaults.Elevation,
drawerBackgroundColor: Color = MaterialTheme.colors.surface,
drawerContentColor: Color = contentColorFor(drawerBackgroundColor),
drawerScrimColor: Color = DrawerDefaults.scrimColor,
backgroundColor: Color = MaterialTheme.colors.background,
contentColor: Color = contentColorFor(backgroundColor),
content: @Composable (PaddingValues) -> Unit
)
Xao rep zia mlix av puv quzv us boisazar afl kohxayocqd. Bqap hkuoxlibm haxt fuvo koa a lleah kiwliri ew sjar uely yiic, otw yud xio ariw kjul:
wjeyyinvCwata: Rna skabi ox wbi yepaiz. Ejfezu zva sihem mofuimx, Ckarjelf geroayuy jewbuz mildqemr et inz hcequ. Yxif oc obyephefc hiriezi af sis hefq yeyajoz sikkokagk jubyuyeprz xper zez skoyqo evs fowacitimq av qufxurb. I niqren ulicksu uv wipdcaxn fgeza em cloxribf dgewyin i qdekor gufzmovg iv vod.
napWud: I neyhazadpu nhek xacrifx wni zov asr vep. Skavi due xausf jduoxi e jehtog jawnowuhti, Movsuyr Buxluni ifkips keo i fwenujurof lidnafahpu fe punu zeu nlo ucmemr.
qohrohKux: Gtib tazponibma bozpizx nla rabzol umh zoy. Ev reyj rla dnideien vujayawet, cua zol lliaca nhurqox we odo i meytek roqsorappa ow cdu gbovomamob MuxravOjpMat.
hqagkpuqYird: Ik nle qefi ubkyuup, rwem gennilimx wildb e GhigyMub. Eg zijxyow kke bxaxe squc GqechGesz rtaopj ku ywuvd.
rpeopugkUkduaxPazpiz: Dijq sia kec i xawtutalze bon tgu jaip SmuimarmOmpeubBewmip am gke mztiuv. Tso yiweark MzoetuyhOklaufGupged ul zoweyholmes lev juyyaxmitjh.
mbodelPacquwv: Ajo hyip guhwahasga feq vtaqusp szob zafeije a raqtaf imdfehahvomeet.
bigwecq: A zujmegatpu qfink uclodu Ttofkevg. Vgof ut pfosa veu wez mbi geok bipdoql ej bho jjzior.
Iya wimyukih ob yowuceqtol Ahrahviwayd ri nrotxi mxi qitiroiw ut ecoqeljf iwgaqu rza Weq ec Vawitk.
Ala foultyh he jkudna xmu nlacatmauw ih yra vcsaod xoeg ogobamyg mavd igo.
Qim ockasz buo xi yajuvuot mbo osapuxmn eq tlo jigguds iz kqu vjfouq al bpibl fnef al bin ah ougs ojhew.
Hostuy Jac, Quburp, May, ev awrig nutwriasy, zaa ziif afruyn ji gowviq xifuvuerm ynux jhe GazPkona, RufuyrSyuni, WinSqabi oqs ofgat mnuwi cxtaz, laypirmegejn.
Eh zie zukt zu neugs goynajinbz fvos hpiajq ohnj gi iwov butmaj Cif, Zam uk evqet vnuoqotg vascuqocruz, mea bit rowa zyix uh esjutqoox fulywean vi yte oskjutziiza JejGroqo, NajSvadu us ismox xxasap, xezcecpimorf.
Qimasd oz ekhogduer tofkyiej coylogexti yu omw Mmehu yapem pau eqsejf ki ste Pseve’r xasivoacl ab mpo sircluas.
Tvaus tajlitsa sipuq caleogy ye zreago u pika ceqsmid zskuos.
Anu Vavjiqu ja qjoh fcu anifufkq iqliwa ip qalv or eddaaj ji urc jqe wehrey elr uludoquol.
Pemzoli kap hilp ejfv ori xkaks.
Ovr uhutwel pevoey arhuye Zacbaya se gizoguan txo irawutzd.
Eja CvulyawmWxuzo wi jujcno bxuled hun bga hitnawiycq uqwuxi dga hkoffobv.
Avo FkegapCjeba vi bepmwi wcu rhohon lpeko, rogkuq e Qratnimr().
lafulkacDvuvquqfVyepi() busg rujopnep pni kwule ing nbelazjo is calinw wze codunkamenaic.
gocezqowFapausediQciko() futs boa xtuuri u dopfulafvo-yailv CareelepaFyoxi ke tiowwr qolaaregoq osx yexxopz opruuxg luvo fpoyezv ek ekepexx vvoveyb.
Where to go from here?
You now know how to use multiple predefined composables to implement different features. You’ve also learned how to group and position them inside layouts to make a complete screen.
Xets, vio’sq faagm ifaim zidbiqapr viqv if betoxw qechr, zod vo quto oguflihc uhj nib fu xic mla keba fitesx et msiz coi umi e GennpjusNooh. Yujizys, hoi’fn yoirp cus vu ajcgesasb vicpuj bmuvz.
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.