Sobes.tech
Middle

Čo je InheritedWidget a ako ho použiť vo Flutteri?

sobes.tech AI

Odpoveď od AI

InheritedWidget je špeciálny typ widgetu vo Flutteri, ktorý umožňuje efektívne šírenie informácií nadol stromom widgetov. Používa sa na poskytovanie dát a služieb podstromu widgetov bez potreby ich explicitne prenášať cez konštruktory každého medzi widgetu.

Kľúčové vlastnosti InheritedWidget:

  • Efektívne šírenie dát: Pri zmene InheritedWidget Flutter automaticky prebuduje len tie widgety v podstrome, ktoré na ňho závisia.
  • Jednoduchý prístup k dátam: Deti widgety môžu získať prístup k dátam InheritedWidget pomocou statickej metódy of().
  • Správa závislostí: Metóda updateShouldNotify umožňuje kontrolovať, kedy by mali byť prebudované závislé widgety.

Ako používať InheritedWidget:

  1. Vytvorte triedu, ktorá dedí od InheritedWidget:

    class MyInheritedWidget extends InheritedWidget {
      const MyInheritedWidget({
        Key? key,
        required this.data,
        required Widget child,
      }) : super(key: key, child: child);
    
      final String data; // Dáta, ktoré budú rozšírené
    
      // Metóda na získanie inštancie InheritedWidget
      static MyInheritedWidget of(BuildContext context) {
        final MyInheritedWidget? result = context.dependOnInheritedWidgetOfExactType<MyInheritedWidget>();
        assert(result != null, 'No MyInheritedWidget found in context');
        return result!;
      }
    
      // Určuje, či by mali byť upozornené závislé widgety na zmeny
      @override
      bool updateShouldNotify(MyInheritedWidget oldWidget) {
        return data != oldWidget.data; // Upozorni, ak sa dáta zmenili
      }
    }
    
  2. Umiestnite InheritedWidget do stromu widgetov:

    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MyInheritedWidget( // Obaluje podstrom widgetov
          data: 'Ahoj z InheritedWidget',
          child: MaterialApp(
            title: 'InheritedWidget Demo',
            home: Scaffold(
              appBar: AppBar(
                title: const Text('InheritedWidget Demo'),
              ),
              body: const Center(
                child: MyDependentWidget(), // Widget, ktorý bude používať dáta
              ),
            ),
          ),
        );
      }
    }
    
  3. Získať prístup k dátam z detského widgetu:

    class MyDependentWidget extends StatelessWidget {
      const MyDependentWidget({super.key});
    
      @override
      Widget build(BuildContext context) {
        // Získavame prístup k dátam pomocou metódy of()
        final String receivedData = MyInheritedWidget.of(context).data;
    
        return Text(
          receivedData,
          style: Theme.of(context).textTheme.headlineMedium,
        );
      }
    }
    

InheritedWidget je základom pre mnoho riešení správy stavu vo Flutteri, ako sú Provider, Bloc. Zabezpečuje efektívny a deklaratívny spôsob výmeny dát v strome widgetov.