# स्क्रीन से मान लौटाना

> वापस परिणाम कैसे प्राप्त करें — कॉलबैक पैटर्न और Picker/onAnswer पैटर्न।

Source: https://crossfly.dev/hi/docs/ui/navigation/returning-results — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# स्क्रीन से मान लौटाना

**दो** पैटर्न हैं, और सही पैटर्न चुनना एक आम बग से बचाता है।

## ⚠️ महत्वपूर्ण बिंदु
`Window.show(onAnswer)` **`onAnswer` को केवल तभी चलाता है जब विंडो एक `Picker` हो** (आंतरिक रूप से,
`hide()` करता है `answer = this instanceof Picker ? getAnswer() : null` और कॉलबैक को केवल तभी कॉल करता है जब
`answer != null`)। एक **सामान्य स्क्रीन** (`Window` की सबक्लास) के लिए, `show(onAnswer)` कोई मान **नहीं**
लौटाता — **कंस्ट्रक्टर द्वारा कॉलबैक** पैटर्न का उपयोग करें।

## पूर्ण उदाहरण (कॉपी करें, पेस्ट करें और चलाएँ)
```java
package com.exemplo;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.style.*;
import dev.crossfly.util.*;   // RunnableWith

/** चलाने योग्य मुख्य स्क्रीन। launcher (classname) की ओर संकेत करें और चलाएँ: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      Label resultado = new Label("Nenhuma escolha ainda");
      add(LAY_AUTO, resultado);

      Button escolher = new Button("Escolher opção");
      // सामान्य स्क्रीन → callback कंस्ट्रक्टर द्वारा (show(cb) सिर्फ Picker में चलता है)।
      escolher.onAction(c ->
         new TelaSelecao(op -> resultado.setText("Escolheu: " + op)).show());
      add(LAY_AUTO, escolher);
   }
}

/** सामान्य स्क्रीन जो कंस्ट्रक्टर में मिले callback द्वारा मान लौटाती है। */
class TelaSelecao extends Window
{
   private final RunnableWith<String> onEscolha;

   public TelaSelecao(RunnableWith<String> onEscolha) { this.onEscolha = onEscolha; }

   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      Button a = new Button("Opção A");
      a.onAction(c -> { onEscolha.run("A"); hide(); });   // लौटाता है और बंद करता है
      add(LAY_AUTO, a);

      Button b = new Button("Opção B");
      b.onAction(c -> { onEscolha.run("B"); hide(); });
      add(LAY_AUTO, b);
   }
}
```
> नीचे दिए गए स्निपेट **केवल मुख्य भाग** दिखाते हैं (जो `onShow()` के अंदर जाता है)। चलाने के लिए, उन्हें ऊपर दिए गए `MainWindow` ढाँचे में रखें।

## पैटर्न 1 — कंस्ट्रक्टर द्वारा कॉलबैक (सामान्य स्क्रीनें)
स्क्रीन के कंस्ट्रक्टर को एक कॉलबैक भेजें; वह उसे `hide()` से पहले इनवोक करती है:
```java
public class TelaSelecao extends Window {
   private final RunnableWith<String> onEscolha;
   public TelaSelecao(RunnableWith<String> onEscolha) { this.onEscolha = onEscolha; }

   @Override public void onShow() throws Exception {
      super.onShow();
      setLayout(new VerticalLayout());
      Button opa = new Button("Opção A");
      opa.onAction(c -> { onEscolha.run("A"); hide(); });   // लौटाता है और बंद करता है
      add(LAY_AUTO, opa);
   }
}

// उपयोग:
new TelaSelecao(resultado -> System.out.println("Escolheu: " + resultado)).show();
```

## पैटर्न 2 — Picker + `onAnswer` (तैयार सेलेक्टर)
[pickers](/docs/ui/widgets/picker) (`DatePicker`, `TimePicker`, `ColorPicker`, आदि) पहले से ही
`getAnswer()` लागू करते हैं। उनके लिए, `show(onAnswer)` का उपयोग करें:
```java
new DatePicker().show(resposta -> {
   // सिर्फ != null होने पर चलता है (उपयोगकर्ता ने पुष्टि की; रद्द ⇒ getAnswer() null)
   System.out.println("Data: " + resposta);
});
```
अपना खुद का सेलेक्टर बनाने के लिए, **`Picker` को विस्तारित करें** और `getAnswer()` लागू करें।

## ⚠️ डायलॉग `onAnswer` का उपयोग **नहीं** करते
`Alert` और `ActionSheet` `Window` को विस्तारित करते हैं (`Picker` को नहीं), इसलिए `show(callback)` **नहीं** चलता। जवाब
**बटनों के कॉलबैक** (`buttonAction`) से आता है — देखें [डायलॉग और मोडल](/docs/ui/navigation/dialogs-and-modals)।

## अच्छे तौर-तरीके
- सामान्य स्क्रीनें → **कंस्ट्रक्टर में कॉलबैक**। सेलेक्टर → **`Picker` + `onAnswer`**।
- स्क्रीनों के बीच साझा स्थिति के लिए, एक **ViewModel/controller** पर विचार करें (देखें
  [आर्किटेक्चर](/docs/best-practices))।

## आम गलतियाँ
- ऐसी स्क्रीन में `minhaTela.show(cb)` का उपयोग करना जो `Picker` **नहीं** है, `cb` के चलने की उम्मीद करते हुए (यह नहीं चलता)।
- `alert.show(cb)` का उपयोग करना — कॉलबैक कभी नहीं चलता; `buttonAction` का उपयोग करें।

## यह भी देखें
- [डायलॉग और मोडल](/docs/ui/navigation/dialogs-and-modals) · [Pickers (कैटलॉग)](/docs/ui/widgets/picker)
