전역변수, ChangeNotifierPovider
나의 앱은, 어떠한 대상의 별점과 간단한 한줄평을 작성하여 리스트로 보여주는 앱이다.
즉 이 구현에 가장 중요한건,
다른 화면에서 작성한 데이터를
메인 화면으로 "가져와" 출력하는 것이였다.
즉 데이터를 전역변수로 저장하고 전달할 필요가 있었는데,
이 과정을 적용하는게 제법 어려웠다.
"플러터 전역변수"라는 키워드로 찾은결과,
내가 원하는 기능과 가장 흡사한건 ChangeNotifierProvider이란 기능이였다.
사용 방법은 쉽다.
class SimpleState with ChangeNotifier {
int number = 0;
}
ChangeNotifier을 상속하는 클래스를 생성한다.
그럼 해당 클래스에 생성된 변수는
다른 클래스에서 전역변수처럼 어디서든 접근할 수 있다!
이런거나 가르쳐주지.
책은 뭐했담
쨋든 변수만 써 놓으면 안되고,
변수 값을 지정할 setter, 변수에 접근할 getter도 추가해줘야한다.
class SimpleState with ChangeNotifier {
int number = 0;
int get numb => number;
void setnbs(int cn){number = cn; notifyListeners();
}
int get numb => number;
은 number란 변수에 접근할 수 있게해주는 getter다.
물론 이것도 그냥 접근하는건아니고
context.watch<SimpleState>().numb,
위와 같은 메소드와 함께 지정한 numb를 입력하면,
전역변수 number의 값을 참조할 수 있게 된다.
저 watch가 중요한데,
변수의 값 변화를 알아서 측정하고, 적용해주는 기능을 한다.
즉 다른 클래스에서 number 값을 바꾸고, 이를 numb를 통해 저장하면,
number을 출력하는 클래스에선 자동으로 바뀐 값을 출력한다.
아주 편리한 기능이다.
반대로 값을 지정할땐 read를 쓰니, 헷갈리지 말도록 하자.
context.read<SimpleState>().setnbs(1);
setnbs는 값을 지정해주는 메소드로 위의 전역변수 클래스로 지정했다.
위와 같은 코드엔, number 값에 1이란 값을 저장하게 된다.
아까 말했듯 이땐 read를 사용해야하니, 역시 바뀌지 않게 조심하자.
나의 경우 이를 어떻게 사용했냐면
TextField (
onChanged: (변수이름1){ setState((){ 변수이름2 = 변수이름1;});},
텍스트 필드는 말 그래도 텍스트를 입력받는 필드이다.
여기서 onChanged는 텍스트 필드의 메소드? 프로퍼티?로써
텍스트 필드에 입력한 내용의 변화를 알아서 감지한다.
onChanged: (변수이름1)이므로
텍스트 필드에 입력된 내용을 변수이름1에 저장한다.
그리고 뒤의 setState()메소드에 의해,
변수이름2에 변수이름1의 값이 저장된다.
참고로 변수이름1은 저 onChanged에만 쓰이니 따로 지정할 필요 없고,
변수이름2는 따로 변수를 지정해야한다.
텍스트필드에 입력받은 값을 onChanged, setState를 통해 지역변수에 저장하고,
해당 값을 context.read를 통해 전역변수에 저장한뒤
context.watch를 통해 다른 클래스에서 접근한다.
알아두면 확실히 좋은,
플러터의 전역변수 개념이자 사용법이다.