createSelectListener<N extends StateNotifier<S>, S, R> function

void createSelectListener<N extends StateNotifier<S>, S, R>(
  1. SelectFilteredProvider<N, S, R> filter
)

create the listener for provider.select filter (StateProvider)

Implementation

void createSelectListener<N extends StateNotifier<S>, S, R>(
  SelectFilteredProvider<N, S, R> filter,
) {
  R prevValue = filter.callback(filter.notifier.state);
  filter.selectValue = prevValue;

  filter.listener = (newState) {
    final value = filter.callback(filter.notifier.state);
    if (filter.listenWhenTheCallbackReturnsTrue) {
      assert(
        value is bool,
        'The value returned by the callback must be a boolean because '
        'listenWhenTheCallbackReturnsTrue is true',
      );
    }

    filter.selectValue = value;

    bool allowRebuild = false;
    if (value is bool && filter.listenWhenTheCallbackReturnsTrue) {
      allowRebuild = value;
    } else if (prevValue != value) {
      allowRebuild = true;
    }

    // check if the value has changed
    if (allowRebuild && filter.reaction != null) {
      filter.reaction!(filter.notifier);
    }
    prevValue = value;
  };
}