Sukurk TableSession.kt — nuskenuotas staliukas
Kodo stulpelyje — TableSession.kt. Maža, bet svarbi: ji laiko nuskenuotą staliuką kaip StateFlow, kad bet kuris ekranas galėtų jį stebėti. setTable("table:12") nuima table: prefiksą ir palieka 12.
Įtrauk į Koiną — vienas single, kad visa programa dalintųsi tuo pačiu staliuku:
// feature/scan/di/ScanModule.kt
val scanModule = module {
single { TableSession() }
}
// ir PicaApplication modules(...) sąraše pridedam scanModule
Dabar prisimink 8a pamoką: ten AuthViewModel.logout() palikom tik repository.logout(). Tikroji versija atsijungiant išvalo ir staliuką — juk naujas vartotojas sėdi kitur:
fun logout(onLoggedOut: () -> Unit) = viewModelScope.launch {
repository.logout()
tableSession.clearTable() // ← dabar, kai TableSession egzistuoja
onLoggedOut()
}
// authModule: viewModel { AuthViewModel(get(), get()) } // + TableSession
Ir krepšelis pagaliau gauna tikrą staliuką. 9 pamokoje placeOrder(..., tableNumber = null); dabar:
val table = tableSession.tableNumber.value
orderRepository.placeOrder(items, table) // table_number keliauja į POST /orders
Patarimas. Kodėl
TableSession— atskirasingle, o ne tiesiog laukas krepšelyje? Nes staliukas — bendras kontekstas: jį nuskaitoScanScreen, naudoja krepšelis ir apmokėjimas. Vienas bendras šaltinis (single) reiškia, kad visi mato tą patį, ir nereikia jo perdavinėti per navigaciją.