Extensions of ChangeNotifier and ValueNotifier that allow for temporarily muting the notifier in question.

MuteableChangeNotifier/MuteableValueNotifier.muteNext() mutes only the next call to "notifyListeners," and then returns to the previous mute state, whether it was muted or unmuted.

MuteableChangeNotifier/MuteableValueNotifier.mute() and .unmute() toggle the mute state on and off.

MuteableChangeNotifier/MuteableValueNotifier.doMuted(Function fn) mutes the notifier, executes the function, then returns to the previous mute state.

Getting Started

Create a subclass of MuteableChangeNotifier or MuteableValueNotifier.

class MyChangeNotifier extends MuteableChangeNotifier {
  String _field;
  String get field => _field;

  void setField(String newValue) {
    if (newValue == _field) {
    _field = newValue;


class MyStringValueNotifier extends MuteableValueNotifier<String> {
  MyStringValueNotifier(String value) : super(value);

You can then use the various mute functions to "turn off" any calls to notifyListeners while the classes are muted.

var muteableChangeNotifier = new MyChangeNotifier(field: "initial field value");

// someListenerFunction is called.
muteableChangeNotifier.field = "second value";

// someListenerFunction is NOT called due to `muteNext`, but `field` is still updated.
muteableChangeNotifier.field = "third field value";

// someListenerFunction IS called, as only the previous call was muted by `muteNext`.
muteableChangeNotifier.field = "fourth field value";

// someListenerFunction is NOT called until `muteableChangeNotifier.unmute()` is invoked.
muteableChangeNotifier.field = "fifth field value";
muteableChangeNotifier.field = "sixth field value";
muteableChangeNotifier.field = "seventh field value";

// someListenerFunction IS called, now that the notifier has been unmuted.
muteableChangeNotifier.field = "final field value";