Sobes.tech
Middle

Co je InheritedWidget a jak jej používat ve Flutteru?

sobes.tech AI

Odpověď od AI

InheritedWidget je speciální typ widgetu ve Flutteru, který umožňuje efektivně šířit informace dolů po stromu widgetů. Používá se k poskytování dat a služeb podstromu widgetů bez nutnosti je explicitně předávat přes konstruktory každého mezilehlého widgetu.

Klíčové vlastnosti InheritedWidget:

  • Efektivní šíření dat: Při změně InheritedWidget Flutter automaticky přestavuje pouze ty widgety v podstromu, které na něj závisí.
  • Jednoduchý přístup k datům: Dětské widgety mohou získat přístup k datům InheritedWidget pomocí statické metody of().
  • Správa závislostí: Metoda updateShouldNotify umožňuje kontrolovat, kdy by měly být přestavěny závislé widgety.

Jak používat InheritedWidget:

  1. Vytvořte třídu, která dědí od InheritedWidget:

    class MyInheritedWidget extends InheritedWidget {
      const MyInheritedWidget({
        Key? key,
        required this.data,
        required Widget child,
      }) : super(key: key, child: child);
    
      final String data; // Data, která budou rozšířena
    
      // Metoda pro získání instance InheritedWidget
      static MyInheritedWidget of(BuildContext context) {
        final MyInheritedWidget? result = context.dependOnInheritedWidgetOfExactType<MyInheritedWidget>();
        assert(result != null, 'No MyInheritedWidget found in context');
        return result!;
      }
    
      // Určuje, zda by měly být upozorněny závislé widgety na změny
      @override
      bool updateShouldNotify(MyInheritedWidget oldWidget) {
        return data != oldWidget.data; // Upozornit, pokud se data změnila
      }
    }
    
  2. Umístěte InheritedWidget do stromu widgetů:

    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MyInheritedWidget( // Obaluje podstrom widgetů
          data: 'Ahoj z InheritedWidget',
          child: MaterialApp(
            title: 'InheritedWidget Demo',
            home: Scaffold(
              appBar: AppBar(
                title: const Text('InheritedWidget Demo'),
              ),
              body: const Center(
                child: MyDependentWidget(), // Widget, který bude používat data
              ),
            ),
          ),
        );
      }
    }
    
  3. Získat přístup k datům z dětského widgetu:

    class MyDependentWidget extends StatelessWidget {
      const MyDependentWidget({super.key});
    
      @override
      Widget build(BuildContext context) {
        // Získáváme přístup k datům pomocí metody of()
        final String receivedData = MyInheritedWidget.of(context).data;
    
        return Text(
          receivedData,
          style: Theme.of(context).textTheme.headlineMedium,
        );
      }
    }
    

InheritedWidget je základem pro mnoho řešení správy stavu ve Flutteru, jako jsou Provider, Bloc. Zajišťuje efektivní a deklarativní způsob výměny dat v stromu widgetů.