ChangeNotifierProvider<T extends ChangeNotifier> class

Listens to a ChangeNotifier, expose it to its descendants and rebuilds dependents whenever the 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: ...
)
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 your updating variable comes from a provider, consider using ChangeNotifierProxyProvider. Otherwise, consider making a StatefulWidget and managing your ChangeNotifier manually.

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
Implemented types

Constructors

ChangeNotifierProvider({Key key, @required ValueBuilder<T> create, @Deprecated('will be removed in 4.0.0, use create instead') ValueBuilder<T> builder, 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

child Widget
The widget that is below the current ListenableProvider widget in the tree. [...]
final, inherited
delegate ValueStateDelegate<T>
The current state of DelegateWidget. [...]
@protected, read-only, inherited
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
cloneWithChild(Widget child) ListenableProvider<T>
Clones the current provider with a new child. [...]
inherited
createElement() StatefulElement
Creates a StatefulElement to manage this widget's location in the tree. [...]
inherited
createState() → _DelegateWidgetState
Creates the mutable state for this widget at a given 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