티스토리 뷰

탭(Tab)은 다양한 콘텐츠를 직관적으로 표시할 수 있는 UI 패턴 중 하나로, 모바일 애플리케이션에서 자주 사용됩니다. Flutter는 Material Design 가이드라인을 따르는 탭 레이아웃을 쉽게 구현할 수 있는 기능을 제공합니다. 이번 포스트에서는 Flutter에서 탭을 사용하는 방법을 단계별로 설명하고, 개발자들이 알아두어야 할 주요 포인트를 짚어보겠습니다.

Flutter에서 탭이란?

탭은 다양한 화면이나 콘텐츠를 하나의 앱 내에서 효율적으로 전환할 수 있도록 도와주는 인터페이스입니다. Flutter는 TabBar, TabBarView, TabController 등의 위젯을 통해 간편하게 탭을 생성하고 관리할 수 있도록 합니다. 이 포스트에서는 기본적인 탭 구조를 구현하는 방법과 각 탭에 콘텐츠를 추가하는 방법을 알아봅니다.

탭 만들기: 3단계로 구성된 Flutter 탭 구현

Flutter에서 탭을 만들기 위해서는 크게 3단계가 필요합니다:

  1. TabController 생성하기
  2. 탭 레이아웃 설정하기
  3. 각 탭에 콘텐츠 추가하기

1. TabController 생성하기

탭을 사용하기 위해서는 각 탭의 선택 상태와 콘텐츠가 동기화되어야 합니다. 이 역할을 담당하는 것이 TabController입니다. DefaultTabController를 사용하면 자동으로 TabController를 생성하고 하위 위젯에서 사용할 수 있도록 해줍니다.

return MaterialApp(
  home: DefaultTabController(
    length: 3, // 탭의 개수
    child: Scaffold(
      appBar: AppBar(
        bottom: const TabBar(
          tabs: [
            Tab(icon: Icon(Icons.directions_car)),
            Tab(icon: Icon(Icons.directions_transit)),
            Tab(icon: Icon(Icons.directions_bike)),
          ],
        ),
      ),
      body: const TabBarView(
        children: [
          Icon(Icons.directions_car),
          Icon(Icons.directions_transit),
          Icon(Icons.directions_bike),
        ],
      ),
    ),
  ),
);

위 코드에서 DefaultTabController는 탭 3개를 자동으로 관리하며, 각 탭에는 Icon 위젯을 사용해 콘텐츠를 표시합니다.

2. 탭 레이아웃 설정하기

TabBar 위젯을 사용하여 탭을 설정할 수 있습니다. TabBarAppBarbottom 속성에 위치하여 각 탭을 위한 네비게이션을 제공합니다. 예시에서는 3개의 아이콘을 탭으로 사용했습니다.

bottom: const TabBar(
  tabs: [
    Tab(icon: Icon(Icons.directions_car)),
    Tab(icon: Icon(Icons.directions_transit)),
    Tab(icon: Icon(Icons.directions_bike)),
  ],
),

3. 각 탭에 콘텐츠 추가하기

탭이 선택되었을 때 표시될 콘텐츠는 TabBarView 위젯을 사용하여 정의합니다. 이때 각 콘텐츠는 children 리스트에 순서대로 추가되며, 탭의 순서와 일치해야 합니다.

body: const TabBarView(
  children: [
    Icon(Icons.directions_car),
    Icon(Icons.directions_transit),
    Icon(Icons.directions_bike),
  ],
),

TabController 직접 생성하기

DefaultTabController를 사용하는 방법 외에도 TabController를 직접 생성할 수 있습니다. 이 방법은 더 복잡한 상황에서 유연성을 제공하며, 특정한 커스터마이징이 필요한 경우 유용합니다. TabController를 수동으로 생성할 때는 반드시 위젯 트리에 올바르게 전달되도록 관리해야 합니다.

TabController _controller = TabController(length: 3, vsync: this);

Flutter에서 탭 사용의 주요 포인트

  1. DefaultTabController: 기본적인 탭 구현에는 DefaultTabController를 사용하는 것이 가장 간편하며, 하위 위젯에서 쉽게 TabController를 접근할 수 있습니다.
  2. TabBar: 네비게이션 탭을 구성하는 위젯으로, 탭의 선택 상태에 따라 적절한 콘텐츠를 표시합니다. 아이콘이나 텍스트를 탭으로 사용할 수 있습니다.
  3. TabBarView: 각 탭에 대응되는 콘텐츠를 표시하는 위젯입니다. TabBar와 순서가 일치해야 하며, 콘텐츠는 자유롭게 커스터마이징이 가능합니다.
  4. 탭과 콘텐츠 동기화: 탭과 콘텐츠는 반드시 동기화되어야 합니다. 이를 위해 TabController가 두 요소 간의 상태를 관리합니다.

탭을 사용할 때 고려할 사항

  • 탭의 개수 관리: 너무 많은 탭을 사용하면 사용자 경험이 저하될 수 있으므로 적절한 개수를 유지하는 것이 중요합니다.
  • 탭 내비게이션의 일관성: 탭을 사용할 때는 사용자가 쉽게 콘텐츠를 탐색할 수 있도록 직관적인 네비게이션 디자인을 고려해야 합니다.
  • 애니메이션: Flutter는 기본적으로 탭 전환 시 부드러운 애니메이션을 제공합니다. 이를 통해 사용자에게 보다 나은 경험을 제공할 수 있습니다.

결론

Flutter에서 탭을 사용하는 방법은 매우 직관적이며, DefaultTabController, TabBar, TabBarView와 같은 위젯을 통해 효율적으로 구현할 수 있습니다. 탭을 사용하면 다양한 콘텐츠를 깔끔하게 정리하고 제공할 수 있어 사용자 경험을 향상시키는 데 큰 도움이 됩니다. 위에서 설명한 기본적인 탭 구현 방법을 바탕으로, 더 복잡한 탭 구조를 설계하여 Flutter 애플리케이션의 인터페이스를 강화할 수 있습니다.

 

import 'package:flutter/material.dart';

void main() {
  runApp(const TabBarDemo());
}

class TabBarDemo extends StatelessWidget {
  const TabBarDemo({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DefaultTabController(
        length: 3,
        child: Scaffold(
          appBar: AppBar(
            bottom: const TabBar(
              tabs: [
                Tab(icon: Icon(Icons.directions_car)),
                Tab(icon: Icon(Icons.directions_transit)),
                Tab(icon: Icon(Icons.directions_bike)),
              ],
            ),
            title: const Text('Tabs Demo'),
          ),
          body: const TabBarView(
            children: [
              Icon(Icons.directions_car),
              Icon(Icons.directions_transit),
              Icon(Icons.directions_bike),
            ],
          ),
        ),
      ),
    );
  }
}