Sparround

Listenable, ChangeNotifier, ValueNotifier

Listenable — Flutter-in observer interfeysidir: addListenerremoveListener. Bütün state management library-lərinin "dəyişiklik xəbəri" hissəsi ya bu interfeysin, ya da Stream-in üzərində qurulur.

  • `ChangeNotifier`Listenable-ın hazır implementasiyası. Siz notifyListeners() çağırırsınız, o da bütün dinləyiciləri xəbərdar edir. Nə dəyişdiyini bildirmir — sadəcə "nəsə dəyişdi" siqnalıdır.
  • `ValueNotifier<T>` — bir dəyər saxlayan ChangeNotifier. value setter-i yeni dəyəri köhnəsi ilə == operatoru vasitəsilə müqayisə edir və yalnız fərq olduqda xəbər verir.
  • `ListenableBuilder` / `ValueListenableBuilder` — bu siqnalları UI-a bağlayan widget-lər: yalnız builder-in içindəki hissə rebuild olunur.

Rəsmi Flutter sənədi ValueNotifier + InheritedNotifier cütlüyünü ayrıca yanaşma kimi sadalayır: state-i yeniləmək və UI-a xəbər vermək üçün yalnız Flutter-in öz API-larından istifadə edən yanaşma.

dart
class CounterView extends StatefulWidget {
  const CounterView({super.key});
  @override
  State<CounterView> createState() => _CounterViewState();
}

class _CounterViewState extends State<CounterView> {
  final _count = ValueNotifier<int>(0);

  @override
  void dispose() {
    _count.dispose(); // notifier-i sökmək listener sızmasının qarşısını alır
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        const ExpensiveHeader(), // rebuild olunmur
        ValueListenableBuilder<int>(
          valueListenable: _count,
          builder: (context, value, _) => Text('$value'),
        ),
        ElevatedButton(
          onPressed: () => _count.value++,
          child: const Text('Artır'),
        ),
      ],
    );
  }
}

Library olmadan lokal reaktivlik — `ValueListenableBuilder` yalnız `Text`-i yeniləyir.

Ən tez-tez rastlanan tələ: ValueNotifier<List<T>> içində siyahını add ilə dəyişmək. value eyni obyektə göndərmə olaraq qalır, == fərq görmür və heç bir bildiriş getmir. Həlli — hər dəfə yeni siyahı təyin etmək: notifier.value = [...notifier.value, item]. Bu, immutable state-in niyə vacib olduğunun ən kiçik və ən aydın nümunəsidir.

AlətBildiriş dəqiqliyiNə vaxt kifayətdir
`setState`Bütün `build` metodu yenidən işləyirKiçik widget, sadə ephemeral state
`ValueNotifier` + `ValueListenableBuilder`Yalnız builder-in içi; `==` ilə süzgəcBir dəyər, ekran daxilində
`ChangeNotifier` + `ListenableBuilder`"Nəsə dəyişdi" — hansı sahə olduğunu bilmirsinizBir neçə sahəli model, orta mürəkkəblik
Provider / Riverpod / BLoCScope + seçmə (select) + ömür idarəsiEkranlar arası paylaşılan, async, test olunan state

📚 Mənbələr və sənədlər