티스토리 뷰
Flutter에서 Floating App Bar 구현하기: SliverAppBar와 CustomScrollView 활용법
플러터를 배워보자 2024. 11. 18. 14:29Flutter는 사용자 경험을 극대화하기 위해 스크롤 중에도 유연하게 작동하는 Floating App Bar
를 구현할 수 있는 강력한 도구를 제공합니다. 이번 글에서는 CustomScrollView
와 SliverAppBar
를 사용하여 리스트 위에 떠 있는 앱바를 구현하는 방법을 알아봅니다.
참고. Place a floating app bar above a list
Floating App Bar란?
Floating App Bar는 스크롤 중 사용자가 다시 위로 스크롤할 때만 화면에 나타나는 유동적인 앱바입니다. 이를 통해 콘텐츠를 더 많이 표시할 수 있으며, 공간 활용을 최적화할 수 있습니다.
구현 단계
1. CustomScrollView 생성
CustomScrollView
는 리스트와 앱바를 포함한 다양한 위젯을 스크롤 가능한 레이아웃으로 조합할 수 있는 위젯입니다. 먼저 기본 구조를 설정합니다.
Scaffold(
body: CustomScrollView(
slivers: <Widget>[], // 여기에 앱바와 리스트를 추가합니다.
),
);
2. SliverAppBar 추가
SliverAppBar
는 일반 AppBar
와 유사하지만, 스크롤 시 앱바를 확장, 축소하거나 숨길 수 있는 추가 기능을 제공합니다.
CustomScrollView(
slivers: [
SliverAppBar(
title: Text('Floating App Bar'),
floating: true, // 스크롤 시 앱바를 다시 나타나게 설정
expandedHeight: 200, // 확장된 앱바 높이
flexibleSpace: FlexibleSpaceBar(
background: Image.network(
'https://example.com/background.jpg',
fit: BoxFit.cover,
),
),
),
],
);
주요 속성
floating
:true
로 설정하면 스크롤을 위로 올릴 때 앱바가 화면에 나타납니다.
expandedHeight
:- 앱바의 확장된 높이를 지정합니다.
flexibleSpace
:- 확장된 앱바 영역에 배경 이미지나 커스텀 위젯을 추가합니다.
3. SliverList로 리스트 추가
SliverList
는 리스트 형태로 데이터를 표시하며, SliverChildBuilderDelegate
를 통해 동적으로 항목을 생성할 수 있습니다.
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return ListTile(
title: Text('Item #$index'),
);
},
childCount: 50, // 리스트 항목 개수
),
);
SliverList와 SliverGrid
SliverList
: 세로 방향 리스트.SliverGrid
: 그리드 형식의 레이아웃.
구현 결과
위 코드를 조합하면 다음과 같은 구조를 얻을 수 있습니다:
- 스크롤 시 나타나는 앱바.
- 유동적으로 확장/축소되는 앱바 배경.
- 리스트와 앱바가 동기화된 부드러운 스크롤.
활용 팁
- 배경 이미지:
flexibleSpace
에Image.network
를 추가해 앱바를 시각적으로 개선합니다.
- 탭과 연계:
SliverAppBar
에bottom
속성을 사용하여 탭바를 추가할 수 있습니다.
- 커스터마이징:
- 앱바에 아이콘, 텍스트, 애니메이션을 추가해 독창적인 디자인을 구현하세요.
결론
Flutter의 SliverAppBar
와 CustomScrollView
를 활용하면 스크롤에 유연하게 반응하는 앱바를 구현할 수 있습니다. 이를 통해 더 나은 사용자 경험을 제공하며, 다양한 앱 디자인에 활용할 수 있습니다. 위 코드를 기반으로 여러분만의 독창적인 Floating App Bar를 만들어 보세요!
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
const title = 'Floating App Bar';
return MaterialApp(
title: title,
home: Scaffold(
// No appbar provided to the Scaffold, only a body with a
// CustomScrollView.
body: CustomScrollView(
slivers: [
// Add the app bar to the CustomScrollView.
const SliverAppBar(
// Provide a standard title.
title: Text(title),
// Allows the user to reveal the app bar if they begin scrolling
// back up the list of items.
floating: true,
// Display a placeholder widget to visualize the shrinking size.
flexibleSpace: Placeholder(),
// Make the initial height of the SliverAppBar larger than normal.
expandedHeight: 200,
),
// Next, create a SliverList
SliverList(
// Use a delegate to build items as they're scrolled on screen.
delegate: SliverChildBuilderDelegate(
// The builder function returns a ListTile with a title that
// displays the index of the current item.
(context, index) => ListTile(title: Text('Item #$index')),
// Builds 1000 ListTiles
childCount: 1000,
),
),
],
),
),
);
}
}
'Flutter Cookbook' 카테고리의 다른 글
Flutter에서 긴 리스트를 효율적으로 다루는 방법: ListView.builder 완벽 가이드 (0) | 2024.11.20 |
---|---|
Flutter로 쉽게 리스트뷰 만들기: 초보자를 위한 가이드 (0) | 2024.11.19 |
Flutter로 다양한 유형의 아이템을 포함한 리스트 구현하기 (2) | 2024.11.17 |
Flutter에서 가로 스크롤 리스트 구현하기: ListView와 `scrollDirection` 활용법 (0) | 2024.11.16 |
Flutter로 GridView를 활용한 그리드 리스트 구현하기: 가로와 세로 레이아웃의 효율적 구성 (0) | 2024.11.15 |