Flutter StateNotifier LocatorMixin

이건선·2023년 7월 17일
0

Flutter

목록 보기
15/30

ProxyProvider

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)),
      ],
      
...

StateNotifierProvider

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는 전통적인 객체지향 패턴을 따르고 있습니다. 상태와 로직이 한 곳에서 관리되며, 상태 변경을 위한 메서드를 클래스 내부에 정의합니다.

LocatorMixin

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;
    
...
profile
멋지게 기록하자

0개의 댓글