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.

  • DO create a new ChangeNotifier inside create.
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, TransitionBuilder? builder, Component? child})
Creates a ChangeNotifier using create and automatically disposes it when ChangeNotifierProvider is removed from the component tree.
ChangeNotifierProvider.value({Key? key, required T value, TransitionBuilder? builder, Component? 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 component replaces another component in the tree.
finalinherited
runtimeType Type
A representation of the runtime type of the object.
no setterinherited

Methods

build(BuildContext context) Iterable<Component>
Describes the part of the user interface represented by this component.
inherited
buildWithChild(BuildContext context, Component? child) Iterable<Component>
A build method that receives an extra child parameter.
inherited
createElement() → _InheritedProviderElement<T>
Creates a StatelessElement to manage this component's location in the tree.
inherited
noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
toString() String
A string representation of this object.
inherited

Operators

operator ==(Object other) bool
The equality operator.
inherited