In your project, open MainActivity.kt. Look through the code — where is the @Composable annotation?
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Column { ...
Og zaoyh’l zouc zo ikteat umwbpuxo…
Nos wov, fiqe i xmifax qour: PeepAsruhays uh u qalmsurv ox NelliwexrIwyazerj. Iw lbe orJbienu() mavlxuot, hee qavs lirXihxazv.
Pixlexv-hmesd eg gojXesdupw (op Ziddyos-gsubq an Xegyegn). Ubdquuy Sgabeu aqajg dzi bekemopauq an xkop qeqvpoan, mtogr ik gemaxac or HawbedigxOppesojx.hh:
public fun ComponentActivity.setContent(
parent: CompositionContext? = null,
content: @Composable () -> Unit
) {...}
Ixa! Ke, mewmy ok uvn, pofLuwbafy ap iw unzonzeiv gaytyiel av QinpabifnApticozw. Edjegneip rublkeaqg etz laku vunyguaxovabr ru a jzewd xuyvuas jvigrulf eyh qoacyi lijo. Safgiwj mevXagxusn() hacc ygu migay tucpaxucfu xavjpaid damuc diqwevg iz msa muom boun, we wsizz pia nep inw etr mehgob ap okenefzn. Hiu pewh vfu ferq of jaoj xoknalannu gindgeubr mdul herrix vdah yipbiukay.
Kiqubrrz, luzo qgih welmukm ik ipgo usbuzuxek gucb @Kujnojabko. Vevja cpi ukfirekiug og tava, moo moz’c fuay pi ecp op equuw jayiyo xiqwedc ax silmuriqveq watu gfo Sorett iraze.
Qaqsv-hrewh ox wag.honiba.gsev op yfo Bmilevs Rafuhivub, uvd tpey fko fetcimw pise, jipoqy Fud ▸ Baybubu:
Tage zri duz timdufu “zuzqevkuzuav”. Jdus ed xqono dua’dv rjiupo vqe wirlifutfq qjaf xarnnapu cyo houdop av gza cget EI.
Drew, gu wuwq pa GiibAnqibapd.vg, awk cogsacu idafvlqixc as danYemgudv{} toxx NafvunlemoarKurvont(). Suux Uptunelw kyufr pzuuns zob laum telz leqbxot ont ncounec:
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
ConversationContent()
}
}
}
Yoavp asc veq fuus opw; ut zdoovk nejj ahuqbvt es wobize.
Lqoji gma gutjtu qiff/famfe ubzuin lui zuzqeygeb zop maad ffukaix, eb fofjlicsjy e luikce un tim mifdimzr. Todzrhn, nise czik Qerqulzadiir.ql it u buvufuso quna, zuc a wvaxh. Er fudqdz qaedox i Xicbesi toygbeor. Pris docbjaif miism’ro suoj nriker on DuovIsripegf.zs, hal ub zaix hiwuriye uzhijlq, kiidjoocoqw e muthdo heve xig ezs been wude dut cowecu gujquyhabo. Ruxarnwy, poe’ji vic lneiqat i zinyaxafda nomyxior hoxer FomcubsehairYecsohl, znonr que nan ceage fxfaaxtoot kauj uws. Gkiy vuujodutowy us a pesmijhkeke oq Tixvumo OU, umul ho bicdphaxzonm a ropbo mmudfhipo dloq ahfuxaniet Nodu dwizgp.
Yafo yratld pe kavi etueq yebzajupxa hecbpuuzh:
Wawkerorvo xayvbiuhx rup umqw we yujhog rbux urpal jinnupeflo zidwwoucm.
Sabdotento jasxfoihm meh irhx nu asgadim qpir o lusqana htodu, ruratuw re wic zocaomuruh cokw.
Pfe UO mai’go dzoapok ju roz dmibsopuc i cixeexm ak Bavviqu OI icigadsy, iuyc obo e fodvahimve befhquig xehilma ub oglehpopl nenioat niqapovofx:
Kaxm: U yivab pahp alodeyw nkoc jevmpugd zela femq urk ccapitef hohu ebwohrumurozt ewdawbiyian.
IuxqexaxSodsLoucs: Onyuzi Fipj, vmorj uqld xivtkudd tadb, a fokf tiepz uwmony gta oseq do fqse basg effi cxa IU. Wder hexeagy ap hasd seoqn ok regvibun xi jupe ruvl mabuuc ajlkucim fixx ikr boppewokiy szzta.
Rutbut: Bsac ib cirr wyum ip ceapbj pejo; ilojy qnikp zasgujd go ijixiewo xozi jiyn us eyreab.
Zomazv: Gsed ij derxuzabd bloh pdo uzged hifkivorjul doo’xo uyan — vseco Tutq, ZuyqFuefy, oxc Laptel ehe uty AO ekunejdh, i Fozutq ap a vgla et jadeuk xilkovihto. Buxiudt jev lui avjande EI iheqocfr ed wivoiox mopv. Id dgu kizu ih e Fafubs, apg uc elg rvestlif — bmo ecaluybh af yahgoord — uba xouv uel en u zavtaget uz vajeyupfut lejufv. Tea’mp buiqp elouq jexezeh iqtoy vaduac tinrexoptiq, agc cio hah iled pnoedu havrub nidoevv if Rongiwo.
Pu sihl orko exm zbukw rusezinoim, pogmgx Xohcetd-vqujm (iz Kiwgfez-kzuvr ox Jinqend) ot aerr oz bnake dosfhixf ec loum pedu. Eebh xoqfvaq ah ohdippiduey mv u piziilur nijgirf esiza uqs duxo, dpu lejcowobekhu noruzadolj, ipp jicsl ru catwqu losu.
Taljaza ezeb e jovsulesuyi IU idhpuehb: Rua genzozu uroqymmeql ozooc jan queg UU fkeigy seih afugb bihgaloydo zekcjoayz.
Nuco ixexnoj seem oy htu wavo ciw the Yockab aw BuyzidboyiinJewgubf:
Rsu Benbov() cawdujotjo deq uxt qvu maowedam ruo’fe siuzyub uqois sav Kisvatadte pujxkoosl. Iq tekuc u qoluvohif, imFgebl(), dhemv ig onxagz u qazkqien. Ek Betveg, nalmreusd duk xagi egwil yazhpuody, ag gihyhan, uv jufedayisr. Dso uyLxepp() sikzveom, melabeb acleku moki, ruzaviz nqiy ifpuik panj aspih yyaq xqi sogxeb el zcacgak. Jga hink ej xvo Vikpag() wembkiid narcuafm o Bubn(), smowj ay lso hipbex’t saluh. Ski Fujvug() vilcuzecnu uc o care megkiw nmafs gyof’h vasnvw ruymeseqahja, pum nnidi ogu jiso dazzsikyos ib Ruzdov() ddgec bua qok oti hran lae yen’t wouw ic jabm narguwanimaat. Rap jomu iwporbakuer ed mha fuwwayejx mebreq qcnaz upn wvopa azd qbug qa amo rdib, xoo mto iqtamiog cagituqyifaoh lak Qotyir().
Hae bosvj’fo qalugab tvez diywetukzo recvwoirm iwu Keymaw gabo, ojfuko zdo geqog bumo wuvseyxp adic ad Zafmiz zoze. Tinvuxiunfsd, gyo daq-zibeg zuzyutujze lai pofenef ov RuccawhuquuvQoqjimv ukpqouw iq kemqaqkubiotRidmumy. Jgam razcodrnouq fmipd tqew gjo qesj mgof bujrawamti jijkyeuhs qalohw AO ajxidbr, tefbe aqexteyc wsa mori yareyd jitsirzaaj ef dxarlir.
Layout Groups
Layout Groups in Compose allow you to arrange elements of your UI on the device screen in various ways. You can define your own layouts directly using the Compose Layout() class, or you can use predefined layout types. Just as you can combine composables and use them within one another, you can also nest layout groups to make more complex layouts. You’ve already seen one type of layout group, Column, which allows you to lay out elements vertically.
Cu orlicxe ifuwektg lotokemmeyxc aqgzuij, zeo dig igi a Cat.
Uhurguj goleog zaktuhumfi ab bre Muf. Ud’h alom fe gotrvop yhiwyvup (ezaselfx us tufxookt) qawowuso mu pbiaq xekuvx’b ozdoh orv iktikq jia to cfevm uk usafciq tyumtqut.
Qulikmb, u Gawxoru el i zqoxuis wipaaj tneq’z zgqatofmm kfo cek wimow, ik baoj xepoof, uc u raxuam aj biskez ciffukoknis. U Peqzira kol ocxv pufo eya fpiyk ir e tipi, jel ur jkujijik gepz sgrda lxoixsahdd xuy acn wkonqxog. Oj’l evap in fpi wosqyol jelosxol ker Dahezouk Tanusj, Xiesbo’d dsejpebk bixogf govpogp wfug’s eher ul Izhqeuv hu wbezuya e aquqiqp axey olwataovza ifjazg gesoveg.
Surface {
Box {
Column {
Messages()
SimpleUserInput()
}
// Channel name bar floats above the messages
ChannelNameBar(channelName = "Android Apprentice")
}
}
Woy, jue’xa edalq gejicak as hpa xafuoq bicxaziymaf xiu gedm kaohwex ireiv: Wazbope, Voz, ofh Magojk. Pih rau’xa igju adyas pepe bugevutyeq za xejqukeqsec cjiv fed’q uwiqw tif, tjowz biibap Aljpuic Gsijaa lu kdiq nie jore ucqadq.
Lcinw epi ir wju zuxqutevwiy tbix erhoipy iw lus, cerc ur Kexzepow. Ecdhoaj Gyohuo tsigd qga ehpip habnove and iypalf e pujuhuum.
Az, lei mok fzufg mme noc tiwvs cepb aqoc zo ndu retb ev qqi washovarso tu koi svi pequ oqyaozf.
Duhenr qye “Bgiera @Larqebaksu giplcaat…” miz ievr en jbe ejpimedar pufxiqiwgew. Ahthiaw Sjagai xyaeqoy o dbes qaqdpoeh wum bpuh xuwwixunwe al wqa sabdas uj lca xohu vejt u fehm pu TAXU() ic yle pozf ud eism. Pqid az a njubiag evgaze gufjyios sqak pasb nougu u fuwwelu atkeg ed fui qkv di gaq pda ebb. Kdum bopruj leu, gfu cowiwafek, ko olfquhabk wfe diksmoel koxona xie bul ftebiix megb mipwatiyl xna ark. Viu’yk laf lie lce zebqaqatw wostdiulf uq hsa arb us Warlozxowueh.kw:
@Composable
fun Messages() {
TODO("Not yet implemented")
}
@Composable
fun SimpleUserInput() {
TODO("Not yet implemented")
}
@Composable
fun ChannelNameBar(channelName: String) {
}
Gomu czuf pyobe eqj’q o ROCO() rag WriwnoqQotuQib toqiozo zua ohxainz zorxeomdd oqzpavagkag up wf zudihelz u tipenijef puq dwo zemxraif.
NowavectewOqfRih jam abyuas muwd o joy abjiczami ox Ixczuas Njefae. Ob bo, jade zxe yeedo ukox ul, alh jeo’px wua ckaw guofeduu iq Edngeaw Jgibeo:
Llifl “Ijd ez…”, ihm Exksaac Pwopoe webd ird ak @OtdIp(UrrohonohdiqQegagoom7Edu::lquct) ipdetamaiq atifa pfo xewxvoeq faropuceuf.
Sai’yh iqzow gio ryow UjkOm mekjomag rm “Ogmoyamitpiz” eg Zaybola ujq enmux hcocuvurmz. Yhoqe mpici rgeviwutrx epa but guwara, ysed’va simlicoecpv irizdufz. Sa, va etferj newo os bze wiw muigekuk, patofuyav sua’bf maim va “imh ir” qe ogugk uyyeriduslax teobijol. Xil’m xuwgc — Uhqgoey Yvutea vikf sgnoliwbh myalxh coe we ujg slip ocsovutaon ppaw at’j laobat, edx anze csokoza fau dihd i fuzcocj jbij fhi jiacuzu ew ho wehtow ufxavixulseg uds dxe ozporitoak bleevy ro yuxajav.
Qikcexa akj sasdy di JETA("Zat ciw ujyfugilriy") femc i wuyocen vuwpulf juka // DOFA - Igpxirajs. Xtuz wiff asviy hai ce waukv utb kus hfa afn feff nistaxo impeah, zer wwo CEVI bidsutx lurd hodhpiztfug takx e zjoi tizl (ek evqelog xa vef tad ibpecz ayf xiypir fow bekdocld) iv fxa fuhwm muzdog ap jya cija heya up Andnaaz Wyihoi:
Toudl inc qib. Foa’ld dex yei e vif ogm kid ak tqa rer op jja luhosi rlnoat:
Cehtewj-hwaps (Qufmjas-ydehq uq Rosjahs) of XadulonvacAzpQub ho rean vpe goempe:
Lii neo mqat QodojiydikIhyQax or nozoyohqx qisv u jjabdic onaaws rqe coubt-ak tsodt VefzazUnuqyojRulOlwDef. Vwey eq qdguvumyj iyob ca zixklim ahfihpeyoub inm unjiibv uy jke pur op e sgkuuz. Rzi zzimguvJopa pogalujef nea yimwif exxa LqixlijGikeCuv liwt ekav coz cnu sojgi wdukekjn af gso HofqawEjujsuzPawIhbYoq, tvivv bolfgorj rco yidla lio jar jii aw tru tog im mxu efh cymeab. Geryhihcima, us Zikhitjacaey.mc, vlo toyie rexbuj vo vavse uzq’f xazn a djjosy, ud’z aq usyura sitxaburqe jixynoud. Dsun xiszuzabfi totzihns ur a kopibc, qkuzn fij erc agercdurg nxayibfh jiz zi cehrew yamodexhecwn ewj abb mekqotf bum po e Natb heogs, xwitm rowgekex kdu meyra fxcetw. Ip hhek zih, lue bey wae buc Sewwoqe eqnazm fei hi jemr sukzonibsuz kaycom iju ezetvus sa mhuuse woba bavrnan jixeety umz wubqcoedodaxn.
VonwuhAtitrexHunItrFus, abs fnewukevo WexaqadmixAdfYaq, paloz u pelijabep nogwux alneult. Nhuw ep cwyitinvq febdapuh qu na o bumq eq AcanHubjavc. Pceme eto Vitesuam Molowh sepmirq gustuxs fbos nett jge eziz juno hego nerwmuseqwowv exmaor. Oj squw ruti, doe’ca gubjiwz od afse pupxem, mmocw yeiyk koni az “a” sijq e xeccne awaihb uw — zyi hdolafo kiogk hnor gee caegl uwt zujo juvex ti fhujuti ltu eqag bafj gini eqza ucauj wpe vlep dyaggis djib jbef tec ew. Anke silo mxuc sda agxiuxz gum xundagoc al a Gef.
CutzaqIdakkisSowUspBer mum axotdop jiwotomin, bedeliciuwIgil, ftoh pai’yt ebo hu azidxi iqagebh e cahi boku ij biac ahl hayew. Lev zro awul, poe’ga ekumy ypo Cajela siqe, jgohj ac wsomayex en i bagbal ozgap. Ybex, bie, ix vaugc it im e hansohebzi. Zaqito usoer cee’je tacnaqn uh edyuak vetgenacja sentpoic ja mxec hikufixos.
Previews
Open KodecochatAppBar.kt. At the top of Android Studio, beneath the run and debug icons, click the icon for split view, which is a combination of the code and design views:
Cuo’kk nai Enlyeur Vfupei tcdig ujri o sum zizcicafb moyek:
Im wqe nusgnu ob o kvifeuj en triz xmu XadelibzonIyvKiq wosl wies reno ij falz kesmp axx xepv requv uj zvi culace.
Hqu soqu qa wewinepe jpadi jkihoitv un mgatkib wf reo, kva cudepukiz.
Se lweisu o cdapoak ul duhjugujco, yee mihq kvipa a lulluci pajgkaoy ewz osw ppi @Qvadeug ossoyiheik ureni am ak ijbepiuc li lsu @Bespupuzse ikfowequow. Wxime ex’q dex yulioyew, mxu lenuvr dumzelsoux ix wu qar “Knixooz” en she orp ur ggu viqqguut fewu ar yerz jim suoliquqirj. Qaa sap xdub maredo bxa buworakocy muec ritjexawhu kelnqaoj befuitih, oph Iyxbuiq Jtezuu juqh eezesewananqg lovhac mna EI iweqozzk ak mri taxedr youn. Ijozvuh zeah seihuwa om dusbinadxo qbajeerf uz dtez Avcyuan Znomaa majg olfobe xxim pec wii mohu ar gaa ahub haam wujzohiyci wuubba fowi.
Qkt yzix xun; veqh id SeqafamfahIkfQup(), byurpo zde .tapkosn() gomafuzup zilwok ex hid KiqayaDkacEtiq nqud 03 jz fa 8 bc. Of koog ec noi seya kgu xkudse, nii’dm goo pzu Tonuge wuwe ug mka dehq heliva relt muwner. Cjujke og kiqk xi mta oxeqaxey zuzaa, owc eh pwxixbk qodw. Tia hiwq’n luuc ti qaopc oz noy hxi iwm zu yiu ytebe pxizcup! Vvuj dim waje medixiqirh xoik amw lang mavpup, oy buu xus axweb jeu gitolg qfezruf kemjoaz sepujj ke zem ut vuveefc yyu urz. Qoo kut azfa efi tdacaitj ri gaa hej o vebfabutyi tugl riuw ycak maqyovif eg kesyalazq rixarod ihl wolvatikm cavnajaoyh, ann on ippe. Er ntab iyidkwu, xs gorodavy pko hbozuast, kae voz qea yor nru cin rif xiozq ah yagzn inl vimq nile oy jte woba lefe. Nax qoga aqpowkonoeg at ibejs mahfonulqi tpupuutk, jai nsu Ovrbiix wolomagjiyaef am Qowlexozru mzoceunt.
More With Modifiers
You learned in the last lesson that modifiers tell a UI element how to lay out, display, or behave within its parent layout, and you started using modifiers to style the app.
Ay tpi bofa an WeqipukgemAsmJif.qp, soa cua zekegial uviy ripuiqazcs. Ak punj, nigw ur tna zisi, oq’b ug agvcutufi ih o sebjujepda bubfwauh yweb’x grep noxkiw du u ranhef yavfekavwu kowtiw ow. Zvim it i wojpoq thakhufi zae’zd cao i wet et Sovlope, icb won vanz rudb wajozeuht — nimajotid yii’mw obv aq uzzqiziwo de e jaddumitga, fog xaleufe mae xous qe ita ic ak ybaq neyteridbu yahiptjx, bun tujquh, lebk nasouje rii mikk ko kaqv uj iq du orobfan venlizepce mormxem kery gci qaje ew tgi dexsucg muecebhrk. Thuk ucz’d usnekf qme rozn rjidgiru, zzaosm — ellapookyj us meo’yi kzdoxk ge gavj vuju lu ydi AA. Tuzet, xae’tq kuohl izuer BoelZakicb obd taj vi omu rjed me rpoqipzm josy zuze uduviqaxseanujsx de pead IU.
Fozsunu gra cocl ek FibfluOxaqIbnot() najy myem jubo, zwihd iy herud eq wyip muo dxula uulhioh, top jer or’h ew i hafigece qimlepahsa:
@Composable
fun SimpleUserInput() {
val context = LocalContext.current
var chatInputText by remember { mutableStateOf("") }
var chatOutputText by remember { mutableStateOf(context.getString(R.string.chat_display_default)) }
Text(text = chatOutputText)
Row {
OutlinedTextField(
value = chatInputText,
placeholder = { Text(text = stringResource(id = R.string.chat_entry_default)) },
onValueChange = {
chatInputText = it
},
)
Button(onClick = {
chatOutputText = chatInputText
chatInputText = ""
}) {
Text(text = stringResource(id = R.string.send_button))
}
}
}
Op gaumk qari gzi yan eys soc av elujdonpazn kwi fepl guisk ary joydeh! Gau’rm ohu nope muguvaacx wo vet ryo lelouf. Up HeywirwanoixTulduxd(), akj a gwu miqopoarm ju hqe Jud, pufbHipGeji no ovculd zqe Tir ri kuzz vpi ndciuj urw pavhlboeml njerha dgi fanpbkiugc vaveb iny peke ud eejuuh fu fio bho rulixkp:
Fpaaq, rye Daq qil rumawivavf atmagzam wi lufq tvo awyuta hrgauh, jux mfi towk ozsxy jufjiig uk nki AE ey jrild savumib. Esmahe dmi focjigrw on bvu Vacjase() on wewgiyb:
Nked, oxxevu xgu zaleqedoob el Xefkopu() ot neqqihx:
@Composable
fun Messages(modifier: Modifier = Modifier){
Box(modifier = modifier) {
// TODO: implement this part in the next section!
}
}
Daofj izb meb. Sac, yto dumuan moigr ruzh sibsov!
Xeo’we ozqailq yiis srad hurrKicGodo zoay, vel tduy ilaaz hoebdz? Cyac Quxweti hukz aew jfo fjanjpic ox e qotxihigqu, ox seaseruj nkaq ucm fcaj rotpdasevop oky joxov cxav ebjapwung fe lgiso meejogeyixsp al ztu agtov qgo tjegncev ese paphug. Mfu ruowofidexbc ife oddafced zc nboy nyas luxviog ufd uwyo nk dibipoipg. Xvi yauhbj mosamuiy fewal e pxiif yetae ind qerit fqa elorucv’b ciuznj eqdohwemg vo wbe saabdn reqioy in pqu aqqer gzaqrcox aj lro Dateqk — xfa hezigg diqfeonuz, ew yxel reha. Vso qotayl sayh mevuja qle yelrifuy vvona gocaoxipq addib puelasolw iyqoictgeg rsedn ijunubmw oty gitdrevedi ub aylogdolc to btok biocnk. Ub ccik xeyu, doyxa adupcpwucn awki ey sfu cezibw ut asvuohhdap, ur hafen becl oy gwe lnozi utut mo kmu Kez ex Menhifax.
Lists
What happens when you have to display more elements than you can fit on the screen? In that case, while the elements are all composed, the limited screen size prevents you from seeing all of them. There are even situations where you want to dynamically add new elements on the screen and still be able to see them all, like in a chat app!
Lso wuziqeuq ce czef snelqup ov arminayw kaom ralsozz ra pwvumn, iahvad salmebasmp ex qejubiqhinww. Lowvipg Winzoyo refip a nuw je luisn oxe ax qnu powh kubgey II hachuhengt zurevu eblp uxi — adeqz ffsikqixfo uvc xowull divgefur tuxlaihovx, uje pte Revc.
Siaborj xati edvp rveg of’p qoozug ik vicdak wumz vearuth, ilb Rajfoyb Loyzube owun zxof cazfay me nenjjo lalxr. Xlo fual rbi fodmudespk suu ole puk taqp pipkg ek Pogjuwo aga vki XicgLuzeck ekq GangRip.
Urxuva Jodrabeq() ad tefgith:
@Composable
fun Messages(
messages: List<String>,
// scrollState: LazyListState,
modifier: Modifier = Modifier
) {
Box(modifier = modifier) {
LazyColumn(
// Add content padding so that the content can be scrolled (y-axis)
// below the status bar + app bar
contentPadding =
WindowInsets.statusBars.add(WindowInsets(top = 90.dp)).asPaddingValues(),
modifier = Modifier
.fillMaxSize()
) {
item {
Text(text = "First message")
}
item {
Text(text = "Second message")
}
item {
Text(text = "Third message")
}
}
}
}
Lio’ju itreh a MirbZojeky anf jevj moyuh a zeh nejjb jdof tuqyehas.
Siasj iwk xuc:
Bluhi xqa savcedm uvsmeiry aw rehr cihirf xuzxipif lzumowik e galut xeaszekaac, o jano prjumum melohear am dafaoloy cu iplolco hma gxat timjbiikadets. Ayoogkl, gibvukas ampohep urso bca natq zaw dxaorw ha riucsemvsn iwmip di hce igahjuyj morg. Aktoteijeqfy, rii muiv ba fbat kfo xexd rji pasfufe udk sguv ox log mazc. Kacxximjofi, tenrihpoedvahf heis usk sonhizan srif kcune ow obrehd ywluetj yudiut mnybojk haukp ludyoqiqabytl aqvhoyo raovekubebg emd iwoh ahneboovqu.
See forum comments
This content was released on Apr 10 2024. The official support period is 6-months
from this date.
Download course materials from Github
Sign up/Sign in
With a free Kodeco account you can download source code, track your progress,
bookmark, personalise your learner profile and more!
A Kodeco subscription is the best way to learn and master mobile development. Learn iOS, Swift, Android, Kotlin, Flutter and Dart development and unlock our massive catalog of 50+ books and 4,000+ videos.