# Vindo do SwiftUI

> Mapeamento View/@State→Component e um formulário reescrito, com a diferença de destino.

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

# Vindo do SwiftUI

No SwiftUI o `body` é computado e a view **se invalida** quando `@State` muda. No CrossFly você **monta
uma vez** e **muta**. Leia primeiro [a filosofia](/docs/migrate/overview).

## Tabela de tradução
| SwiftUI | CrossFly |
|---|---|
| `View` / `body` computado | UI montada **uma vez** em `onShow()` |
| `@State` / `@Binding` / `@ObservedObject` | campos + `repaint()` (sem invalidação automática) |
| `VStack` / `HStack` / `ZStack` | `VerticalLayout` / `HorizontalLayout` / `RelativeLayout` |
| `Spacer()` | `Gap` / frações (o `Spacer` do framework foi **removido**) |
| `.padding()` | `ingap` no estilo |
| `List` | `VirtualListView` |
| `Text` | `Label` |
| `Button` | `Button` |
| `NavigationStack` / `.sheet` | pilha de `Window` / `ActionSheet` |
| `.alert` | `Alert` |
| `async` / `await` / `Task` | `Thread` + `Component.onUI(...)` |
| `Color` | `int 0xAARRGGBB` |

## Diferença de destino
SwiftUI roda **só em Apple**. O CrossFly é **uma base Java** que roda em iOS **e** Android, Desktop e
Web — o mesmo código de tela em todos (ver [plataformas](/docs/platforms)).

## Como era / como fica — formulário
```swift
// SwiftUI
struct LoginView: View {
   @State private var email = ""
   var body: some View {
      VStack {
         TextField("E-mail", text: $email)
         Button("Entrar") { entrar(email) }
      }
   }
}
```
```java
// CrossFly
public class LoginScreen extends Window {
   @Override public void onShow() throws Exception {
      super.onShow();
      setLayout(new VerticalLayout());
      TextField email = new TextField().caption("E-mail");
      add(LAY_AUTO, email);
      Button entrar = new Button("Entrar");
      entrar.onAction(c -> entrar(email.getText()));   // lê o valor no envio (sem $binding)
      add(LAY_AUTO, entrar);
   }
}
```
> Sem `$binding`: você **lê `getText()`** quando precisa (ex.: no `onAction`), não há vínculo automático
> campo↔variável (ver [Campos de texto](/docs/ui/forms-and-input/text-fields)).

## Veja também
- [Formulários e entrada](/docs/ui/forms-and-input) · [Navegação](/docs/ui/navigation)
