팀(Tim)
개발자의 글쓰기
팀(Tim)
전체 방문자
오늘
어제
  • 분류 전체보기 (49)
    • 알고리즘 (2)
    • 개발전반 (1)
    • 안드로이드 앱개발 (25)
    • 코틀린 (1)
    • C++ (11)
    • Unity (0)
    • 공지사항 (4)
    • WebGL (0)
    • Flutter (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • d

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
팀(Tim)

개발자의 글쓰기

Flutter

[플러터] 상태관리 라이브러리들의 동작원리

2021. 9. 4. 23:04

플러터의 상태관리 방법은 대표적으로 세가지가 있다.

 

1. bloc

2. provider

3. getX

 

흔히 이렇게 세가지로 분류하지만, 이 세가지를 구분하는건 의미가 없다.

왜냐하면 provider 나 getX나 결국은 bloc 패턴과 provider패턴을 구현하고 있기 때문이다.

bloc은 그저 비지니스 로직을 담은 컴포넌트이므로 무엇이든 될 수 있다.

예를들어 Provider에서는 Notifier가 bloc이고, GetX에서는 GetXController가 bloc이라고 할 수 있다.

 

# BLoC 패턴

BLoC stands for Business Logic Component.

블록패턴은 비지니스 로직 컴포넌트의 줄인말이다.

Bloc 패턴의 목적은 비지니스 로직과 UI를 분리해서 유지보수하기 쉬운 앱을 만드는데에 있다.

 

백문이 불여일견이라고, 코드부터보자.

 

 

* 코드에 대한 자세한 설명은 https://www.didierboelens.com/2018/08/reactive-programming-streams-bloc/ 여기를 참고하면 된다.

 

bloc는 UI의 상태를 담고있는 컴포넌트이다.

위젯은 그 bloc을 참고해서 데이터를 화면에 보여줄 뿐이다.

또한 StreamBuilder를 활용해서 상태가 변할때 위젯을 부분적으로 업데이트하는 부분도 중요하다.

 

이 포스트에서는 상태관리 라이브러리의 원리에 대해서 다룰 것이기 때문에 여기선 StreamBuilder의 동작에 대해서 살펴보자.

 

 

# Provider

프로바이더 라이브러리는 Notifier와 Provider로 bloc, provider패턴을 구현한다.

Notifier는 bloc역할, Provider는 의존성 주입의 역할을 한다.

기본적으로 위에서 본 bloc를 구현할때 본 코드와 원리는 동일하다.

 

출처 : https://github.com/rrousselGit/provider/blob/master/example/lib/main.dart

 

이제 원리를 살펴보자.

이번 경우는 조금 복잡하다.

 

Count위젯에서 context.watch<Counter> 를 하면 내부적으로

_inheritedElementOf 을 통해 Count 위젯의 조상을 돌면서
_InheritedProviderScopeElement<T> 즉, ChangeNotifierProvider가 만든 Counter 타입의 엘레멘트를 찾아서
context.dependOnInheritedElement(inheritedElement); 를 통해
context 즉, Count 위젯과 연관된 컨텍스트와
inheritedElement 즉, Counter 와 연관된 엘레멘트를 연결한다.
이런 식으로 Count위젯과 Counter가 연결되어 Counter의 notifyListeners() 가 불리면 Count 위젯의 build 메서드가 불리는 것이다.

 

# getX

 

 

'Flutter' 카테고리의 다른 글

Widget, Element, RenderObject  (0) 2021.09.04
스크롤 이벤트 처리하기 [ NotificationListener ]  (0) 2021.09.04
    'Flutter' 카테고리의 다른 글
    • Widget, Element, RenderObject
    • 스크롤 이벤트 처리하기 [ NotificationListener ]
    팀(Tim)
    팀(Tim)

    티스토리툴바