# किसी स्क्रीन से परिणाम कैसे प्राप्त करें

> एक स्क्रीन खोलें और वापस एक मान प्राप्त करें — pickers के लिए show(onAnswer) के माध्यम से, सामान्य स्क्रीन के लिए कंस्ट्रक्टर में callback के माध्यम से।

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

# किसी स्क्रीन से परिणाम कैसे प्राप्त करें

**उद्देश्य।** आप उपयोगकर्ता के लिए कुछ चुनने/भरने हेतु एक स्क्रीन खोलते हैं और आपको वापस मान चाहिए। CrossFly में **दो अलग-अलग तंत्र** हैं: **pickers** के लिए `show(onAnswer)`, और सामान्य स्क्रीन के लिए **कंस्ट्रक्टर में callback**।

## उपयोग की गई APIs
- `Window.show(RunnableWith<Object> onAnswer)` — परिणाम का एक callback पंजीकृत करता है। स्रोत में, callback **केवल तभी चलता है जब `getAnswer() != null`**, और `Window.getAnswer()` डिफ़ॉल्ट रूप से `null` लौटाता है — **केवल `Picker` ही** `getAnswer()` को ओवरराइड करता है। यानी: सामान्य स्क्रीन के लिए यह callback **कभी नहीं चलता**।
- `Picker.getAnswer()` — चुना गया मान लौटाता है, या रद्द होने पर `null`। केवल pickers ही इसे लागू करते हैं।
- कंस्ट्रक्टर में callback — सामान्य स्क्रीन के लिए मानक तरीका: स्क्रीन के कंस्ट्रक्टर को एक `RunnableWith<T>` (या अपना कोई इंटरफ़ेस) पास करें और `hide()` से पहले उसे invoke करें।

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

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

/** मुख्य निष्पादन योग्य स्क्रीन: चयन स्क्रीन खोलती है और कंस्ट्रक्टर में callback के जरिए परिणाम प्राप्त करती है। */
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 ->
         // सामान्य स्क्रीन — कंस्ट्रक्टर में callback के जरिए परिणाम (यहां show(onAnswer) काम नहीं करता)।
         new SelecionarClienteTela(cliente -> Hint.show("Escolhido: " + cliente.nome, 1500)).show()));
   }
}

/** सरल उदाहरण मॉडल। */
class Cliente
{
   final String nome;
   Cliente(String nome) { this.nome = nome; }
}

/** चयन स्क्रीन: बंद होने से पहले कंस्ट्रक्टर callback के जरिए परिणाम देती है। */
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"));  // परिणाम देता है
         hide();                                              // फिर बंद करता है
      }));
   }
}
```

> नीचे का अंश **केवल मुख्य भाग** दिखाता है। चलाने के लिए, इसे ऊपर दिए गए `MainWindow` ढाँचे में रखें।

## न्यूनतम अंश
```java
// स्रोत में सत्यापित: hide() केवल तभी onAnswer.run(answer) कॉल करता है जब (this instanceof Picker) और answer != null

// 1) PICKER — show(onAnswer) का उपयोग करता है। केवल गैर-null परिणाम (पुष्टि किए गए चयन) पर फायर होता है।
DatePicker picker = new DatePicker(/* ... */);
picker.show(answer ->
{
   Date d = (Date) answer;      // यहां कभी null नहीं होता; रद्द करने पर callback फायर नहीं होता
   Hint.show("Data: " + d, 1500);
});

// 2) सामान्य स्क्रीन — कंस्ट्रक्टर में callback के जरिए परिणाम (यहां show(onAnswer) काम नहीं करता)।
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"));  // परिणाम देता है
         hide();                                              // फिर बंद करता है
      }));
   }
}

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

दो रास्ते क्यों? `hide()` `onAnswer` को केवल `Picker` के लिए कॉल करता है (`instanceof Picker` जाँच `Window.hide()` के कोड में है)। सामान्य स्क्रीन के लिए, कंस्ट्रक्टर का callback स्पष्ट अनुबंध है — और यह `Object` के बजाय परिणाम को टाइप (`RunnableWith<Cliente>`) करने की अनुमति देता है।

## और गहराई में जाएँ
- [परिणाम लौटाना](/docs/ui/navigation/returning-results) · [स्क्रीनों के बीच नेविगेट करना](/docs/ui/navigation/navigate-between-screens)
- संबंधित रेसिपी: [स्क्रीन खोलना और बंद करना](/docs/cookbook/nav/abrir-tela)
