Compose UI-nin agent ilə yazılması
Compose agent üçün nisbətən əlverişli sahədir: kod deklarativdir, bir faylda cəmlənir, @Preview ilə tez yoxlanılır. Amma tipik səhvlər də var və onlar compile olur — yəni yalnız review və test tutur:
- State hoisting pozuntusu — Composable öz state-ini içəridə saxlayır, nəticədə yenidən istifadə və test edilə bilmir.
- Recomposition problemləri — hesablama birbaşa Composable gövdəsində,
rememberolmadan. - Modifier-in düzgün ötürülməməsi — parametr kimi qəbul edilmir və ya zəncirin əvvəlinə tətbiq olunmur.
- Lifecycle-a həssas olmayan collect —
collectAsStatearxa fonda da collect etməyə davam edir.
kotlin
// WHAT THE AGENT OFTEN WRITES (compiles, but has problems)
@Composable
fun OrderScreen(viewModel: OrderViewModel) {
val state by viewModel.uiState.collectAsState() // not lifecycle-aware
var filter by remember { mutableStateOf("") } // state trapped inside
val sorted = state.orders.sortedBy { it.date } // re-sorts on every recomposition
Column {
// no modifier parameter — the caller cannot control sizing
sorted.forEach { OrderRow(it) }
}
}
// AFTER REVIEW
@Composable
fun OrderScreen(
viewModel: OrderViewModel,
modifier: Modifier = Modifier,
) {
val state by viewModel.uiState.collectAsStateWithLifecycle()
OrderScreen(
state = state,
onFilterChange = viewModel::onFilterChange,
modifier = modifier,
)
}
// The stateless version: testable and previewable
@Composable
fun OrderScreen(
state: OrderUiState,
onFilterChange: (String) -> Unit,
modifier: Modifier = Modifier,
) {
val sorted = remember(state.orders) { state.orders.sortedBy { it.date } }
Column(modifier = modifier) {
sorted.forEach { OrderRow(order = it) }
}
}Tipik fərq. `collectAsStateWithLifecycle` `androidx.lifecycle:lifecycle-runtime-compose` artefaktından gəlir və collect-i lifecycle-a bağlayır.
| Nəyi tapşırıqda göstərmək | Niyə |
|---|---|
| Nümunə ekran faylı ("ProfileScreen.kt kimi et") | Layihənin state və naviqasiya pattern-i avtomatik təkrarlanır |
| State-li və state-siz versiyanın ayrılması | Test və preview yalnız state-siz versiyada mümkündür |
| `@Preview` tələbi | Sürətli vizual yoxlama və sənədləşmə |
| Mətnlərin `strings.xml`-də olması | Agent hardcode string-ə meyllidir |
| Compile əmri | Agent özünü yoxlaya bilir |
@Preview agentlə işləmədə xüsusi dəyərlidir: preview-lar compile olunur, yəni sintaktik və tip səhvləri dərhal ortaya çıxır, üstəlik siz nəticəni Android Studio-da göz ilə yoxlaya bilirsiniz. Ona görə "hər public Composable üçün preview" qaydası agentlə işləyəndə adi vaxtdakından daha faydalıdır.
📚 Mənbələr və sənədlər
- Compose — state və state hoistingrəsmideveloper.android.com
- Compose performansırəsmideveloper.android.com
Recomposition, stability və compiler metrikləri.
- Compose-da Flow-ların təhlükəsiz collect edilməsirəsmideveloper.android.com
`collectAsStateWithLifecycle` və lifecycle-a həssas API-lər.