파파비의 블로그
플러터, flutter) Provider를 사용하는 방법 본문
Provider는 사실 Data Provider를 말한다.
따라서 Data를 관리할 새로운 Class가 필요하다.
(보통 model 폴더를 만들거나 provider 폴더를 만들어서 거기에 dart 파일을 만들고
data provider class를 만든다.)
< Data Provider Class를 만드는 방법 >
1) ChangeNotifier를 상속(?) 하는 Mixin으로 Class를 만든다.
(Mixin을 만들 때는 with를 사용한다)
이렇게 되면 of(context)를 이용하여 다른 위젯들과 직접 연결되는 통로를 만들 수 있게 된다.
2) Data는 전부 Data Provider Class 내에서 제공/수정이 이루어져야 한다.
우리는 Data Provider Class의 객체를 통해 data를 제공받고, 수정하고 할 것이다.
따라서 data를 제공하거나 수정을 할 수 있는 메소드들을 만들어 놓고,
추가적으로 완료가 다 되면 구독자들에게 알려야 한다. (notifyListeners() 실행)
<참고 notifyListeners()>
- 구독하고 있는 위젯들이 전부 rebuild된다.
< Data Provider Class 객체를 Provider를 통해 공유하는 방법 >
1) Provider가 위치할 곳 정하기
- Provider의 data를 얻고 싶은 위젯들을 파악
- 그러한 위젯들 중 가장 최상위 위젯에 위치시켜야 함.
- Provider는 위젯트리상 아래 위젯들에게 data를 공유할 수 있음
2) 정했다면 필요한 package들 import 하기 (2개)
- 하나는 provider package;
- 다른 하나는 우리가 만든 Data Provider Class
3) 위젯에 build메소드 가장 먼저 return되는 위젯을 ChangeNotifierProvider으로 감싸기
4) ChangeNotifierProvider의 create 속성에 (context) => Data Provider Class객체생성
- 객체를 생성했고, 이제 구독하면 이 객체에 접근이 가능하다는 의미이다.
이렇게 하면 된다.
< 공유된 Provider를 구독하는 방법>
>> Provider.of<T>(context)를 활용한다.
- T는 공유하는 Data Provider Class의 타입을 의미한다.
(공유하려는 provider가 한 두개가 아닐 수 있다. 따라서 타입을 통해 확실하게 정할 수 있다)
- Provider.of<T>(context)는 ChangeNotifierProvider에서 builder에서 공유한 객체가 도출된다.
- 해당 객체에 원하는 data를 받거나, 수정을 하거나 하면 된다.
- 특히 data를 원하는 위젯만 따로 Provider.of<T>(context)을 읽게 dart파일을 따로 만들어서 해두면
더욱 정교하게 필요한 위젯만 rebuild하게 할 수 있다.
이제 ProductGrid 위젯을 사용하면
ProductGrid 위젯은 상위 위젯으로 올라가면서 Product 타입의 Provider를 계속 찾아나갈 것이다.
위젯트리상 조건에 맞으면서 가장 가까운 provider가 제공된다.
또한 provider가 notifyListeners() 를 실행하면 딱 ProductGrid 위젯를 포함하여 구독하고 있는 위젯들만 rebuild된다.
그 주변에 ProductGrid 위젯의 직속 상위 위젯이나 이런 것들도 구독하고 있지 않다면 rebuild되지 않는다.
< 참고1. Provider는 객체만 공유가능할까? >
: NO
> ChangeNotifier Mixin을 상속받지 않고, 그냥 data를 공유하는 것도 가능하다.
방법은
1) data를 공유하려는 위젯은 ChangeNotifierProvider 대신, Provider<T> 위젯을 사용하면 된다.
T는 공유하려는 data type 의미한다. 따라서 String 값을 공유하려면 Provider<String>이 된다.
2) 똑같이 create안에는 (context) => 'string data' 이런 식으로 string data를 build해두면 된다.
3) data를 읽는 방법은 똑같다. Provider.of<String>(context) 를 하면 공유된 String 값이 나오게 된다.
다만, 이 방법은 읽기만 가능하다.
notifyListeners() 라는 개념은 ChangeNotifier mixin에 존재하기 때문이다.
따라서 수정하거나 등의 여러 메소드를 포함하여 다양한 data를 공유하기 위해선,
ChangeNotifier 를 상속한 class의 객체를 ChangeNotifierProvider 위젯을 통해 공유해야 한다.
<참고 2. data에 접근해서 한번만 구독하고 그 이후로는 업데이트를 안받을 수도 있다.>
시스템상 글로벌 data를 통해 한 번 빌드하고 그 이후로는 rebuild가 필요하지 않을 수 있다.
그럴 경우 Provider.of<T>(context, listen : false) 로 해두면 구독이 되지 않는다.
딱 한번 build 될 때 data에 접근 가능하며 그 이후로는 rebuild가 되지 않는다.
'개발 > flutter' 카테고리의 다른 글
플러터, flutter) Provider 객체를 공유하는 다른 방법 (context를 쓰지 않을 때) (0) | 2020.06.08 |
---|---|
플러터, flutter) Nested Provider(Widget State 수준) 사용하기 (0) | 2020.06.08 |
플러터, flutter) - Flutter은 전부 레퍼런스 타입... 그 와중에 List를 복사해서 전달하는 방법 (0) | 2020.06.07 |
플러터, flutter) Provider를 사용하는 이유 2가지 (0) | 2020.06.07 |
플러터, flutter) Grid형제들 - Gridview, GridTile, GridTileBar (0) | 2020.06.07 |