State Class
플러터의 Stateful 클래스는 State와 Stateful Widget 두 가지의 클래스가 생성되는데, 기본으로 State 클래스가 private으로 정의된다.
일반적으로 변수와 함수를 build가 존재하는 State 클래스에 정의하게 되는데, 이렇게 정의된 것들은 외부에서는 사용할 수 없다.
이를 사용하기 위해서 기본 위젯 Stream을 활용하거나 패키지 GetX를 사용하긴 하지만 이 것들을 사용하고 싶지 않을 수도 있다.
이 포스팅에서는 State 클래스 내부에 접근할 수 있는 근본적인 방법을 설명한다.
이전에 자식 클래스에서 부모 클래스의 데이터에 접근하는 방법을 포스팅 한 적이 있는데, 이 방법을 사용해도 무방하다.
접근하기
class MyStatefulWidget extends StatefulWidget {
@override
State<StatefulWidget> createState() => new MyStatefulWidgetState();
//context를 반환하는 함수 'of'를 static으로 생성한다.
static MyStatefulWidgetState of(BuildContext context) =>
context.findAncestorStateOfType<MyStatefulWidgetState>();
}
class MyStatefulWidgetState extends State<MyStatefulWidget> {
String _string = "please input text";
set string(String value) => setState(() => _string = value);
@override
Widget build(BuildContext context) {
return new Column(
children: <Widget>[new Text(_string), MyChildClass()],
);
}
}
class MyChildClass extends StatelessWidget {
MyChildClass();
@override
Widget build(BuildContext context) {
return new Column(
children: <Widget>[
new RaisedButton(
onPressed: () {
MyStatefulWidget.of(context).string = "hello world";
},
child: new Text("Click"),
)
],
);
}
}
예제 코드를 보며 바로 이해해보자.
Stateful을 자동 생성할 경우 State 클래스명 앞에 _(언더바)가 붙는다. _ 를 지워 클래스를 public로 만들어준다.
그리고 StatefulWidget 클래스 내부에서 State를 반환하는 함수를 Static으로 선언한다.
static MyStatefulWidgetState of(BuildContext context) =>
context.findAncestorStateOfType<MyStatefulWidgetState>();
함수 명이 of이고 context를 인자로 전달받는다. findAncestorStateOfType이라는 함수로 State 클래스 자체를 반환한다.
return값이 State 클래스이다.
MyStatefulWidget.of(context).string = "hello world";
그리고 접근이 필요할 때 위와 같이 사용하면, State 클래스의 내부에 곧바로 접근할 수 있다.
위의 예제는 State 클래스 내부의 Set함수를 곧바로 호출한 것이다.
비슷한 방법
[플러터] 자식 클래스에서 부모 클래스에 데이터 전달
dart에서는 포인터가 존재하지 않는다. 따라서 부모 클래스에서 호출시킨 자식 클래스가 부모 클래스 내부 변수 값을 변화시키기 위해서는 부모 클래스에서 변수 값을 변화시키는 함수를 선언하
muhly.tistory.com
static으로 선언하기때문에 접근이 필요한 영역이 작거나, 자식 클래스에서만 호출하면 되는 경우라면 위와 같은 방법을 권장한다.
'Flutter > Flutter Tech' 카테고리의 다른 글
[플러터] 뒤로가기 버튼/제스쳐 금지 (0) | 2021.01.20 |
---|---|
[플러터] Splash 화면 변경하기 (로딩 화면) (0) | 2021.01.20 |
[플러터] 파일을 cache 저장소에 저장하기 (0) | 2020.12.25 |
[플러터] 이미지를 cache 저장소에 저장하기 (0) | 2020.12.22 |
[플러터] 위젯의 크기&위치를 반환받는 법 (0) | 2020.12.15 |