Kodokon kodokon.com

Navigator के साथ स्क्रीनों के बीच नेविगेट करना

Navigator.push और pop से स्क्रीनों को पुश और पॉप करें, कंस्ट्रक्टर के ज़रिए डेटा पास करें, और जब स्क्रीन बंद हो तो एक परिणाम प्राप्त करें।

8 मिनट · 3 प्रश्न

इस पाठ को Kodokon में खोलें

Flutter आपकी स्क्रीनों को एक स्टैक के रूप में संभालता है: Navigator.push एक नई स्क्रीन को ऊपर रखता है, Navigator.pop सबसे ऊपर वाली को हटा देता है और पिछली को सामने ले आता है। हर स्क्रीन एक रूट है, और MaterialPageRoute प्लेटफ़ॉर्म का मूल ट्रांज़िशन प्रदान करता है। Android का बैक बटन आपके लिए pop कॉल करता है, बिना कोड की एक भी लाइन के।

DART
import 'package:flutter/material.dart';

class HomeScreen extends StatelessWidget {
  const HomeScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Home')),
      body: Center(
        child: FilledButton(
          onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) {
                  return const DetailScreen(
                    productName: 'Headphones',
                  );
                },
              ),
            );
          },
          child: const Text('View product'),
        ),
      ),
    );
  }
}
push, DetailScreen (नीचे परिभाषित) को वर्तमान स्क्रीन के ऊपर पुश करता है।

अगली स्क्रीन को डेटा पास करने के लिए कोई जादुई तंत्र नहीं है: गंतव्य स्क्रीन किसी भी अन्य विजेट की तरह ही एक विजेट है, और यह अपना डेटा अपने कंस्ट्रक्टर के ज़रिए प्राप्त करती है। यह टाइप्ड है, स्पष्ट है, और यदि कोई फ़ील्ड छूट जाती है तो कंपाइलर आपको पकड़ लेता है। ध्यान दें कि पुश की गई स्क्रीन का AppBar बिना आपके कुछ लिखे ही बैक बटन दिखाता है।

DART
import 'package:flutter/material.dart';

class DetailScreen extends StatelessWidget {
  const DetailScreen({
    super.key,
    required this.productName,
  });

  final String productName;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(productName)),
      body: Center(
        child: FilledButton(
          onPressed: () {
            Navigator.pop(context, true);
          },
          child: const Text('Add to cart'),
        ),
      ),
    );
  }
}
pop स्क्रीन को बंद करता है और कॉल करने वाले को एक वैल्यू लौटाता है।

Navigator.push एक Future लौटाता है जो स्क्रीन के बंद होने पर पूरा होता है, उस वैल्यू के साथ जो pop को पास की गई थी। इसलिए आप किसी स्क्रीन के परिणाम की प्रतीक्षा (await) कर सकते हैं: एक पुष्टि, सूची से चुना गया कोई आइटम, एक भरा हुआ फ़ॉर्म। जेनेरिक टाइप push<bool> यह दस्तावेज़ित करता है कि आप वापस क्या पाने की उम्मीद करते हैं।

DART
import 'package:flutter/material.dart';

Future<void> openDetail(BuildContext context) async {
  final added = await Navigator.push<bool>(
    context,
    MaterialPageRoute<bool>(
      builder: (context) {
        return const DetailScreen(
          productName: 'Headphones',
        );
      },
    ),
  );
  if (!context.mounted) return;
  final message = (added ?? false)
      ? 'Product added to cart'
      : 'No product added';
  ScaffoldMessenger.of(context).showSnackBar(
    SnackBar(content: Text(message)),
  );
}
push का Future तब पूरा होता है जब स्क्रीन बंद होती है।

ज्ञान जांच

सुनिश्चित करें कि आपको इस पाठ के मुख्य बिंदु याद हैं।

  1. Navigator स्क्रीनों को कैसे व्यवस्थित करता है?
    • एक कतार (queue) की तरह: पहले आया, पहले दिखाया गया
    • एक स्टैक की तरह: सबसे आखिर में पुश की गई स्क्रीन सबसे ऊपर दिखाई जाती है
    • एक समानांतर विजेट ट्री की तरह
    • स्क्रीनों के एक ग्रिड की तरह
  2. अगली स्क्रीन को डेटा पास करने का मुहावरेदार (idiomatic) तरीका क्या है?
    • एक ग्लोबल वेरिएबल के ज़रिए
    • गंतव्य विजेट के कंस्ट्रक्टर के ज़रिए
    • इसे डिस्क पर लिखकर
    • Navigator डेटा पास करने की अनुमति नहीं देता
  3. Navigator.pop(context, true) क्या करता है?
    • यह "true" नाम की एक नई स्क्रीन खोलता है
    • यह स्टैक की सभी स्क्रीनों को बंद कर देता है
    • यह वर्तमान स्क्रीन को बंद करता है और प्रतीक्षारत push को true लौटाता है