파파비의 블로그

플러터, flutter) Provider를 사용하는 방법 본문

개발/flutter

플러터, flutter) Provider를 사용하는 방법

N. Dave 2020. 6. 7. 20:39
반응형

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가 되지 않는다.

반응형
Comments