ChangeNotifierProvider<T extends ChangeNotifier?> class

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

Depending on whether 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
Implemented types

Constructors

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

Properties

builder TransitionBuilder?
Syntax sugar for obtaining a BuildContext that can read the provider created.
finalinherited
hashCode int
The hash code for this object.
no setterinherited
key Key?
Controls how one widget replaces another widget in the tree.
finalinherited
runtimeType Type
A representation of the runtime type of the object.
no setterinherited

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() → _InheritedProviderElement<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.
inherited
debugFillProperties(DiagnosticPropertiesBuilder properties) → void
Add additional properties associated with the node.
inherited
noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent 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.info}) String
A string representation of this object.
inherited
toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug, int wrapWidth = 65}) 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 ==(Object other) bool
The equality operator.
inherited