StatefulWidget 2 설명

김인범's avatar
Jan 13, 2025
StatefulWidget 2 설명

StatefulWidget 1에서 봤던 코드입니다.

import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { print("MyApp build...."); return MaterialApp( home: HomePage(), ); } } class HomePage extends StatefulWidget { @override State<HomePage> createState() => _HomePageState(); // createState() 직접적으로 } class _HomePageState extends State<HomePage> { int num = 1; // statefulW 이 된 순간 상태를 저장하고 있다. // 변경이 되면 리로드를 한다. // 빌드를 직접 호출할 수 있는 방법은 없다. @override Widget build(BuildContext context) { print("HomePage build...."); return Scaffold( body: Column( children: [ Expanded( child: Center( child: Container( child: Text( "$num", style: TextStyle(fontSize: 50), ), ), ), ), Expanded( child: Center( child: Container( child: ElevatedButton( onPressed: () { num++; setState(() {}); print("num: $num"); }, child: Icon(Icons.add)), ), ), ), ], ), ); } }

context를 나누려는 이유

모든 것이 하나의 컨텍스트에 묶여있어서, 리로드할 때 페이지 전체가 리로드되어
통신에 부담이 생긴다.
⇒ 컨텍스트를 나눌 필요가 있다.
 
해당 코드에서 context를 나눠보도록 하겠습니다.
위 코드에서 context는 몇개나 나올지 이미지를 보여드리겠습니다.
notion image
MyApp(빨간색) 1개 , HomePage(주황색) 1개, 상단+하단 Container 2개 ⇒ 총 4개가 나올 수 있습니다.
여기서 상단과 하단 컴포넌트를 각각의 context를 만들어 주겠습니다.
 
StatelessWidget 이었던 HomePage를 StatefulWidget으로 바꿔줍니다.
notion image
stl에서는 못보던 코드도 추가되었습니다.
return Scaffold( body: Column( children: [ Expanded( child: Center( child: Container( child: Text( "$num", style: TextStyle(fontSize: 50), ), ), ), ), Expanded( child: Center( child: Container( child: ElevatedButton( onPressed: () { num++; setState(() {}); print("num: $num"); }, child: Icon(Icons.add)), ), ), ), ], ), );
제일 먼저 HomePage 클래스에서 변수를 선언해놓아야 합니다.
notion image
 
아래 해당 코드에서 상단 Center와 하단 Center부분을 각각의 시작 시점으로 보고
method로 나누어줍니다.
notion image
Top 과 Bottom 두 개의 메서드로 나누었습니다.
 

Top

notion image
Top 메서드는 num을 받아서 화면에 버튼을 누른 횟수를 보여주는 역할입니다.
int num을 멤버변수로 받고,
화면에서 보여줘야할 코드로
Text("$num", style: TextStyle(fontSize: 50) 를 작성해줍니다.
 

Bottom

notion image
Bottom 메서드는 함수를 받아 사용하는 매서드입니다.
Flutter에서는 함수 또한 일급객체로써 변수명만으로도 받아낼 수 있게 됩니다.
행위(함수)를 받을 때는 Function 타입으로 받아야합니다.
 
Share article

taker