Tinklo stekas — build.gradle.kts, DTO, PicaApi
Trys failai kodo stulpelyje kaip skirtukai, tokia tvarka, kokia juos kuri: build.gradle.kts → MenuItemDto.kt → PicaApi.kt. Bibliotekos pirma — be jų niekas nekompiliuojasi.
1. build.gradle.kts (modify) — įtrauk tinklo steką: kotlin.serialization įskiepį ir Retrofit + kotlinx-serialization priklausomybes. „Stack when needed" — įtraukiam tada, kai prireikia, ne anksčiau. Viskas iš 1 pamokos lieka; diff parodo tik naujas eilutes.
2. MenuItemDto.kt (data) — laidinis modelis. Jis atspindi serverio JSON tiksliai, plius vertėją į domeną:
@SerialName("price_cents") val priceCents: Int // JSON snake_case; Kotlin ne
// …
fun MenuItemDto.toDomain(): MenuItem = MenuItem(price = priceCents / 100.0, /* … */)
@SerialName("price_cents")sujungia JSON laukąprice_centssu KotlinopriceCents.toDomain()paverčia centus eurais. UI mato švarųMenuItem(kaip 2 pamokoje), nežino apie centus ar JSON.
3. PicaApi.kt (network) — serviso sąsaja. Retrofit paverčia @GET("menu") suspend fun getMenu(): List<MenuItemDto> veikiančiu HTTP klientu. Kol kas tik meniu; kiti galiniai taškai prisidės savo pamokose.
Patikrink. Projektas kompiliuojasi. PicaApi ir MenuItemDto kol kas niekur nekviečiami — pajungsim kitame žingsnyje.
Patarimas. Kodėl atskiras DTO, o ne tiesiog anotuotas
MenuItem? Nes JSON forma priklauso nuo serverio (centai,snake_case), o UI modelis — nuo tavęs. Atskyrus juos, serverio pakeitimas nesulaužo viso UI — pataisai tiktoDomain().