Sobes.tech
Middle

Was ist InheritedWidget und wie verwendet man es in Flutter?

sobes.tech KI

Antwort von AI

InheritedWidget ist ein spezieller Widget-Typ in Flutter, der es ermöglicht, Informationen effizient nach unten im Widget-Baum zu verbreiten. Er wird verwendet, um Daten und Dienste an Unterbäume von Widgets bereitzustellen, ohne sie explizit durch die Konstruktoren jedes Zwischen-Widgets zu übergeben.

Wichtige Merkmale von InheritedWidget:

  • Effiziente Datenverteilung: Wenn sich InheritedWidget ändert, baut Flutter nur die Widgets im Unterbaum neu auf, die davon abhängen.
  • Einfacher Zugriff auf Daten: Kind-Widgets können auf die Daten von InheritedWidget über die statische Methode of() zugreifen.
  • Verwaltung von Abhängigkeiten: Die Methode updateShouldNotify ermöglicht es, zu steuern, wann abhängige Widgets neu aufgebaut werden sollen.

So verwendet man InheritedWidget:

  1. Erstellen einer Klasse, die von InheritedWidget erbt:

    class MyInheritedWidget extends InheritedWidget {
      const MyInheritedWidget({
        Key? key,
        required this.data,
        required Widget child,
      }) : super(key: key, child: child);
    
      final String data; // Daten, die verteilt werden
    
      // Methode zum Zugriff auf die Instanz von InheritedWidget
      static MyInheritedWidget of(BuildContext context) {
        final MyInheritedWidget? result = context.dependOnInheritedWidgetOfExactType<MyInheritedWidget>();
        assert(result != null, 'Kein MyInheritedWidget im Kontext gefunden');
        return result!;
      }
    
      // Bestimmt, ob abhängige Widgets bei Änderungen benachrichtigt werden sollen
      @override
      bool updateShouldNotify(MyInheritedWidget oldWidget) {
        return data != oldWidget.data; // Benachrichtigt bei Datenänderung
      }
    }
    
  2. Einfügen von InheritedWidget in den Widget-Baum:

    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MyInheritedWidget( // Umhüllt den Widget-Unterbaum
          data: 'Hallo von InheritedWidget',
          child: MaterialApp(
            title: 'InheritedWidget Demo',
            home: Scaffold(
              appBar: AppBar(
                title: const Text('InheritedWidget Demo'),
              ),
              body: const Center(
                child: MyDependentWidget(), // Widget, das die Daten nutzt
              ),
            ),
          ),
        );
      }
    }
    
  3. Zugriff auf Daten im Kind-Widget:

    class MyDependentWidget extends StatelessWidget {
      const MyDependentWidget({super.key});
    
      @override
      Widget build(BuildContext context) {
        // Zugriff auf Daten mittels of()
        final String receivedData = MyInheritedWidget.of(context).data;
    
        return Text(
          receivedData,
          style: Theme.of(context).textTheme.headlineMedium,
        );
      }
    }
    

InheritedWidget ist die Grundlage für viele Zustandsmanagement-Lösungen in Flutter, wie Provider, Bloc. Es bietet eine effiziente und deklarative Möglichkeit, Daten im Widget-Baum auszutauschen.