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
updateShouldNotifypozwala kontrolować, kiedy widżety zależne powinny zostać przebudowane.
Jak używać InheritedWidget:
-
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 } } -
Umieść
InheritedWidgetw 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 ), ), ), ); } } -
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.