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는 몇개나 나올지 이미지를 보여드리겠습니다.

MyApp(빨간색) 1개 , HomePage(주황색) 1개, 상단+하단 Container 2개 ⇒ 총 4개가 나올 수 있습니다.
여기서 상단과 하단 컴포넌트를 각각의 context를 만들어 주겠습니다.
StatelessWidget 이었던 HomePage를 StatefulWidget으로 바꿔줍니다.

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 클래스에서 변수를 선언해놓아야 합니다.

아래 해당 코드에서 상단 Center와 하단 Center부분을 각각의 시작 시점으로 보고
method로 나누어줍니다.

Top 과 Bottom 두 개의 메서드로 나누었습니다.
Top

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

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