# Cómo recibir un resultado de una pantalla

> Abrir una pantalla y recibir un valor de vuelta — pickers vía show(onAnswer), pantallas comunes vía callback en el constructor.

Source: https://crossfly.dev/es/docs/cookbook/nav/receber-resultado — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# Cómo recibir un resultado de una pantalla

**Propósito.** Abres una pantalla para que el usuario elija/rellene algo y necesitas el valor de vuelta. CrossFly tiene **dos mecanismos distintos**: `show(onAnswer)` para **pickers**, y **callback en el constructor** para pantallas comunes.

## APIs usadas
- `Window.show(RunnableWith<Object> onAnswer)` — registra un callback de resultado. En la fuente, el callback **solo se dispara si `getAnswer() != null`**, y `Window.getAnswer()` devuelve `null` por defecto — **solo `Picker` sobrescribe** `getAnswer()`. Es decir: para pantallas comunes ese callback **nunca se dispara**.
- `Picker.getAnswer()` — devuelve el valor elegido, o `null` si se canceló. Solo los pickers lo implementan.
- Callback en el constructor — el patrón para pantallas comunes: pasa un `RunnableWith<T>` (o una interfaz propia) al constructor de la pantalla e invócalo antes de `hide()`.

## Ejemplo completo (copiar, pegar y ejecutar)
```java
package com.exemplo;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;

/** Pantalla principal ejecutable: abre la pantalla de selección y recibe el resultado vía callback en el constructor. */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      add(new Label("Nenhum cliente escolhido"));
      add(new Button("Escolher cliente").onAction(e ->
         // PANTALLA COMÚN — resultado vía callback en el constructor (show(onAnswer) NO funciona aquí).
         new SelecionarClienteTela(cliente -> Hint.show("Escolhido: " + cliente.nome, 1500)).show()));
   }
}

/** Modelo simple de ejemplo. */
class Cliente
{
   final String nome;
   Cliente(String nome) { this.nome = nome; }
}

/** Pantalla de selección: entrega el resultado por el callback del constructor antes de cerrar. */
class SelecionarClienteTela extends Window
{
   private final RunnableWith<Cliente> onPick;

   public SelecionarClienteTela(RunnableWith<Cliente> onPick) { this.onPick = onPick; }

   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());
      add(new Button("Escolher Ana").onAction(e ->
      {
         if (onPick != null) onPick.run(new Cliente("Ana"));  // entrega el resultado
         hide();                                              // luego cierra
      }));
   }
}
```

> El fragmento de abajo muestra **solo el núcleo**. Para ejecutarlo, colócalo en el esqueleto `MainWindow` de arriba.

## Fragmento mínimo
```java
// verificado en la fuente: hide() solo llama a onAnswer.run(answer) cuando (this instanceof Picker) y answer != null

// 1) PICKER — usa show(onAnswer). Dispara SOLO con resultado no nulo (elección confirmada).
DatePicker picker = new DatePicker(/* ... */);
picker.show(answer ->
{
   Date d = (Date) answer;      // nunca es null aquí; cancelar NO dispara el callback
   Hint.show("Data: " + d, 1500);
});

// 2) PANTALLA COMÚN — resultado vía callback en el constructor (show(onAnswer) NO funciona aquí).
public class SelecionarClienteTela extends Window
{
   private final RunnableWith<Cliente> onPick;

   public SelecionarClienteTela(RunnableWith<Cliente> onPick) { this.onPick = onPick; }

   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new GridLayout());
      add(new Button("Escolher Ana").onAction(e ->
      {
         if (onPick != null) onPick.run(new Cliente("Ana"));  // entrega el resultado
         hide();                                              // luego cierra
      }));
   }
}

// llamada:
new SelecionarClienteTela(cliente -> Hint.show("Escolhido: " + cliente.nome, 1500)).show();
```

¿Por qué dos caminos? `hide()` llama a `onAnswer` únicamente para `Picker` (el `instanceof Picker` está en el código de `Window.hide()`). Para pantallas comunes, el callback del constructor es el contrato explícito — y permite tipar el resultado (`RunnableWith<Cliente>`) en lugar de `Object`.

## Profundiza
- [Devolviendo resultados](/docs/ui/navigation/returning-results) · [Navegar entre pantallas](/docs/ui/navigation/navigate-between-screens)
- Receta hermana: [Abrir y cerrar una pantalla](/docs/cookbook/nav/abrir-tela)
