Scaffold 의 bottomNavigationBar 속성에 사용class HomePage extends StatefulWidget {
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
int selectedIndex = 0;
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Test")),
bottomNavigationBar: BottomNavigationBar(
currentIndex: selectedIndex,
selectedItemColor: Colors.blueAccent,
// unselectedItemColor: ,
iconSize: 24,
selectedLabelStyle: TextStyle(fontWeight: FontWeight.bold),
// unselectedLabelStyle: ,
onTap: (index) {
setState(() {
selectedIndex = index;
});
},
items: [
BottomNavigationBarItem(icon: Icon(Icons.home), label: '홈'),
BottomNavigationBarItem(icon: Icon(Icons.settings), label: '설정'),
BottomNavigationBarItem(icon: Icon(Icons.person), label: '마이페이지'),
],
),
body: Container(),
);
}
}
BottomNavigationBar와 함께 자주 사용됨class HomePage extends StatefulWidget {
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
int selectedIndex = 0;
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Test")),
bottomNavigationBar: BottomNavigationBar(
currentIndex: selectedIndex,
selectedItemColor: Colors.blueAccent,
// unselectedItemColor: ,
iconSize: 24,
selectedLabelStyle: TextStyle(fontWeight: FontWeight.bold),
// unselectedLabelStyle: ,
onTap: (index) {
setState(() {
selectedIndex = index;
});
},
items: [
BottomNavigationBarItem(icon: Icon(Icons.home), label: '홈'),
BottomNavigationBarItem(icon: Icon(Icons.settings), label: '설정'),
BottomNavigationBarItem(icon: Icon(Icons.person), label: '마이페이지'),
],
),
body: IndexedStack(
index: selectedIndex,
children: [
Container(color: Colors.amber), // index 0
Container(color: Colors.blue), // index 1
Container(color: Colors.cyan), // index 2
],
),
);
}
}
Navigator.push() 함수 사용Navigator.pop() 함수 사용class PageA extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("A 페이지")),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return PageB();
},
),
);
},
child: Text("B 페이지로 이동"),
),
),
);
}
}
class PageB extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("B 페이지")),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.pop(context);
},
child: Text("뒤로가기"),
),
),
);
}
}
Navigator는 Flutter 앱에서 화면(Page, Route) 간 전환을 관리하는 핵심 위젯
내부적으로 스택(Stack) 자료구조를 사용하여
스택 자료구조 : 데이터를 담을 때 마지막에 넣은 데이터가 가장 먼저 나오는 구조
청록 - 노랑 - 주황 - 빨강 순으로 담으면 꺼낼 땐 빨간색 제일 먼저
┌──────────────────────────────┐
│ MaterialApp │
│ (Navigator 🧭 내장되어 있음) │
└──────────────────────────────┘
⬆️
┌────────────────────┐
│ PageA(context) │
└────────────────────┘
⬆️
┌────────────────────┐
│ Scaffold │
└────────────────────┘
⬆️
┌────────────────────┐
│ ElevatedButton │
└────────────────────┘
// 전달받는 페이지(DetailPage)
class DetailPage extends StatelessWidget {
final String message;
const DetailPage({required this.message});
Widget build(BuildContext context) {
return Text(message);
}
}
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => DetailPage(message: 'Hello from PageA'),
),
);
Navigator.pop(context, '결과값');
// PageA → PageB에서 돌아올 때 결과 받기
final result = await Navigator.push(
context,
MaterialPageRoute(builder: (_) => PageB()),
);
print('PageB에서 받은 값: $result');
class PageA extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("A 페이지")),
body: Center(
child: ElevatedButton(
onPressed: () async {
final result = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return PageB(message: "Hello Flutter");
},
),
);
print("반환결과 : $result");
},
child: Text("B 페이지로 이동"),
),
),
);
}
}
class PageB extends StatelessWidget {
PageB({required this.message});
String message;
Widget build(BuildContext context) {
print("받은 데이터 :$message");
return Scaffold(
appBar: AppBar(title: Text("B 페이지")),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.pop(context, "안녕 플러터");
},
child: Text("뒤로가기"),
),
),
);
}
}

기본 화면 세팅하는 것까지 들었다
오늘은 알고리즘 문제 풀고 3강 마저 들었다
기본 위젯 강의랑 심화 강의까지 들었을 때
어떻게 적용하고 코드 짤지 실습해보며 배우는 게 좋을 것 같다
route 구성하고 navigator로 이동하는 건
react랑 뭔가 비슷한 것 같기도 하면서
데이터 전달하는 부분은 아직 헷갈린다
근데 이동하는 함수가 좀 귀여운듯 ㅋㅁㅋ 푸쉬팝~
Navigator.push()
Navigator.pop()