Sobes.tech
Middle

Ce este InheritedWidget și cum îl folosești în Flutter?

sobes.tech AI

Răspuns de la AI

InheritedWidget este un tip special de widget în Flutter care permite distribuirea eficientă a informațiilor în jos în arborele de widget-uri. Este utilizat pentru a furniza date și servicii subarborelui de widget-uri fără a fi nevoie să le transmiteți explicit prin constructorii fiecărui widget intermediar.

Caracteristici cheie ale InheritedWidget:

  • Distribuție eficientă a datelor: Când InheritedWidget se schimbă, Flutter reconstruiește automat doar widget-urile din subarborele care depind de acesta.
  • Acces simplu la date: Widget-urile copil pot accesa datele InheritedWidget folosind metoda statică of().
  • Gestionarea dependențelor: Metoda updateShouldNotify permite controlul asupra momentului în care widget-urile dependente trebuie reconstruite.

Cum se folosește InheritedWidget:

  1. Creați o clasă care moștenește de la InheritedWidget:

    class MyInheritedWidget extends InheritedWidget {
      const MyInheritedWidget({
        Key? key,
        required this.data,
        required Widget child,
      }) : super(key: key, child: child);
    
      final String data; // Datele care vor fi distribuite
    
      // Metodă pentru obținerea instanței de InheritedWidget
      static MyInheritedWidget of(BuildContext context) {
        final MyInheritedWidget? result = context.dependOnInheritedWidgetOfExactType<MyInheritedWidget>();
        assert(result != null, 'Niciun MyInheritedWidget găsit în context');
        return result!;
      }
    
      // Definește dacă widget-urile dependente trebuie să fie notificate despre schimbări
      @override
      bool updateShouldNotify(MyInheritedWidget oldWidget) {
        return data != oldWidget.data; // Notifică dacă datele s-au schimbat
      }
    }
    
  2. Plasați InheritedWidget în arborele de widget-uri:

    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MyInheritedWidget( // Înveliți arborele de widget-uri
          data: 'Salut din InheritedWidget',
          child: MaterialApp(
            title: 'Demo InheritedWidget',
            home: Scaffold(
              appBar: AppBar(
                title: const Text('Demo InheritedWidget'),
              ),
              body: const Center(
                child: MyDependentWidget(), // Widget care va folosi datele
              ),
            ),
          ),
        );
      }
    }
    
  3. Accesați datele dintr-un widget copil:

    class MyDependentWidget extends StatelessWidget {
      const MyDependentWidget({super.key});
    
      @override
      Widget build(BuildContext context) {
        // Accesul la date se face cu metoda of()
        final String receivedData = MyInheritedWidget.of(context).data;
    
        return Text(
          receivedData,
          style: Theme.of(context).textTheme.headlineMedium,
        );
      }
    }
    

InheritedWidget stă la baza multor soluții de gestionare a stării în Flutter, precum Provider, Bloc. Oferă o modalitate eficientă și declarativă de a schimba datele în arborele de widget-uri.