[flutter] 플러터 sticky 헤더를 사용한 즐겨찾기 목록 앱 구현하기

목차

소개

이번 튜토리얼에서는 플러터에서 sticky 헤더를 사용하여 즐겨찾기 목록 앱을 구현하는 방법을 알아보겠습니다. sticky 헤더를 사용하면 사용자가 스크롤을 하는 동안 헤더가 항상 화면 상단에 고정되어 유용한 기능을 제공할 수 있습니다.

프로젝트 설정

우선 플러터 개발 환경을 설정합니다. Flutter SDK가 설치되어 있지 않은 경우 https://flutter.dev/ 에서 설치할 수 있습니다. Flutter가 설치되었다면 터미널에서 다음 명령어로 프로젝트를 생성합니다.

flutter create sticky_header_app

생성된 프로젝트 디렉토리로 이동한 후, pubspec.yaml 파일을 열어 다음 종속성을 추가합니다.

dependencies:
  sticky_headers: ^0.2.0
  http: ^0.12.2

이후 터미널에서 flutter packages get 명령어를 실행하여 종속성을 설치합니다.

스토리지 구현

즐겨찾기 목록을 저장하기 위해 스토리지를 구현해야 합니다. 이 예제에서는 플러터의 SharedPreferences 패키지를 사용하여 심플하게 구현하도록 하겠습니다.

먼저 lib 디렉토리에 data 폴더를 생성하고, 그 안에 storage.dart 파일을 만듭니다. 다음 코드를 추가하여 스토리지 클래스를 정의합니다.

import 'package:shared_preferences/shared_preferences.dart';

class Storage {
  static Future<void> saveFavoriteItems(List<String> favorites) async {
    final prefs = await SharedPreferences.getInstance();
    prefs.setStringList('favorites', favorites);
  }

  static Future<List<String>> getFavoriteItems() async {
    final prefs = await SharedPreferences.getInstance();
    final favorites = prefs.getStringList('favorites') ?? [];
    return favorites;
  }
}

위의 코드에서 saveFavoriteItems 함수는 즐겨찾기 항목을 저장하고, getFavoriteItems 함수는 저장된 즐겨찾기 항목을 불러옵니다.

UI 디자인과 스크롤 효과

이제 즐겨찾기 목록 앱의 UI와 sticky 헤더를 구현해보겠습니다.

먼저 lib 폴더에 pages 폴더를 생성하고, 그 안에 home_page.dart 파일을 만듭니다. 다음 코드를 작성하여 홈 페이지를 구현합니다.

import 'package:flutter/material.dart';
import 'package:sticky_headers/sticky_headers.dart';

import '../data/storage.dart';

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  List<String> _favorites = [];

  @override
  void initState() {
    super.initState();
    _loadFavorites();
  }

  Future<void> _loadFavorites() async {
    final favorites = await Storage.getFavoriteItems();
    setState(() {
      _favorites = favorites;
    });
  }

  Future<void> _saveFavorites() async {
    await Storage.saveFavoriteItems(_favorites);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('즐겨찾기 목록'),
      ),
      body: ListView.builder(
        itemCount: _favorites.length,
        itemBuilder: (context, index) {
          return StickyHeader(
            header: Container(
              padding: EdgeInsets.all(8.0),
              color: Colors.grey[300],
              child: Text(
                '카테고리 ${index + 1}',
                style: TextStyle(fontSize: 20),
              ),
            ),
            content: ListTile(
              title: Text(_favorites[index]),
            ),
          );
        },
      ),
    );
  }

  @override
  void dispose() {
    _saveFavorites();
    super.dispose();
  }
}

위의 코드에서 _favorites 리스트는 즐겨찾기 항목을 저장합니다. initState 함수에서 _loadFavorites 함수를 호출하여 스토리지에서 즐겨찾기를 불러온 후, _saveFavorites 함수를 dispose 함수에서 호출하여 변경된 즐겨찾기를 저장합니다.

코드를 실행하고 앱을 확인하면, 즐겨찾기가 카테고리별로 분리되어 표시되며 스크롤이 가능한 sticky 헤더를 확인할 수 있습니다.

결론

이렇게 플러터의 sticky 헤더를 사용하여 즐겨찾기 목록 앱을 구현하는 방법에 대해 알아보았습니다. sticky 헤더는 다양한 사용자 인터페이스 요구사항을 충족시키기 위한 유용한 기능 중 하나입니다. 추가적인 버튼이나 인터랙티브한 동작을 구현하여 사용자에게 더욱 편리한 환경을 제공할 수 있습니다.