ProxyProvider는 여러 개의 다른 Provider들 사이의 의존성을 관리하는데 사용됩니다. 하지만 복잡하게 느껴집니다.
// StateNotifierProvider 사용하지 않음
...
return MultiProvider(
providers: [
ChangeNotifierProvider<TodoFilter>(create: (context) => TodoFilter()),
ChangeNotifierProvider<TodoSearch>(create: (context) => TodoSearch()),
ChangeNotifierProvider<TodoList>(create: (context) => TodoList()),
ProxyProvider<TodoList, ActiveTodoCount>(
update:
(BuildContext context, TodoList todoList, ActiveTodoCount? _) =>
ActiveTodoCount(todoList: todoList)),
ProxyProvider3<TodoFilter, TodoSearch, TodoList, FilteredTodos>(
update: (BuildContext context,
TodoFilter todoFilter,
TodoSearch todoSearch,
TodoList todoList,
FilteredTodos? _) =>
FilteredTodos(
todoSearch: todoSearch,
todoFilter: todoFilter,
todoList: todoList)),
],
...
StateNotifier는 단일 상태를 관리하는 것에 초점을 맞추고 있으며, 이로 인해, 상태를 업데이트하는 방법이 단순하고 직관적이어서, 코드를 읽고 이해하는 데 도움이 됩니다.
// StateNotifierProvider 사용
...
return MultiProvider(
providers: [
StateNotifierProvider<TodoFilter, TodoFilterState>(
create: (context) => TodoFilter()),
StateNotifierProvider<TodoSearch, TodoSearchState>(
create: (context) => TodoSearch()),
StateNotifierProvider<TodoList, TodoListState>(
create: (context) => TodoList()),
StateNotifierProvider<ActiveTodoCount, ActiveTodoCountState>(
create: (context) => ActiveTodoCount()),
StateNotifierProvider<FilteredTodos, FilteredTodosState>(
create: (context) => FilteredTodos())
],
...
StateNotifierProvider는 StateNotifier라는 클래스를 기반으로 작동합니다.
...
class TodoFilterState extends Equatable {
final Filter filter;
TodoFilterState({
required this.filter,
});
factory TodoFilterState.initial() {
return TodoFilterState(filter: Filter.all);
}
...
class TodoFilter extends StateNotifier<TodoFilterState> {
TodoFilter() : super(TodoFilterState.initial());
void changeFilter(Filter newfilter) {
state = state.copyWith(filter: newfilter);
}
}
...
StateNotifierProvider는 전통적인 객체지향 패턴을 따르고 있습니다. 상태와 로직이 한 곳에서 관리되며, 상태 변경을 위한 메서드를 클래스 내부에 정의합니다.
StateNotifier 라이브러리가 제공하는 mixin으로, StateNotifier가 상태 변화를 감지하기 위한 메커니즘을 제공합니다. update 메서드는 이 mixin의 일부로, 상태가 업데이트되어야 할 때 호출되는 메서드입니다. 이 메서드는 'Locator' 타입의 'watch' 함수를 인자로 받습니다.
...
class FilteredTodos extends StateNotifier<FilteredTodosState>
with LocatorMixin {
FilteredTodos() : super(FilteredTodosState.initial());
void update(Locator watch) {
final Filter filter = watch<TodoFilterState>().filter;
final String searchTerm = watch<TodoSearchState>().searchTerm;
final List<Todo> todos = watch<TodoListState>().todos;
List<Todo> _filteredTodos;
...