플러터 시작하기 03. BottomNavigationBar을 사용해 탭 만들기

2024. 5. 13. ·프로그래밍/플러터

많은 앱들이 하단 메뉴를 통해 탭 전환을 하는 형태로 디자인되어 있습니다. Scaffold의 여러 속성 중 bottomNavigationBar 속성이 바로 이 기능을 담당합니다. 이번 포스트에서는 bottomNavigationBar 속성을 소개해 드리면서 탭 전환을 어떻게 해야 하는지 함께 알려드리도록 하겠습니다.


 

플러터 시작하기 01 : Scaffold

Scaffold는 플러터에서 사용되는 가장 기본적인 디자인 레이아웃입니다. 앱의 뼈대라고도 할 수 있죠. 이번 포스트에서는 Scaffold에서 주로 사용되는 속성(property) 몇 가지를 소개해 드리려고 합니

torotoblog.tistory.com

 

플러터 시작하기 02. Appbar 꾸미기

지난 포스트에서 Scaffold에 대해서 알아보았습니다. 앱 디자인에 사용되는 가장 기본적인 디자인 레이아웃이죠. 이번에는 scaffold에서 사용되는 여러 속성 중 앱 상단에 위치하는 AppBar에 대해서

torotoblog.tistory.com


Items 속성

Scaffold(
    body: SafeArea(child: _views.elementAt(_currentIdx)),
    bottomNavigationBar: BottomNavigationBar(
        items: const [
            BottomNavigationBarItem(icon: Icon(Icons.home), label: 'home'),
            BottomNavigationBarItem(icon: Icon(Icons.account_circle), label: 'account'),
            BottomNavigationBarItem(icon: Icon(Icons.menu), label: 'menu'),
        ],
    ),
)

BottomNavigationBar 속성에는 두 가지 위젯을 사용할 수 있습니다. BottomAppBar과 이번에 배울 BottomNavigationBar 위젯입니다. Scaffold를 소개해 드리면서도 간단하게 알려드렸지만, BottomAppBar 위젯은 웹사이트의 푸터처럼 앱 하단을 꾸밀 때 많이 사용하고요, BottomNavigationBar은 앱 하단에 탭 메뉴를 구현할 때 많이 사용합니다. BottomNavigationBar 위젯은 item 속성이 필수로 입력돼야 합니다. BottomNavigationBarItem의 리스트로 구성되어 있고, 각 아이템에는 아이콘과 이름 등을 설정할 수 있습니다. 우선 가볍게 세 개의 아이템을 추가해 보도록 하겠습니다.

탭 전환하기

class BottomNavigationBarExample extends StatefulWidget {
  const BottomNavigationBarExample({super.key});

  @override
  State<BottomNavigationBarExample> createState() =>
      _BottomNavigationBarExampleState();
}

class _BottomNavigationBarExampleState extends State<BottomNavigationBarExample> {
  int _currentIdx = 0;

  final List<Widget> _views = [
    const HomeView(),
    const AccountView(),
    const MenuView()
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(child: _views.elementAt(_currentIdx)),
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: _currentIdx,
        onTap: _tabTapped,
        items: const [
          BottomNavigationBarItem(icon: Icon(Icons.home), label: 'home'),
          BottomNavigationBarItem(
              icon: Icon(Icons.account_circle), label: 'account'),
          BottomNavigationBarItem(icon: Icon(Icons.menu), label: 'menu'),
        ],
      ),
    );
  }

  void _tabTapped(int idx) {
    setState(() {
      _currentIdx = idx;
    });
  }
}

탭 전환이 가능하도록 구현하기 위해서는 우선 stateful widget 클래스에 속해있어야 합니다. Stateful widget은 다른 포스트에서 상세하게 설명드리겠지만 간단하게 알려드리자면 화면이 업데이트되어 새로 그려질 수 있도록 해주는 클래스입니다. 화면이 전환된 탭에 맞춰 새로 그려져야 하기 때문에 stateful widget 클래스를 사용한다고 생각하시면 되겠습니다.

우선은 선택된 탭을 저장할 변수 _currentIdx와 각 탭을 선택했을 때 보여줄 페이지의 리스트 _views를 생성해 줍시다. BottomNavigationBar는 각 탭이 인덱스 값으로 지정이 되기 때문에 이렇게 리스트로 만들면 간단하게 각 페이지를 불러올 수 있습니다. 그리고 마지막으로 각 탭을 선택했을 때 _currentIdx가 바뀔 수 있도록 해주는 _tabTapped 함수를 만들어 주겠습니다. 여기서 사용된 setState 함수는 어떤 변수의 값이 바뀌었고, 따라서 화면을 재구성하라는 신호를 주는 함수입니다. 이제 모든 준비가 끝났습니다.

이제 위 예제 코드를 참조해 BottomNavigationBar의 속성 중 currentIndex 속성과 onTap 속성에 방금 생성한 변수와 함수를 입력해 주면 됩니다. 그리고 scaffold의 body 속성에는 _view에서 현재 선택된 탭의 인덱스 위치에 있는 페이지를 반환해 주도록 해주면 됩니다. 이제 탭을 한 번 터치해 보세요. 선택된 탭이 변하면서 body에도 각 페이지가 그려지는 것을 볼 수 있습니다.

탭 색상 변경하기

BottomNavigationBar(
    ...
    selectedItemColor: Colors.black,
    unselectedItemColor: Colors.grey,
    backgroundColor: Colors.white,
),

탭의 색상을 담당하는 세 가지 속성들이 있습니다. SelectedItemColor는 선택된 탭의 아이콘과 레이블 색을, unselectedItemColor는 선택되지 않은 나머지 탭의 아이콘과 레이블 색을, 그리고 backgroundColor는 내비게이션 바의 색 자체를 담당합니다. 위 예제 코드를 참조해서 원하는 색으로 변경해 보세요.

크기 조정하기

BottomNavigationBar(
    ...
    selectedFontSize: 14,
    unselectedFontSize: 12,
    iconSize: 24,
),

레이블의 크기도 조절이 가능합니다. SelectedFontSize는 선택된 탭의 레이블 크기를, unselectedFontSize는 선택되지 않은 탭의 레이블 크기를 설정합니다. 기본값으로는 각 14, 12 포인트가 설정돼 있습니다. 아이콘 크기를 설정하기 위해서는 iconSize 속성에 값을 입력해 주면 됩니다. 기본값은 24입니다.

햅틱 설정하기

BottomNavigationBar(
    ...
    enableFeedback: true,
),

EnableFeedback 속성을 참으로 설정하면 탭을 선택할 때 햅틱 반응을 받을 수 있습니다. 하지만 UI/UX 측면에서 햅틱이 많이 들어간다고 좋은 것은 아니기 때문에 필요한 기능인지 잘 고민해 보시고 사용하시면 좋을 것 같네요.

이번 포스트에서는 BottomNavigationBar에서 탭을 전환하는 방법과 디자인 속성들에 대해서 알려드렸습니다. 테마 설정과 같은 기능들도 있는데, 다른 포스트에서 심화적으로 다뤄보도록 하겠습니다.


 

플러터 시작하기 04. FloatingActionButton 꾸미기

Scaffold의 마지막 속성, floatingActionButton입니다! 글 쓰기, 메뉴 보기 등으로 많이 사용하는 버튼이죠. 이번 포스트에서는 이 버튼을 한번 꾸며보도록 하겠습니다.  플러터 시작하기 02. AppBar 꾸미기

torotoblog.tistory.com

반응형
저작자표시 비영리 변경금지 (새창열림)

'프로그래밍 > 플러터' 카테고리의 다른 글

플러터 다크모드 설정 페이지 만들기  (0) 2024.07.10
플러터 시작하기 05. 버튼 종류를 알아보자!  (0) 2024.05.16
플러터 시작하기 02. Appbar 꾸미기  (0) 2024.05.14
플러터 시작하기 04. FloatingActionButton 꾸미기  (0) 2024.05.14
플러터 시작하기 01 : Scaffold  (0) 2024.05.11
'프로그래밍/플러터' 카테고리의 다른 글
  • 플러터 시작하기 05. 버튼 종류를 알아보자!
  • 플러터 시작하기 02. Appbar 꾸미기
  • 플러터 시작하기 04. FloatingActionButton 꾸미기
  • 플러터 시작하기 01 : Scaffold
  • 토로토
    토로토 블로그
    • 카테고리
      • 블로그
        • 애드센스
      • 프로그래밍
        • 플러터
        • 유니티
        • 백준
      • 포토샵
      • 테크 지식
  • 전체
    오늘
    어제
  • hELLO· Designed By정상우.v4.10.0
토로토
플러터 시작하기 03. BottomNavigationBar을 사용해 탭 만들기
상단으로

티스토리툴바