질문
나는 플러터/다트에 새로 왔으므로 앱을 만들려고 노력하는 동안 왜 일부 사항들이 특정한지 이해하려고 노력합니다. 플러터 문서에는 다음과 같이 상태를 가지는 위젯의 예제 코드가 있습니다:
class YellowBird extends StatefulWidget {
const YellowBird({ Key key }) : super(key: key);
@override
_YellowBirdState createState() => new _YellowBirdState();
}
class _YellowBirdState extends State<YellowBird> {
@override
Widget build(BuildContext context) {
return new Container(color: const Color(0xFFFFE306));
}
}
질문:
왜 한 개가 아닌 두 개의 클래스로 정의되어 있는 건가요? State 클래스가 다른 곳에서 사용될 수 있으므로 분리하는 것이 더 좋았기 때문이라고 생각합니다.
createState()
함수는State
타입의 객체를 반환한다고 이해하고 있으므로,_YellowBirdState extends State
가 의미가 있습니다. 그러나 왜YellowBird
가State
의 제네릭 클래스에 전달되는 건가요? 제 추측으로는Yellowbird
가StatefulWidget
클래스를 확장하고 있지만 정확히는 모르겠습니다.
답변
다음은 다양한 이유가 있습니다 :
위젯은 불변입니다.
StatefulWidget
이Widget
을 확장하므로 불변해야합니다. 선언을 두 개의 클래스로 분할하면StatefulWidget
이 불변하고State
가 가변적이 될 수 있습니다.위젯은
new MyWidget()
구문을 사용하여 인스턴스화됩니다. 두 개의 클래스를 하나로 병합하면new MyWidget()
은 부모가 업데이트 될 때마다 상태의 모든 속성을 재설정합니다.
class _MyStatefulState extends State<MyStateful>
에 대한 설명은 다음과 같습니다.
그것은 State
클래스가 this.widget
필드를 사용하여 Stateful
부분에 액세스 할 수 있기 때문입니다.
제네릭은 그 필드를 MyStateful
유형으로 만들기 위해 사용됩니다. MyStateful
속성에 액세스하려는 경우에는 StatefulWidget
만 사용하는 것보다 MyStateful
유형으로 만들기 위해 사용됩니다.
댓글