์๋ ํ์ธ์ ๐
์์ํ๊ธฐ์ ์์ Skeleton Loader๋ฅผ ์ ์ฉํ๋ ค๋ ์ด์ ๋ฅผ ๋จผ์ ๋ง์๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ฒซ๋ฒ์งธ, API๋ฅผ ํธ์ถํ๋ฉด, ๋ฐ์ดํฐ ์์ ๊น์ง ์ฝ n์ด ์ ๋ ์์๋์ด ์ฌ์ฉ์๊ฐ ๋ต๋ตํ๊ฒ ๋๊ปด์ง ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
๋๋ฒ์งธ, ๋ก๋ฉ์ด ์๋ฃ๋ ๋๊น์ง ์ฌ์ฉ์๋ ์๋ฌด๊ฒ๋ ๋ณผ ์๋ ๋ง์ง ์๋ ์์ต๋๋ค.
์ธ๋ฒ์งธ, ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ก์ UX๋ฅผ ๊ฐ์ ํด ๋ณด๊ณ ์ถ์์ต๋๋ค.
์ ๋ ํจํค์ง๋ฅผ ์ต์ํ์ผ๋ก ์ฌ์ฉํด์ ๊ตฌํํด๋ณด๊ณ ์ถ์์ต๋๋ค.
๋ฐ๋ผ์, Skeleton Widget์ ์ง์ ๊ฐ๋ฐํ๊ณ ์ ๋๋ฉ์ด์
ํจ๊ณผ๋ง ํจํค์ง๋ฅผ ์ค์นํด์ ๊ตฌํํ์ต๋๋ค.
๊ฐ๋จํ๊ฒ ์ฌ๊ฐํ ๋ชจ์์ ๋ผ๋๋ฅผ ๋ง๋ค์ด ๋ดค์ต๋๋ค.
width, height, color, radius ๋ฑ๋ฑ ๊ฐ์ ์
๋ง๋๋ก ์์ฑํ๋ฉด ๋ฉ๋๋ค.
Widget SkeletonLoader() {
return Container(
width: 300,
height: 200,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(5),
color: Color.fromRGBO(240, 240, 240, 1)
),
);
}
์ ๋ FutureBuilder ๋ด๋ถ์ isLoading ๋ณ์๋ฅผ ๋ง๋ค์์ต๋๋ค.
isLoading == true ์ด๋ฉด, SkeletonLoader๋ฅผ ์ถ๋ ฅํ๊ณ , ์๋๋ฉด ListView.builder๋ก ๋๋๋ง์ ํ์ต๋๋ค.
bool isLoading = snapshot.connectionState == ConnectionState.waiting;
isLoading ? SkeletonLoader() : ListView.builder(~์๋ต~)
Skeleton ๋ง ์์ผ๋ฉด ์ฌ์ฌํ๊ธฐ์ ๋ก๋ฉ ์ ๋๋ฉ์ด์ ์ ์ถ๊ฐํด๋ณด๊ฒ ์ต๋๋ค. ๐บ๐บ
https://pub.dev/packages/shimmer
like ์๊ฐ ๋ง๊ณ , ์ฌ์ฉ ๋ฐฉ๋ฒ๋ ์ฌํํด์ ๋ง์์ ๋ค์์ต๋๋ค.
๊ธฐ์กด์ ๋ง๋ค์ด ๋์๋ SkeletonLoader์ ๋ฐ์์ ํด๋ณด๊ฒ ์ต๋๋ค.
Widget SkeletonLoader() {
return Shimmer.fromColors(
baseColor: Color.fromRGBO(240, 240, 240, 1),
highlightColor: chWhite,
child: Container(
width: 300,
height: 200,
decoration: BoxDecoration(borderRadius: BorderRadius.circular(5), color: Colors.grey),
),
);
}
๋ง์ ํด๋ณด๋ ์ด๋ ต๊ณ ๋ณต์กํ๊ฑฐ๋ ์ ํ ์๊ณ , ๋จ์ง ํ๋์ Loading Widget์ผ๋ก ๋ชจ๋ ์ฌ์ฉํ๋๊ฒ ์๋๋ผ
๊ฐ๊ฐ์ ํ์ํ Skeleton Widget์ ๊ฐ๋ฐํ์ฌ ์ ์ฉํด์ผํ๋๊ฒ ๋ค์ ๋ฒ๊ฑฐ๋กญ์ง๋ง,
์ ์ฉ ํ์๋ ํจ๊ณผ๋ ๊ต์ฅํ๊ฒ ๊ฐ์ต๋๋ค. ๐ ๐