Sobes.tech
Middle

Šta je InheritedWidget i kako ga koristiti u Flutteru?

sobes.tech АИ

Одговор од АИ

InheritedWidget je poseban tip widget-a u Flutter-u koji omogućava efikasno širenje informacija naniže kroz drvo widget-a. Koristi se za pružanje podataka i usluga podstablu widget-a bez potrebe da ih eksplicitno prosleđujete kroz konstruktore svakog međuvrstnog widget-a.

Ključne osobine InheritedWidget:

  • Efikasno širenje podataka: Kada se promeni InheritedWidget, Flutter automatski rekonstruira samo one widget-e u podstablu koji zavise od njega.
  • Jednostavan pristup podacima: Dječiji widget-i mogu pristupiti podacima InheritedWidget-a pomoću statičke metode of().
  • Upravljanje zavisnostima: Metoda updateShouldNotify omogućava kontrolu kada bi zavisni widget-i trebalo da budu rekonstruisani.

Kako koristiti InheritedWidget:

  1. Kreirajte klasu koja nasleđuje od InheritedWidget:

    class MyInheritedWidget extends InheritedWidget {
      const MyInheritedWidget({
        Key? key,
        required this.data,
        required Widget child,
      }) : super(key: key, child: child);
    
      final String data; // Podaci koji će biti distribuirani
    
      // Metod za dobijanje instance InheritedWidget
      static MyInheritedWidget of(BuildContext context) {
        final MyInheritedWidget? result = context.dependOnInheritedWidgetOfExactType<MyInheritedWidget>();
        assert(result != null, 'No MyInheritedWidget found in context');
        return result!;
      }
    
      // Određuje da li treba obavestiti zavisne widget-e o promenama
      @override
      bool updateShouldNotify(MyInheritedWidget oldWidget) {
        return data != oldWidget.data; // Obaveštavamo ako su podaci promenjeni
      }
    }
    
  2. Postavite InheritedWidget u drvo widget-a:

    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MyInheritedWidget( // Omotava podstablo widget-a
          data: 'Zdravo iz InheritedWidget',
          child: MaterialApp(
            title: 'InheritedWidget Demo',
            home: Scaffold(
              appBar: AppBar(
                title: const Text('InheritedWidget Demo'),
              ),
              body: const Center(
                child: MyDependentWidget(), // Widget koji će koristiti podatke
              ),
            ),
          ),
        );
      }
    }
    
  3. Pristupite podacima iz detetovog widget-a:

    class MyDependentWidget extends StatelessWidget {
      const MyDependentWidget({super.key});
    
      @override
      Widget build(BuildContext context) {
        // Dobijamo pristup podacima pomoću metode of()
        final String receivedData = MyInheritedWidget.of(context).data;
    
        return Text(
          receivedData,
          style: Theme.of(context).textTheme.headlineMedium,
        );
      }
    }
    

InheritedWidget je osnova za mnoga rešenja za upravljanje stanjem u Flutter-u, kao što su Provider, Bloc. On obezbeđuje efikasan i deklarativan način razmene podataka u drvetu widget-a.