Kodokon kodokon.com

स्टेट साझा करना: स्टेट को ऊपर उठाना और कॉलबैक

स्टेट को साझा पूर्वज (ancestor) में रखें और अपने चाइल्ड विजेट को नियंत्रित विजेट में बदलें जो कॉलबैक के ज़रिए बदलावों की सूचना वापस देते हैं।

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

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

एक पारंपरिक स्थिति: एक मात्रा चयनकर्ता और कहीं और प्रदर्शित एक कुल योग को एक ही डेटा साझा करना होता है। सुनहरा नियम: स्टेट उन विजेट के निकटतम साझा पूर्वज में रहता है जो उस पर निर्भर हैं। पैरेंट डेटा का स्वामी होता है, उसे एक पैरामीटर के रूप में नीचे पास करता है, और एक कॉलबैक के ज़रिए बदलाव प्राप्त करता है जो ऊपर की ओर वापस बहता है। यही "स्टेट को ऊपर उठाना" (lifting state up) है।

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

class CartScreen extends StatefulWidget {
  const CartScreen({super.key});

  @override
  State<CartScreen> createState() => _CartScreenState();
}

class _CartScreenState extends State<CartScreen> {
  int _quantity = 1;

  void _updateQuantity(int value) {
    setState(() => _quantity = value);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Cart')),
      body: Column(
        children: [
          QuantitySelector(
            quantity: _quantity,
            onChanged: _updateQuantity,
          ),
          Text('Total: ${_quantity * 20} €'),
        ],
      ),
    );
  }
}
पैरेंट स्टेट का स्वामी है और वैल्यू तथा कॉलबैक बाँटता है।

चाइल्ड एक नियंत्रित विजेट बन जाता है: यह एक StatelessWidget है, कुछ भी संग्रहीत नहीं करता, जो वैल्यू उसे मिलती है उसे प्रदर्शित करता है, और onChanged के ज़रिए हर मंशा का संकेत देता है। ValueChanged<int> बस void Function(int) का एक उपनाम (alias) है। मात्रा 1 पर अक्षम किए गए माइनस बटन पर ध्यान दें: onPressed को null पास करना पर्याप्त है, और यह तर्क सीधे प्राप्त वैल्यू से निकलता है।

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

class QuantitySelector extends StatelessWidget {
  const QuantitySelector({
    super.key,
    required this.quantity,
    required this.onChanged,
  });

  final int quantity;
  final ValueChanged<int> onChanged;

  @override
  Widget build(BuildContext context) {
    return Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        IconButton(
          icon: const Icon(Icons.remove),
          onPressed: quantity > 1
              ? () => onChanged(quantity - 1)
              : null,
        ),
        Text('$quantity'),
        IconButton(
          icon: const Icon(Icons.add),
          onPressed: () => onChanged(quantity + 1),
        ),
      ],
    );
  }
}
चाइल्ड जो वैल्यू उसे मिलती है उसे प्रदर्शित करता है और मंशाओं की सूचना ऊपर वापस देता है।

आप इस अनुबंध का उपयोग हर समय बिना जाने ही करते हैं: Checkbox, Slider, Switch सभी नियंत्रित विजेट हैं (value + onChanged)। जब ट्री गहरा होता जाता है और कॉलबैक को पाँच स्तरों से गुज़ारना थकाऊ हो जाता है, तब स्टेट प्रबंधन समाधानों की खोज का समय होगा - यही अगले मॉड्यूल का विषय है।

ज्ञान जांच

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

  1. दो सहोदर (sibling) विजेट द्वारा साझा की गई स्टेट को आपको कहाँ रखना चाहिए?
    • दोनों विजेट में से हर एक में
    • निकटतम साझा पूर्वज में
    • एक ग्लोबल वेरिएबल में
    • MaterialApp में
  2. एक चाइल्ड विजेट स्टेट में बदलाव का अनुरोध कैसे करता है?
    • यह सीधे अपने पैरेंट पर setState कॉल करता है
    • यह उस प्रॉपर्टी को बदल देता है जो उसे पैरामीटर के रूप में मिली थी
    • यह पैरेंट द्वारा प्रदान किए गए कॉलबैक को इनवोक करता है
  3. नियंत्रित विजेट क्या होता है?
    • एक विजेट जो अपनी वैल्यू प्राप्त करता है और एक कॉलबैक के ज़रिए बदलावों की सूचना देता है, बिना अपनी कोई स्टेट के
    • एक विजेट जिसे setState का उपयोग करना ही होता है
    • एक विजेट जो यूनिट टेस्ट से आच्छादित है
    • const घोषित किया गया एक विजेट