Sobes.tech
Middle

Mi az az InheritedWidget és hogyan használható a Flutterben?

sobes.tech MI

Válasz az MI-től

InheritedWidget egy speciális típusú widget a Flutterben, amely lehetővé teszi az adatok hatékony terjesztését lefelé a widget fa mentén. Az adatok és szolgáltatások biztosítására szolgál a widget alárendelt részében anélkül, hogy azokat explicit módon át kellene adni minden közbenső widget konstruktorán keresztül.

Az InheritedWidget fő jellemzői:

  • Hatékony adatátvitel: Az InheritedWidget változásakor a Flutter automatikusan újraépíti csak azokat a widgeteket a fa alján, amelyek ettől függenek.
  • Egyszerű hozzáférés az adatokhoz: A gyermek widgetek a of() statikus módszerrel férhetnek hozzá az InheritedWidget adataihoz.
  • Függőségek kezelése: Az updateShouldNotify módszer lehetővé teszi, hogy ellenőrizzük, mikor kell újraépíteni a függő widgeteket.

Hogyan használjuk az InheritedWidget-et:

  1. Hozzon létre egy osztályt, amely öröklődik az InheritedWidget-ből:

    class MyInheritedWidget extends InheritedWidget {
      const MyInheritedWidget({
        Key? key,
        required this.data,
        required Widget child,
      }) : super(key: key, child: child);
    
      final String data; // Az adatok, amelyeket terjeszteni fogunk
    
      // Metódus az InheritedWidget példányának eléréséhez
      static MyInheritedWidget of(BuildContext context) {
        final MyInheritedWidget? result = context.dependOnInheritedWidgetOfExactType<MyInheritedWidget>();
        assert(result != null, 'No MyInheritedWidget found in context');
        return result!;
      }
    
      // Meghatározza, mikor kell értesíteni a függő widgeteket a változásokról
      @override
      bool updateShouldNotify(MyInheritedWidget oldWidget) {
        return data != oldWidget.data; // Értesítünk, ha az adatok megváltoztak
      }
    }
    
  2. Helyezze el az InheritedWidget-et a widget fa struktúrájában:

    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MyInheritedWidget( // Körülveszi a widget fa alját
          data: 'Helló az InheritedWidget-től',
          child: MaterialApp(
            title: 'InheritedWidget Demo',
            home: Scaffold(
              appBar: AppBar(
                title: const Text('InheritedWidget Demo'),
              ),
              body: const Center(
                child: MyDependentWidget(), // Widget, amely az adatokat fogja használni
              ),
            ),
          ),
        );
      }
    }
    
  3. Hozzon hozzáférést az adatokhoz egy gyermek widgetből:

    class MyDependentWidget extends StatelessWidget {
      const MyDependentWidget({super.key});
    
      @override
      Widget build(BuildContext context) {
        // Az adatok eléréséhez a of() módszert használjuk
        final String receivedData = MyInheritedWidget.of(context).data;
    
        return Text(
          receivedData,
          style: Theme.of(context).textTheme.headlineMedium,
        );
      }
    }
    

Az InheritedWidget számos állapotkezelési megoldás alapja Flutterben, mint például a Provider, Bloc. Hatékony és deklaratív módot biztosít az adatok cseréjére a widget fán belül.