ChangeNotifierProvider<T extends ChangeNotifier> class

Listens to a ChangeNotifier, expose it to its descendants and rebuilds dependents whenever ChangeNotifier.notifyListeners is called.

Depending on wether you want to create or reuse a ChangeNotifier, you will want to use different constructors.

Creating a ChangeNotifier:

To create a value, use the default constructor. Creating the instance inside build using ChangeNotifierProvider.value will lead to memory leaks and potentially undesired side-effects.

See this stackoverflow answer which explains in further details why using the .value constructor to create values is undesired.

ChangeNotifierProvider(
  create: (_) => new MyChangeNotifier(),
  child: ...
)
  • DON'T use ChangeNotifierProvider.value to create your ChangeNotifier.
ChangeNotifierProvider.value(
  value: new MyChangeNotifier(),
  child: ...
)
  • DON'T create your ChangeNotifier from variables that can change over the time.

    In such situation, your ChangeNotifier would never be updated when the value changes.

int count;

ChangeNotifierProvider(
  create: (_) => new MyChangeNotifier(count),
  child: ...
)

If you want to pass variables to your ChangeNotifier, consider using ChangeNotifierProxyProvider.

Reusing an existing instance of ChangeNotifier:

If you already have an instance of ChangeNotifier and want to expose it, you should use ChangeNotifierProvider.value instead of the default constructor.

Failing to do so may dispose the ChangeNotifier when it is still in use.

MyChangeNotifier variable;

ChangeNotifierProvider.value(
  value: variable,
  child: ...
)
  • DON'T reuse an existing ChangeNotifier using the default constructor
MyChangeNotifier variable;

ChangeNotifierProvider(
  create: (_) => variable,
  child: ...
)

See also:

Inheritance

Constructors

ChangeNotifierProvider({Key key, @required Create<T> create, bool lazy, Widget child})
Creates a ChangeNotifier using create and automatically dispose it when ChangeNotifierProvider is removed from the widget tree. [...]
ChangeNotifierProvider.value({Key key, @required T value, Widget child})
Provides an existing ChangeNotifier.

Properties

hashCode → int
The hash code for this object.
read-only, inherited
key Key
Controls how one widget replaces another widget in the tree.
final, inherited
runtimeType → Type
A representation of the runtime type of the object.
read-only, inherited

Methods

build(BuildContext context) Widget
Describes the part of the user interface represented by this widget. [...]
inherited
buildWithChild(BuildContext context, Widget child) Widget
A build method that receives an extra child parameter. [...]
inherited
createElement() → _InheritedProvderElement<T>
Creates a StatelessElement to manage this widget's location in the tree. [...]
inherited
debugDescribeChildren() → List<DiagnosticsNode>
Returns a list of DiagnosticsNode objects describing this node's children.
@protected, inherited
debugFillProperties(DiagnosticPropertiesBuilder properties) → void
Add additional properties associated with the node. [...]
inherited
noSuchMethod(Invocation invocation) → dynamic
Invoked when a non-existent method or property is accessed.
inherited
toDiagnosticsNode({String name, DiagnosticsTreeStyle style}) DiagnosticsNode
Returns a debug representation of the object that is used by debugging tools and by DiagnosticsNode.toStringDeep.
inherited
toString({DiagnosticLevel minLevel: DiagnosticLevel.debug}) → String
Returns a string representation of this object.
inherited
toStringDeep({String prefixLineOne: '', String prefixOtherLines, DiagnosticLevel minLevel: DiagnosticLevel.debug}) → String
Returns a string representation of this node and its descendants.
inherited
toStringShallow({String joiner: ', ', DiagnosticLevel minLevel: DiagnosticLevel.debug}) → String
Returns a one-line detailed description of the object.
inherited
toStringShort() → String
A short, textual description of this widget.
inherited

Operators

operator ==(dynamic other) → bool
The equality operator.
inherited