Sparround

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:

  • Oxumaqcontext.dependOnInheritedWidgetOfExactType<MyScope>(). Bu çağırış həm dəyəri qaytarır, həm də cari element-i həmin InheritedWidgetabunə edir.
  • Bildirmək — widget yenidən quruldqda Flutter updateShouldNotify(oldWidget) metodunu çağırır. true qaytarsa, abunə olmuş bütün element-lər markNeedsBuild ilə rebuild olunur.
dart
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.

SinifNə verirTipik 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ırBir 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, MultiBlocProviderRepositoryProvider-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