파파비의 블로그

플러터, flutter) Provider 객체를 공유하는 다른 방법 (context를 쓰지 않을 때) 본문

개발/flutter

플러터, flutter) Provider 객체를 공유하는 다른 방법 (context를 쓰지 않을 때)

N. Dave 2020. 6. 8. 10:05
반응형

Provider 객체를 공유할 때,

우리는 

 

ChangeNotifierProvider( create + child)

해서 한다.

 

특히 create 부분에서는 (context) => 객체 

이런식으로 꼭 context를 인수로 넣어야 하는데 만약 객체가 context를 필요로 하지 않는다면?

 

그러면 (context) 대신 (_)로 표기해도 되지만, 다른 방법이 있기도 하다.

 

바로 ChangeNotifierProvider.value 를 사용하는 것.

여기를 value는 멀티생성자를 활용한 것인데, value: 속성에 그냥 공유하고 싶은 값을 넣으면 된다.

 

 

<하지만 주의할 점이 있다!! : 이 부분을 꼭 읽자>

ChangeNotifierProvider 와 ChangeNotifierProvider.value는 쓰임새가 다르다.

 

ChangeNotifierProvider의 create은 객체를 새로 만들어서 공유하는 것이고,

ChangeNotifierProvider.value는 기존에 존재하는 객체를 재사용하는 것이다.

 

예를 들어 위에서는, products[index]를 value로 전달하는데 이 뜻은 

이미 Provider 객체가 어딘가에서 만들어져 있다는 것을 의미한다.

 

만약 List 같은 것들을 위의 상황에서 ChangeNotifierProvider의 create을 통해 만들게 되면,

Provider 객체는 2개가 된다. (그것을 만들기 위해 사용했던 위젯과, 기존에 만들어져 있던 객체)

 

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ여긴 추측 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

근데 문제는, flutter는 화면이 지워졌다가 다시 만들어지면,

그 provider를 재활용한다. 다시 기존에 만들어져 있던 객체를 복사하는 것이 아니다.

 

그러다보니, 기존의 만들어져있던 객체의 값이 변화해서 그 것을 반영해야 하는데도 

예전의 data를 가지고 반영되는 경우가 생긴다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

실제로 flutter는 provider 들의 사용이 필요없어지면 알아서 뒤에서 메모리를 정리해준다.

 

이것을 방지하기위해서, 그리고 메모리 문제를 해결하기 위해서라도 

value는 이미 존재하고 있는 Provider 객체를 연결시키는 것이 좋다.

 

+ 실제로 .value와 그냥버전을 잘못해서 사용하게 되면

undesired result가 나올 수 있다는데

https://stackoverflow.com/questions/52249578/how-to-deal-with-unwanted-widget-build

 

How to deal with unwanted widget build?

For various reasons, sometimes the build method of my widgets is called again. I know that it happens because a parent updated. But this causes undesired effects. A typical situation where it ca...

stackoverflow.com

여기를 참고하라고 provider package에서 그러더라, 근데

솔직히 아직 뭔말인지 몰라서 나중에 다시 제대로 읽어보아야겠다.

반응형
Comments