PromleeBlog
sitemap
aboutMe

posting thumbnail
하단 네비게이션 바 설정하기
Maintaining a per-tab stack of navigation bars

📅

🚀

들어가기 전에 🔗

  1. 목표, 조건 설정 및 초기설정, 개요 링크
  2. 로그인 페이지 분기(FlutterSecureStorage) 링크
위 링크를 순서대로 참고하여 프로젝트를 설정하고 진행하였다고 가정합니다.
이 포스팅은 Flutter 3.24 버전 기준으로 작성되었습니다.
로그인 페이지 분기까지 완료하였다면, 이제 하단 네비게이션 바를 설정해보겠습니다. 하단 네비게이션 바를 설정하면, 사용자가 앱 내에서 쉽게 이동할 수 있도록 도와줍니다.
이번 포스팅에서는 하단 네비게이션 바에 탭 4개를 추가하고, 각 탭을 눌렀을 때 해당 페이지로 이동하도록 설정해보겠습니다. 개요에서 설명했듯, 로그인 페이지에는 네비게이션 바가 없고 로그인 후에
모든 페이지
에서 네비게이션 바가 나타나도록 설정하기 위해 이에 유의하여 진행해보도록 하겠습니다.
이번 포스팅에서 필자의 lib 폴더 내부 file tree 구조입니다. 미리 생성해두고 시작하시면 편리합니다.
📦 lib
┣ 📂 model						// 데이터 보관하는 모델 폴더(이번 포스팅에서는 사용하지 않음)
┣ 📂 view						// 화면을 구성하는 뷰 폴더
┃ ┣ 📂 tabs						// 탭 4개를 구성하는 화면
┃ ┃ ┣ 📜 home_screen.dart
┃ ┃ ┣ 📜 notifications_screen.dart
┃ ┃ ┣ 📜 profile_screen.dart
┃ ┃ ┗ 📜 search_screen.dart
┃ ┣ 📜 login_page.dart
┃ ┗ 📜 main_page.dart
┣ 📂 viewModel					// 데이터와 화면을 잇는 viewModel 폴더
┃ ┗ 📜 auth_service.dart
┗ 📜 main.dart

🚀

1. 각 탭 화면 구성하기 🔗

우선, 각 탭 화면을 구성해보겠습니다. 이번 포스팅에서는 4개의 탭을 구성하겠습니다. 각 탭은 홈, 검색, 알림, 프로필로 구성하겠습니다.
단, 이전 포스팅에서 main_page.dart에 구성되어있던 로그아웃 코드는 ProfileScreen으로 이동하였습니다.
lib/view/tabs/home_screen.dart
import 'package:flutter/material.dart';
 
class HomeScreen extends StatelessWidget {
  const HomeScreen({super.key});
 
  @override
  Widget build(BuildContext context) {
    return const Center(
      child: Text('Home Screen', style: TextStyle(fontSize: 24)),
    );
  }
}
lib/view/tabs/search_screen.dart
import 'package:flutter/material.dart';
 
class SearchScreen extends StatelessWidget {
	const SearchScreen({super.key});
 
	@override
	Widget build(BuildContext context) {
		return const Center(
			child: Text('Search Screen', style: TextStyle(fontSize: 24)),
		);
	}
}
lib/view/tabs/notifications_screen.dart
import 'package:flutter/material.dart';
 
class NotificationsScreen extends StatelessWidget {
	const NotificationsScreen({super.key});
 
	@override
	Widget build(BuildContext context) {
		return const Center(
			child: Text('Notifications Screen', style: TextStyle(fontSize: 24)),
		);
	}
}
lib/view/tabs/profile_screen.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:navigationbar_example/view/login_page.dart';
import 'package:navigationbar_example/viewModel/auth_service.dart';
 
class ProfileScreen extends StatelessWidget {
  final AuthService _authService = AuthService();
 
  ProfileScreen({super.key}); // AuthService 인스턴스 생성
 
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Profile Page'), // 프로필 화면 제목
        actions: [
          IconButton(
            onPressed: () async {
              // 로그아웃 시 상태 삭제
              await _authService.logout();
              // 로그아웃 후 로그인 페이지로 이동
              Get.offAll(() => LoginPage());
            },
            icon: const Icon(Icons.logout), // 로그아웃 버튼 아이콘
          ),
        ],
      ),
      body: const Center(
        child: Text('Profile Screen', style: TextStyle(fontSize: 24)),
      ),
    );
  }
}

🚀

2. 하단 네비게이션 바 구성하기 🔗

이제 하단 네비게이션 바를 구성해보겠습니다. 하단 네비게이션 바는 4개의 탭을 가지고 있으며, 각 탭을 눌렀을 때 해당 페이지로 이동하도록 설정하겠습니다.
lib/view/main_page.dart
import 'package:flutter/material.dart';
import 'package:navigationbar_example/view/tabs/home_screen.dart';
import 'package:navigationbar_example/view/tabs/notifications_screen.dart';
import 'package:navigationbar_example/view/tabs/profile_screen.dart';
import 'package:navigationbar_example/view/tabs/search_screen.dart';
 
class MainPage extends StatefulWidget {
  const MainPage({super.key});
 
  @override
  MainPageState createState() => MainPageState();
}
 
class MainPageState extends State<MainPage> {
  int _currentIndex = 0; // 현재 선택된 탭의 인덱스
 
  // 각 탭에서 보여줄 화면 리스트
  final List<Widget> _pages = [
    const HomeScreen(), // 첫 번째 탭 화면
    const SearchScreen(), // 두 번째 탭 화면
    const NotificationsScreen(), // 세 번째 탭 화면
    ProfileScreen(), // 네 번째 탭 화면
  ];
 
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: _pages[_currentIndex], // 현재 선택된 탭에 해당하는 화면 표시
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: _currentIndex, // 선택된 탭 인덱스
        onTap: (index) {
          setState(() {
            _currentIndex = index; // 탭 전환 시 상태 업데이트
          });
        },
        items: const [
          BottomNavigationBarItem(
            icon: Icon(Icons.home),
            label: 'Home',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.search),
            label: 'Search',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.notifications),
            label: 'Notifications',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.person),
            label: 'Profile',
          ),
        ],
        selectedItemColor: Colors.blue, // 선택된 아이템 색상
        unselectedItemColor: Colors.grey, // 선택되지 않은 아이템 색상
      ),
    );
  }
}

🚀

3. 실행 결과 확인 🔗

이제 앱을 실행하여 하단 네비게이션 바가 정상적으로 표시되는지 확인해보겠습니다. 이전 포스팅에서 로그인 페이지 분기까지 완료하였다면, 이제 하단 네비게이션 바가 정상적으로 표시되는 것을 확인할 수 있습니다.
image

🚀

결론 🔗

이번 포스팅에서는 하단 네비게이션 바를 설정하는 방법을 알아보았습니다. 하단 네비게이션 바를 설정하면 사용자가 앱 내에서 쉽게 이동할 수 있도록 도와줍니다.
다음 포스팅에서는 하단 네비게이션 바 탭 이벤트를 설정하여 추가적인 화면에서도 네비게이션 바를 자연스럽게 사용할 수 있도록 설정해보겠습니다.

더 생각해 보기 🔗

여기를 참고하여 더 많은 정보를 확인해보세요.

참고 🔗