ChangeNotifierProvider<NotifierT extends ChangeNotifier?> constructor
ChangeNotifierProvider<NotifierT extends ChangeNotifier?> (
- NotifierT _createFn(
- Ref ref
- String? name,
- Iterable<
ProviderOrFamily> ? dependencies, - bool isAutoDispose = false,
- Retry? retry,
Creates a ChangeNotifier
and exposes its current state.
Combined with ChangeNotifier
, ChangeNotifierProvider can be used to manipulate
advanced states, that would otherwise be difficult to represent with simpler
providers such as Provider or FutureProvider.
For example, you may have a todo-list, where you can add and remove
and complete a todo.
Using ChangeNotifier
, you could represent such state as:
class TodosNotifier extends ChangeNotifier {
List<Todo> todos = [];
void add(Todo todo) {
todos.add(todo);
notifyListeners();
}
void remove(String todoId) {
todos.removeWhere((todo) => todo.id == todoId);
notifyListeners();
}
void toggle(String todoId) {
final todo = todos.firstWhere((todo) => todo.id == todoId);
todo.completed = !todo.completed;
notifyListeners();
}
}
Which you can then pass to a ChangeNotifierProvider like so:
final todosProvider = ChangeNotifierProvider<TodosNotifier, List<Todo>>((ref) => TodosNotifier());
And finally, you can interact with it inside your UI:
Component build(BuildContext context) {
// rebuild the widget when the todo list changes
List<Todo> todos = context.watch(todosProvider).todos;
return div([
for (final todo in todos)
CheckboxListTile(
value: todo.completed,
// When tapping on the todo, change its completed status
onChanged: (value) => context.read(todosProvider.notifier).toggle(todo.id),
title: Text(todo.description),
),
]);
}
Implementation
ChangeNotifierProvider(
this._createFn, {
super.name,
super.dependencies,
super.isAutoDispose = false,
super.retry,
}) : super(
$allTransitiveDependencies: computeAllTransitiveDependencies(
dependencies,
),
from: null,
argument: null,
);