InheritedWidget: hər library-nin təməli
InheritedWidget — widget ağacında yuxarıdan aşağıya məlumat ötürməyin Flutter-in özündəki mexanizmidir. Rəsmi sənəd onu belə təsvir edir: ata-baba və uşaq widget-lər arasında əlaqə üçün aşağı səviyyəli yanaşma; `package:provider` və bir çox digər yanaşma altda bundan istifadə edir.
İki hərəkəti var:
- Oxumaq —
context.dependOnInheritedWidgetOfExactType<MyScope>(). Bu çağırış həm dəyəri qaytarır, həm də cari element-i həminInheritedWidget-ə abunə edir. - Bildirmək — widget yenidən quruldqda Flutter
updateShouldNotify(oldWidget)metodunu çağırır.trueqaytarsa, abunə olmuş bütün element-lərmarkNeedsBuildilə rebuild olunur.
class ThemeScope extends InheritedWidget {
const ThemeScope({
super.key,
required this.isDark,
required super.child,
});
final bool isDark;
/// Ənənəvi `of` pattern-i: oxuyan həm dəyəri alır, həm abunə olur.
static ThemeScope of(BuildContext context) {
final scope = context.dependOnInheritedWidgetOfExactType<ThemeScope>();
assert(scope != null, 'ThemeScope tapılmadı — ağacın yuxarısına əlavə edin');
return scope!;
}
/// Yalnız bu şərt true olduqda abunəçilər rebuild olunur.
@override
bool updateShouldNotify(ThemeScope oldWidget) => isDark != oldWidget.isDark;
}
// İstifadə: rebuild yalnız isDark dəyişdikdə baş verir.
final isDark = ThemeScope.of(context).isDark;Minimal InheritedWidget — Provider-in "sehri"nin bütün mahiyyəti bu 20 sətirdədir.
| Sinif | Nə verir | Tipik istifadə |
|---|---|---|
| `InheritedWidget` | Ağacda O(1) axtarış + `updateShouldNotify` ilə tam bildiriş | Dəyişməz və ya nadir dəyişən konfiqurasiya |
| `InheritedModel` | Aspect-lərə bölünmüş bildiriş — abunəçi yalnız maraqlandığı hissəyə görə oyanır | Bir scope-da bir neçə müstəqil dəyər |
| `InheritedNotifier` | `Listenable`-ı ağaca bağlayır: notifier xəbər verdikdə abunəçilər rebuild olunur | `ValueNotifier`/`ChangeNotifier` əsaslı öz-özünə yazılmış scope |
Müsahibə üçün açar cümlə: package:provider özünü "InheritedWidget-in üzərində daha rahat və təkrar istifadəyə yararlı örtük" kimi təsvir edir, package:flutter_bloc isə BlocProvider, MultiBlocProvider və RepositoryProvider-i package:provider ilə həyata keçirir və onun context.read/watch/select extension-larını yenidən export edir. Yəni "Provider yoxsa BLoC?" sualı əslində "eyni mexanizmin hansı örtüyü?" sualıdır.
📚 Mənbələr və sənədlər
- State management seçimləri (InheritedWidget bölməsi)rəsmidocs.flutter.dev
InheritedWidget-in "digər yanaşmaların altında duran" mexanizm olduğunu bildirən rəsmi mətn.
- InheritedWidget API sənədirəsmiapi.flutter.dev
- package:providerrəsmipub.dev
Paketin öz təsviri: InheritedWidget üzərində örtük.
- flutter_bloc: extension metodlarırəsmibloclibrary.dev
flutter_bloc-un package:provider-dən asılı olduğunu və onun extension-larını export etdiyini göstərən bölmə.