💡 학습목표
1. IndexedStack 위젯이란?
2. BottomNavigationBar 와 BottomNavigationBarItem 위젯이란?
3. 코드 작성 해보기
IndexedStack은 Flutter에서 제공하는 위젯 중 하나로, 자식 위젯 중 하나만을 한 번에 표시하는 스택입니다. 기본 Stack 위젯과의 주요 차이점은 Stack이 자신의 자식을 겹쳐서 표시하는 반면 IndexedStack은 특정 인덱스에 있는 하나의 자식만 화면에 표시하고 나머지는 숨깁니다.
주요 특징
IndexedStack(
index: _selectedIndex,
children: [
PageOne(),
PageTwo(),
PageThree(),
],
)
BottomNavigationBar와 BottomNavigationBarItem은 Flutter 애플리케이션의 하단에 위치하는 탐색 바를 구현하기 위한 위젯입니다.
BottomNavigationBar(
items: const <BottomNavigationBarItem>[
BottomNavigationBarItem(
icon: Icon(Icons.home),
label: 'Home',
),
BottomNavigationBarItem(
icon: Icon(Icons.business),
label: 'Business',
),
BottomNavigationBarItem(
icon: Icon(Icons.school),
label: 'School',
),
],
)
import 'package:flutter/material.dart';
// 상태 관리로 페이지 이동 처리 - IndexedStack, BottomNavigationBar 활용
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late int _index;
void initState() {
// 이 함수는 객체 생성시에 단 한번 호출 되는 함수
super.initState();
_index = 0;
}
Widget build(BuildContext context) {
return MaterialApp(
home: SafeArea(
child: Scaffold(
appBar: AppBar(
title: Text('page move 1'),
),
body: IndexedStack(
index: _index,
children: [PageA(), PageB(), PageC()],
),
bottomNavigationBar: BottomNavigationBar(
// 주위 !!
// 1. 화면을 이동시킬 갯수가 맞아야 한다.
// 2. 2 ~ 5까지만 넣을 수 있다.
items: [
BottomNavigationBarItem(
icon: Icon(Icons.search), label: 'search'),
BottomNavigationBarItem(icon: Icon(Icons.home), label: 'home'),
BottomNavigationBarItem(icon: Icon(Icons.person), label: 'person')
],
currentIndex: _index,
onTap: (newIndex) {
print('newIndex : ${newIndex}');
setState(() {
_index = newIndex;
});
},
),
),
),
);
}
}
class PageA extends StatelessWidget {
const PageA({super.key});
Widget build(BuildContext context) {
return Container(
color: Colors.grey[500],
child: Center(child: Text('Page A')),
);
}
}
class PageB extends StatelessWidget {
const PageB({super.key});
Widget build(BuildContext context) {
return Container(
color: Colors.green[500],
child: Center(child: Text('Page B')),
);
}
}
class PageC extends StatelessWidget {
const PageC({super.key});
Widget build(BuildContext context) {
return Container(
color: Colors.redAccent[500],
child: Center(child: Text('Page C')),
);
}
}