# Jetpack Compose से आना

> @Composable→Component मैपिंग और रिएक्टिव काउंटर को फ़ील्ड + repaint() के रूप में पुनर्लिखित करना।

Source: https://crossfly.dev/hi/docs/migrate/from-jetpack-compose — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# Jetpack Compose से आना

Compose (डिक्लेरेटिव Kotlin) में जब ऑब्ज़र्वेबल स्टेट बदलता है तो UI **रीकंपोज़** होता है। CrossFly में आप
**एक बार माउंट** करते हैं और **म्यूट** करते हैं। पहले [दर्शन](/docs/migrate/overview) पढ़ें।

## अनुवाद तालिका
| Jetpack Compose | CrossFly |
|---|---|
| `@Composable fun` | वह मेथड जो `onShow()` में **एक बार** माउंट करता है |
| `remember { mutableStateOf(...) }` + रीकंपोज़िशन | **फ़ील्ड** + `repaint()` (बिना रीकंपोज़िशन) |
| `Column` / `Row` / `Box` | `VerticalLayout` / `HorizontalLayout` / `RelativeLayout` |
| `Modifier.weight(1f)` | `add(LAY_FILL, c)` (`-1f`) |
| `Modifier.padding(...)` | स्टाइल में `ingap` |
| `LazyColumn` | `VirtualListView` |
| `Text` | `Label` |
| `Button` | `Button` |
| `Scaffold` / `TopAppBar` | `Window` (+ `TabBar`) |
| `NavController` / `NavHost` | `Window` का स्टैक (`show()` / `hide()`) |
| `ViewModel` + `StateFlow` | मैनुअल ViewModel + callback (बिना फ़्लो कलेक्शन के) |
| `LaunchedEffect` / coroutines | `Thread` + `Component.onUI(...)` |
| `Color(0xFF...)` | `int 0xAARRGGBB` (`UIConstants` / `ColorUtils`) |

## पहले कैसा था / अब कैसा है — काउंटर
```kotlin
// Compose: muda o state → recompõe sozinho
@Composable fun Contador() {
   var n by remember { mutableStateOf(0) }
   Column {
      Text("$n")
      Button(onClick = { n++ }) { Text("+") }
   }
}
```
```java
// CrossFly: रेफ़रेंस रखता है और मैन्युअली अपडेट करता है
public class Contador extends Window {
   private int n = 0;
   private Label display;
   @Override public void onShow() throws Exception {
      super.onShow();
      setLayout(new VerticalLayout());
      add(LAY_AUTO, display = new Label("0"));
      Button mais = new Button("+");
      mais.onAction(c -> { n++; display.setText(String.valueOf(n)); });   // बिना रीकंपोज़िशन के
      add(LAY_AUTO, mais);
   }
}
```

## वह बिंदु जो सबसे ज़्यादा चौंकाता है
`StateFlow`/`collectAsState` का कोई समकक्ष नहीं है: CrossFly आपके स्टेट को **ऑब्ज़र्व नहीं करता**। जहाँ आप
एक फ़्लो कलेक्ट करते, वहाँ मान को एक फ़ील्ड में रखें और `repaint()` कॉल करें (या अपने ViewModel में एक मैनुअल
`observe(Runnable)` — देखें [ऐप आर्किटेक्चर](/docs/best-practices/arquitetura-de-app))।

## यह भी देखें
- [स्टेट और डेटा फ़्लो](/docs/concepts/state-and-data-flow) · [ऐप आर्किटेक्चर](/docs/best-practices/arquitetura-de-app)
