of<T extends PropertyChangeNotifier<S>, S extends Object> static method

PropertyChangeModel<T, S>? of<T extends PropertyChangeNotifier<S>, S extends Object>(
  1. BuildContext context, {
  2. Iterable<S>? properties,
  3. bool listen = true,
})

Retrieves the PropertyChangeModel from the nearest ancestor PropertyChangeProvider. If listen is true (which is the default), the calling widget will also be rebuilt whenever the ancestor's PropertyChangeNotifier model changes. To only rebuild for certain properties, provide them in the properties parameter. If listen is false, the properties parameter must be null or empty.

Implementation

static PropertyChangeModel<T, S>? of<T extends PropertyChangeNotifier<S>, S extends Object>(
  BuildContext context, {
  Iterable<S>? properties,
  bool listen = true,
}) {
  assert(listen || properties == null, "Don't provide properties if you're not going to listen to them.");

  PropertyChangeModel<T, S>? nullCheck(PropertyChangeModel<T, S>? model) {
    assert(model != null, 'Could not find an ancestor PropertyChangeProvider<$T, $S>');
    return model;
  }

  if (!listen) {
    return nullCheck(context.findAncestorWidgetOfExactType<PropertyChangeModel<T, S>>());
  }

  if (properties == null || properties.isEmpty) {
    return nullCheck(context.dependOnInheritedWidgetOfExactType<PropertyChangeModel<T, S>>());
  }

  PropertyChangeModel<T, S>? widget;
  for (final property in properties) {
    widget = InheritedModel.inheritFrom<PropertyChangeModel<T, S>>(context, aspect: property);
  }

  return nullCheck(widget);
}