Sobes.tech
Middle

Czym jest InheritedWidget i jak go używać w Flutter?

sobes.tech AI

Odpowiedź od AI

InheritedWidget to specjalny typ widżetu w Flutterze, który pozwala na efektywne rozpowszechnianie informacji w dół drzewa widżetów. Służy do dostarczania danych i usług poddrzewom widżetów bez konieczności jawnego przekazywania ich przez konstruktory każdego widżetu pośredniego.

Kluczowe cechy InheritedWidget:

  • Efektywne rozpowszechnianie danych: Gdy InheritedWidget się zmienia, Flutter automatycznie przebudowuje tylko te widżety w poddrzewie, które od niego zależą.
  • Prosty dostęp do danych: Widżety potomne mogą uzyskać dostęp do danych InheritedWidget za pomocą metody statycznej of().
  • Zarządzanie zależnościami: Metoda updateShouldNotify pozwala kontrolować, kiedy widżety zależne powinny zostać przebudowane.

Jak używać InheritedWidget:

  1. Stwórz klasę dziedziczącą po InheritedWidget:

    class MyInheritedWidget extends InheritedWidget {
      const MyInheritedWidget({
        Key? key,
        required this.data,
        required Widget child,
      }) : super(key: key, child: child);
    
      final String data; // Dane do rozpowszechnienia
    
      // Metoda do uzyskania instancji InheritedWidget
      static MyInheritedWidget of(BuildContext context) {
        final MyInheritedWidget? result = context.dependOnInheritedWidgetOfExactType<MyInheritedWidget>();
        assert(result != null, 'Nie znaleziono MyInheritedWidget w kontekście');
        return result!;
      }
    
      // Określa, czy powiadamiać zależne widżety o zmianach
      @override
      bool updateShouldNotify(MyInheritedWidget oldWidget) {
        return data != oldWidget.data; // Powiadom, jeśli dane się zmieniły
      }
    }
    
  2. Umieść InheritedWidget w drzewie widżetów:

    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MyInheritedWidget( // Otacza drzewo widżetów
          data: 'Cześć z InheritedWidget',
          child: MaterialApp(
            title: 'Demo InheritedWidget',
            home: Scaffold(
              appBar: AppBar(
                title: const Text('Demo InheritedWidget'),
              ),
              body: const Center(
                child: MyDependentWidget(), // Widget korzystający z danych
              ),
            ),
          ),
        );
      }
    }
    
  3. Uzyskaj dostęp do danych z widgetu potomnego:

    class MyDependentWidget extends StatelessWidget {
      const MyDependentWidget({super.key});
    
      @override
      Widget build(BuildContext context) {
        // Uzyskaj dostęp do danych za pomocą metody of()
        final String receivedData = MyInheritedWidget.of(context).data;
    
        return Text(
          receivedData,
          style: Theme.of(context).textTheme.headlineMedium,
        );
      }
    }
    

InheritedWidget jest podstawą dla wielu rozwiązań zarządzania stanem w Flutterze, takich jak Provider, Bloc. Zapewnia efektywny i deklaratywny sposób wymiany danych w drzewie widżetów.