Sparround

Compose ↔ View interop və miqrasiya

İki dünya bir tətbiqdə yaşaya bilir — miqrasiya tədricən gedir:

  • View içində Compose: layout-a ComposeView qoyulur, setContent { } ilə doldurulur. Fragment-lərdə ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed mütləəq verilməlidir — yoxsa composition fragment view-undan uzun yaşayıb leak yaradır.
  • Compose içində View: AndroidView(factory = { context -> MapView(context) }, update = { view -> ... }) — Compose-da qarşılığı olmayan komponentlər (xəritə, WebView, reklam SDK-ları, custom chart-lar) üçün.
  • Theme körpüsü: Material theme-lərin XML ↔ Compose sinxronu üçün adapter yanaşmalar; dizayn tokenlərini tək mənbədə saxlamaq vacibdir.

Miqrasiya strategiyası (rəsmi tövsiyə): aşağıdan yuxarı — əvvəl kiçik komponentlər/yeni ekranlar Compose-da, sonra bütöv ekranlar, ən sonda navigation. Yeni feature-lar Compose-da yazılır, köhnə ekranlar toxunanda köçürülür.

kotlin
// 1) Fragment-də ComposeView (View → Compose)
override fun onCreateView(...): View =
    ComposeView(requireContext()).apply {
        setViewCompositionStrategy(
            ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed
        )
        setContent {
            BankTheme {
                TransferScreen()
            }
        }
    }

// 2) Compose-da köhnə custom view (Compose → View)
@Composable
fun SignatureBox(onSigned: (Bitmap) -> Unit) {
    AndroidView(
        factory = { context ->
            SignatureView(context).apply { listener = onSigned }
        },
        update = { view -> view.clearIfNeeded() }
    )
}

Hər iki istiqamətdə interop

Müsahibədə miqrasiya sualının gözlənilən cavab qəlibi: (1) böyük partlayış yox — tədricən; (2) haradan başlamaq — dizayn sistemi komponentləri (düymə, input) və yeni ekranlar; (3) riskli yerlər — RecyclerView item-lərində ComposeView (performans üçün RecyclerView-un Compose adapter dəstəyi), fragment-lərdə composition strategy, iki theme sisteminin sinxronu; (4) komanda tərəfi — Compose bilməyənlər üçün code review + pair. Sənin vəziyyətin (XML bilirsən, Compose öyrənirsən) bu sualda üstünlükdür: "öyrənmə yolum elə miqrasiya yoludur" deyə bilərsən.

🛠 Tapşırıq

Hər iki istiqamətdə interop qur:

  • Mövcud (və ya yeni) fragment-ə ComposeView əlavə et. Əvvəl ViewCompositionStrategy vermədən işlət, LeakCanary-yə bax; sonra DisposeOnViewTreeLifecycleDestroyed təyin et.
  • Compose ekranında AndroidView ilə köhnə bir View göstər (məs. WebView və ya sadə custom view) və update lambda-sının nə vaxt çağırıldığını logla.

Bitdi sayılır: "böyük XML kod bazasını necə köçürərsən" sualına mərhələli planın hazırdırsa.

📚 Mənbələr və sənədlər