Sliver ๊ฐ๋ ์ดํด
Sliver๋ฅผ ์ดํดํ๊ธฐ ์์ RenderBox๋ฅผ ๋จผ์ ์์์ผํ๋ค. RenderBox๋ 2D ๋ฐ์นด๋ฅดํธ ์ขํ๊ณ๋ฅผ ๊ฐ์ง ๋ ๋ ๊ฐ์ฒด๋ก Flutter ๋ ์ด์์ ๊ตฌ์ฑ์์์ ๋๋ถ๋ถ์ RenderBox๋ก ๊ตฌํ๋๋ค. Renderbox๋ ๋ถ๋ชจ ์์ ฏ์ ์ ์ฝ์กฐ๊ฑด ๋ด์์ ๊ตฌํ๋๋ ๋๋น๋์ด์ด๊ธฐ ๋๋ฌธ์ ๋์ ์ธ ์ํธ์์ฉ์ด๋ ์คํฌ๋กค์ ๋์ฒํ๊ธฐ ํ๋ค๋ค. (์ด๋ฏธ ๋์ด ๋๋น๊ฐ ๋ถ๋ชจ ์ ์ฝ์ ์ํด ์ ํด์ ธ์์)
์ด๋ฌํ ๋์ ์ธ ์ํธ์์ฉ์ ๋์ํ๊ธฐ ์ํด Flutter ํ์ Sliver๋ฅผ ๋ง๋ค์๋ค. Sliver ๋ฅผ ํตํด ๊ธฐ์กด์ ๋ถ๋ชจ์์ ฏ ์ ์ฝ์กฐ๊ฑด์ ํ์ฉํ๋ ๋์ Sliver Protocol ์์ ์ ๊ณต๋๋ ๋ค์ํ ์ ์ฝ์กฐ๊ฑด์ ํ์ฉํ๋ค. ํนํ RenderBox์์ ๊ตฌํํ๊ธฐ ์ด๋ ค์ ๋ ์คํฌ๋กค ํจ๊ณผ๋ฅผ ๊ตฌํํ๋๋ฐ ์ฉ์ดํ๋ค. (GridView, Inifinitie Scroll) ๊ธฐ๋ณธ์ ์ธ Sliver ๊ตฌ์ฑ์์๋ก๋SliverAppBar/SliberPersistentHeader/SliverPadding/SliverToBoxAdapter ๊ฐ ์๋ค.
CustomScrollView๋ ๋ค์ํ Sliver๋ฅผ ์กฐํฉํด์ ๋ณต์กํ ์คํฌ๋กค ๋ทฐ๋ฅผ ๋ง๋ค ์ ์๋ ์์ ฏ์ด๋ค. Slivers ๋ฐฐ์ด์๋ ์ผ๋ฐ์ ์ธ ์์ ฏ์ ๋ชป์ค๊ณ sliver๋ง ์ฌ ์ ์๋ค. ๋ง์ฝ Slivers ์์ ์์ ฏ์ ๋ฃ๊ณ ์ถ๋ค๋ฉด SliverToBoxAdapter ๋ฅผ ํตํด ๋ฃ์ด์ผํ๋ค. Slivers ์์ ๋ค์ด๊ฐ๋ Sliver๋ค์ ์์๋ณด์. ๋จผ์ SliverAppBar๋ ์๋จ ์ฑ๋ฐ๋ก ์คํฌ๋กค์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๊ตฌํ๋์ด ์ต๋ ํผ์ ธ์ก์ ๋ 200 ํฝ์ , ํ๋กํ , ๊ณ ์ ์ฌ๋ถ, ๊ฐ๋ณ์์ญ ์ค์ ๋ฑ์ ํ ์ ์๋ค. ๋ค์์ผ๋ก SliverList๋ ์คํฌ๋กค ๊ฐ๋ฅํ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋ค. ์ด๋ Delegate์๋ ๋์ ์ผ๋ก ์์ฑํ๋ ๋ฆฌ์คํธ์์ดํ ์ ๋ฃ์ ์ ์๋ค.(iOS UIKit์ ๋ธ๋ฆฌ๊ฒ์ดํธ์ ์ ์ฌ)
๐ก Slivers ์์ Sliver ์์ ฏ๋ง ์ฌ ์ ์๋ ์ด์
sliver๋ ๋์ ์ธ ๋ทฐ์ ์ปจํ ์คํธ์์ ์์ ์ ํฌ๊ธฐ์ ์์น๋ฅผ ๊ณ์ฐํ๋ค. ์ผ๋ฐ ์์ ฏ์ ์ด๋ฌํ ๋์ ์ธ ๋ทฐ ์์์ ์์ ์ ํฌ๊ธฐ๊ณ์ฐ์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ Sliver ์ปจํ ์คํธ ๋ด์ ์ค์ง ๋ชปํ๋ค.
SliverChildList ๋ธ๋ฆฌ๊ฒ์ดํธ์๋ ๋๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค. SliverChildListDelegate ์ BuilderDelegate ๊ฐ ์๋๋ฐ ์ ์๋ ๋ฆฌ์คํธ ํ์ดํ์ด ๊ณ ์ ์ผ๋ก ์ฃผ์ด์ง๋, ํ์๋ ๋ฆฌ์คํธ ํ์ดํ์ด ๋์ ์ผ๋ก ์ง์ ๋๋ค.
- SliverChildListDelegate:
- ๊ณ ์ ๋ ์์ ๋ชฉ๋ก: ๋ชจ๋ ์์ ์์ ฏ์ ๋ฏธ๋ฆฌ ์ ์
- ์ฌ์ฉ ์ฌ๋ก: ์์ ์์ ฏ์ ์๊ฐ ์ ๊ณ ๊ณ ์ ๋ ๊ฒฝ์ฐ์ ์ ํฉ
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ: ๋ชจ๋ ์์ ์์ ฏ์ด ๋ฏธ๋ฆฌ ์์ฑ๋๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ๊ณ ์
- SliverChildBuilderDelegate:
- ๋์ ์์ ์์ฑ: ์์ ์์ ฏ์ ํ์ํ ๋๋ง ์์ฑ
- ์ฌ์ฉ ์ฌ๋ก: ์์ ์์ ฏ์ ์๊ฐ ๋ง๊ฑฐ๋ ๋์ ์ผ๋ก ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ์ ์ ํฉ
- ํจ์จ์ฑ: ์์ ์์ ฏ์ด ํ์ํ ๋๋ง ์์ฑ๋๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ํจ์จ์
FlexibleSpaceBar
//https://morioh.com/a/076a8c4deb9f/flutter-sliverappbar-examples
SliverAppBar(
title: Text("SliverAppBar Title"),
expandedHeight: 220.0,
flexibleSpace: FlexibleSpaceBar(
centerTitle: true,
title: Text('Title',
style: TextStyle(
color: Colors.white,
fontSize: 16.0,
)),
background: Image.network(
'https://images.pexels.com/photos/443356/pexels-photo-443356.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940',
fit: BoxFit.cover,
)
),
),
์์ ๊ฐ์ด SliverAPPBar๋ ๋์ ์ธ ์ํธ์์ฉ์ ๋์ํ์ฌ flexibleSpace๋ฅผ ํตํด ์ฑ๋ฐ๊ฐ ํ์ฅ๋ ๋ ๋ ๋๋งํ ์์ ฏ์ ์ ๋ฌํ ์ ์๋ค.
SliverPersistentHeader
๋์ ์ธ ํค๋๋ฅผ ์คํฌ๋กค์ ๋ฐ๋ผ ๊ณ ์ ์ํฌ๋๋ ์๋ ์ฃผ์ ์ฌ์ ์๋ฅผ ํตํด ๊ตฌํํ๋ค.
1. build ๋ฉ์๋: ํค๋์ UI๋ฅผ ์ ์
2. maxExtent์ minExtent: ํค๋์ ์ต๋ ๋ฐ ์ต์ ๋์ด๋ฅผ ์ ์
3. shouldRebuild: ํค๋๊ฐ ๋ค์ ๋น๋๋์ด์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ์ ์
๋๋ค ๋์ ์ผ๋ก ์์ง์ด๋ ํค๋๋ทฐ์ด๊ธฐ ๋๋ฌธ์ ์ฐจ์ด๊ฐ ๋ช ํํ์ง ์์ ์ ์๋ค. ๋ณดํต FlexibleSpaceBar๋ ์คํฌ๋กค์ ๋งจ์ ํค๋ ์ด๋ฏธ์ง๊ฐ ๋์ ์ผ๋ก ํ์ฅ๋์๋ค๊ฐ ์ค์ด๋๋ ์ฑ๋ฐ๋ฅผ ๋ง๋ค๋, SliverPersistentHeaderView๋ ์คํฌ๋กคํ ๋ ์น์ ๋ณ๋ก ํค๋์ ๊ณ ์ ๋๊ฒ ํ๊ณ ์ถ์๋ ์ฌ์ฉ๋๋ค.
SliverPadding
SliverToBoxAdapter
SliverToBoxAdapter๋ ์ผ๋ฐ์ ์ธ ์์ ฏ์ CustomScrollView์ ์ฌ๋ฆฌ๋ฒ๋ก ๋ณํํ ๋ ์ฌ์ฉํ ์ ์๋ค.
SliverFixedExtentList
SliverFixedExtendList๋ ๋ชจ๋ ๋ฆฌ์คํธ ํญ๋ชฉ์ด ๋์ผํ ๋์ด๋ฅผ ๊ฐ์ง๊ฒ ํ๋ค. itemExtent์ ์ํ๋ ๋์ด๋ฅผ ์์ฑํด์ค๋ค.
SliverGrid.count
SliverGrid.count๋ ๊ณ ์ ๋ ์ด ์๋ฅผ ๊ฐ์ง๋ ๊ทธ๋ฆฌ๋๋ฅผ ์์ฑํ๋ค. GridView์ ๋น์ทํ์ง๋ง, SliverGrid๋ CustomScrollView ๋ด์์ ๋ค๋ฅธ Sliver ์์ ฏ๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค๋ ์ฐจ์ด๊ฐ ์๋ค.
SliverGrid.extent
SliverGrid.extent๋ ๊ทธ๋ฆฌ๋ ํญ๋ชฉ์ ์ต๋ ๋๋น๋ฅผ ๊ธฐ์ค์ผ๋ก ํญ๋ชฉ์ ๋ฐฐ์นํ๋ ์์ ฏ์ด๋ค. ๋ฐ๋ผ์ ๊ธฐ๊ธฐ๋ณ ๋๋น์ ๋์ํ ์ ์๋ค.
maxCrossAxisExtent
๊ทธ๋ฆฌ๋ ํญ๋ชฉ์ ์ต๋ ๋๋น๋ฅผ 200ํฝ์ ๋ก ์ค์ ํ๋ค. ํ๋ฉด ๋๋น์ ๋ฐ๋ผ ํ ํ์ ๋ฐฐ์น๋ ํญ๋ชฉ์ ์๊ฐ ๊ฒฐ์ ๋๋ค.
mainAxisSpacing
ํญ๋ชฉ ๊ฐ์ ์ธ๋ก ๊ฐ๊ฒฉ์ 16ํฝ์ ๋ก ์ค์ ํ๋ค.
crossAxisSpacing
ํญ๋ชฉ ๊ฐ์ ๊ฐ๋ก ๊ฐ๊ฒฉ์ 16ํฝ์ ๋ก ์ค์ ํ๋ค.
childAspectRatio
ํญ๋ชฉ์ ๊ฐ๋ก ๋ ์ธ๋ก ๋น์จ์ 3:2๋ก ์ค์ ํ๋ค.
List.generate
20๊ฐ์ ๊ทธ๋ฆฌ๋ ํญ๋ชฉ์ ์์ฑํ๋ค. ๊ฐ ํญ๋ชฉ์ Container ์์ ฏ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ๋ฐฐ๊ฒฝ์๊ณผ ํ ์คํธ๋ฅผ ํฌํจํ๋ค.
SliverAnimatedList
์ ์ฒด์ฝ๋: https://gist.github.com/suojae3/19b892a990fdf1a620b078cca0ab6a59
SliverAnimatedList๋ ํญ๋ชฉ์ ์ฝ์ , ์ญ์ ๋๋ ๋ณ๊ฒฝํ ๋ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํ ์ ์๋ ์์ ฏ์ด๋ค
GlobalKey<SliverAnimatedListState>
SliverAnimatedList
SliverChildBuilderDelegate
๋ถ๊ฐ์ ๋ณด: ๋๋ Sliver์ ์คํฌ๋กค๋ง์ ์ ๋๋ก ์๊ณ ์์๊น?
https://www.youtube.com/watch?v=YYEtWHGW894
Sliver์ ์ด์๋ถํฐ ์ดํด๋ณด๋ฉด ๋ฌด์ธ๊ฐ ๊ฑฐ๋ํ ๊ฒ์ ์๊ฒ ๋ถ์ด์ด ๋ง๋ ์๊ฑฐ๋ ์์ ์กฐ๊ฐ๋ค์ ์๋ฏธํ๋ค. ๊ณต์๋ฌธ์์์๋ Sliver๋ ์คํฌ๋กค ๊ฐ๋ฅํ ์์ญ์ ์ผ๋ถ๋ถ์ด๋ผ๊ณ ๋์จ๋ค. ๋์ ํฉ์น๋ฉด Sliver๋ ์คํฌ๋กค๋ ์์ญ์ ์ด๋ฃจ๋ ์กฐ๊ฐ ํ๋ํ๋๋ฅผ ์๋ฏธํ๋ค. ๋ฐ๋ผ์ Slivers๋ ์กฐ๊ฐ์กฐ๊ฐ sliver๋ค์ ํฉ์ณ๋์ ์คํฌ๋กค๋๋ ์์ญ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ListView/GridView ์ SliverList/SliverGrid ์ ์ฐจ์ด์ ์ ๋ฌด์์ผ๊น? ๋จ์ ์ผ๋ก ๋งํ๋ฉด ์ ์๋ ์์ ฏ์ด๊ณ ํ์๋ ์์ ฏ์ด ์๋๋ค. ListView/GridView๋ SliverList/SliverGrid ๋ค์ ํ๋ฐ ๋ฌถ์ด์ ์์ ฏ์ผ๋ก ๋ง๋ค์ด๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ SliverList/SliverGrid๋ ListView/GridView ์ ๋๊ฐ์ ๊ธฐ๋ฅ์ ํ์ง๋ง ์์ ฏ์ ์๋๋ฉฐ customScrollView์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ ํ๋์ ์์์ด๋ค.
์์์ ์ดํด๋ณด์๋ฏ์ด flutter๋ ๋ทฐ๋ฅผ ๋ ๋๋งํ ๋ widget tree, element tree, render tree ์ธ ๊ฐ์ tree๋ฅผ ๋ง๋ค์ด์ค๋ค. ๊ทธ๋ฆฌ๊ณ widget tree๋ render tree์ ์ง์ ์ ์ผ๋ก ์ ๊ทผํ์ง ์๊ณ ์ธํฐํ์ด์ค์ธ element tree๋ฅผ ์ด์ฉํ๊ฒ ๋๋ค. ๋ํ ๋ถ๋ชจ์์ ฏ์ด ์์์์ ฏ์๊ฒ ์ ์ฝ์ด๋ ํฌ๊ธฐ๋ฅผ ์ง์ ํด์ค๋ค. Render Tree์ Render Object๋ค์ ์ด๋ฌํ ์ ์ฝ/ํฌ๊ธฐ ์ ๋ณด์ ๊ทผ๊ฑฐํด ์์ ฏ์ ๊ทธ๋ ค์ฃผ๋๋ฐ ์ด๋ renderobject์ ํ์ ํด๋ฆฌ์ค์ธ render box๋ box constraint๋ฅผ ์ ๋ฌํด์ฃผ๋ box ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ค. ๋ฐ์ค ํ๋กํ ์ฝ์ ์ปจํ ์ด๋ ์์ ฏ์ด๋ sizedBox์ฒ๋ผ ๋ฐ์ค ํํ๋ก ๊ฐ๋ก์ธ๋ก ์ต๋์ต์์ ๊ฐ์ด ์ผ๋ง์ธ์ง์ ๊ทผ๊ฑฐํด์๋ง ๊ทธ๋ ค์ง๋ค.
๋ฌธ์ ๋ ์คํฌ๋กค ํ ๋ ๋ํ๋๋ค. ๋ฐ์ค ํ๋กํ ์ฝ์ ์ด์ฉํ๋ฉด ๋ถ๋ชจ์์ ฏ์ด ์ง์ ํด์ค ๊ณ ์ ๋ ํฌ๊ธฐ์ ์์น๋ฅผ ๊ทธ๋ ค์ฃผ๋๋ฐ ์คํฌ๋กค๋ก ์ธํด ๋ณด์ฌ์ง๋ ์์ญ๊ณผ ์ ์ฒด ์์ญ์ด ๋ฌ๋ผ์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค. ๊ทธ๋์ ์ฌ๋ฆฌ๋ฒ ํํ ํ ์ฝ์ ์ฌ์ฉํ๋ค. ์ฌ๋ฆฌ๋ฒ๋ ์คํฌ๋กค ๊ฐ๋ฅํ ์์ญ ๋ด์์ ์์ ์ ํฌ๊ธฐ์ ์์น๋ฅผ ๋์ ์ผ๋ก ์กฐ์ ํ๋ค.
์ฌ๋ฆฌ๋ฒ ํ๋ก์ฝ์์ ์์์ sliver constraints๋ฅผ ๋ฐ๊ฒ๋๋ค. sliver constraints์๋ scroll, axis, scrollOffset, paintExtent๋ฑ์ ์ ๋ณด๋ฅผ ์ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ต์ข ์ ์ผ๋ก render sliver๊ฐ ํ๋ฉด์ ๊ทธ๋ ค์ฃผ๊ฒ ๋๋ค.
๋ง์ฝ ListView, GridView๋ฅผ ๋์์ ์ฌ์ฉํ๊ณ ์ถ๊ฑฐ๋ ์คํฌ๋กค๋ง ์ดํํธ๋ฅผ ์ฃผ๊ณ ์ถ๋ค๋ฉด CustomScrollView์์ ฏ์ ์ด์ฉํ๋ค. CustromScrollView์๋ ListView ๋ GridView ๊ฐ ์๋์ ์ผ๋ก ์ป๋ Sliver๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ง์ sliver์ ์ ๊ทผํด์ ์ธ ์ ์์ด์ ๋ค์ํ ์ปค์คํฐ๋ง์ด์ง์ ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค.
'๐ฆ Flutter' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Stateless Widget ์ const๋ฅผ ๋ถ์ฌ์ผํ๋ ์ด์ (0) | 2024.05.30 |
---|---|
flutter_localization depends on flutter_localizations from sdk which depends on intl 0.18.1 ์๋ฌ (2) | 2024.05.30 |
Throw ์์ฐ๊ณ ์๋ฌ ์๋ฏธ์๊ฒ ์ฒ๋ฆฌํ๊ธฐ (0) | 2024.05.29 |
Flutter ํ๋ก์ ํธ ๋๋ฒ๊ทธ์ฉ/๋ฐฐํฌ์ฉ ๋ถ๋ฆฌํ๊ธฐ (0) | 2024.05.24 |
fatal error: module 'cloud firestore' not found ์ด์ (0) | 2024.05.24 |