[Flutter] Skeleton Loader ์ ์šฉ๊ธฐ ๐Ÿ”ฅ

Taehyun Namยท2022๋…„ 1์›” 21์ผ
0
post-thumbnail

์•ˆ๋…•ํ•˜์„ธ์š” ๐Ÿ‘‹

์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ Skeleton Loader๋ฅผ ์ ์šฉํ•˜๋ ค๋Š” ์ด์œ ๋ฅผ ๋จผ์ € ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฒซ๋ฒˆ์งธ, API๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ๋ฐ์ดํ„ฐ ์ˆ˜์‹ ๊นŒ์ง€ ์•ฝ n์ดˆ ์ •๋„ ์†Œ์š”๋˜์–ด ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ต๋‹ตํ•˜๊ฒŒ ๋Š๊ปด์งˆ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.
๋‘๋ฒˆ์งธ, ๋กœ๋”ฉ์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์‚ฌ์šฉ์ž๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ณผ ์ˆ˜๋„ ๋งŒ์งˆ ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค.
์„ธ๋ฒˆ์งธ, ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ์„œ UX๋ฅผ ๊ฐœ์„ ํ•ด ๋ณด๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„ ๋ฐฉ๋ฒ•

์ €๋Š” ํŒจํ‚ค์ง€๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ, Skeleton Widget์€ ์ง์ ‘ ๊ฐœ๋ฐœํ•˜๊ณ  ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋งŒ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์„œ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

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)
      ),
    );
  }

Skeleton Loading ์ ์šฉ

์ €๋Š” 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์„ ๊ฐœ๋ฐœํ•˜์—ฌ ์ ์šฉํ•ด์•ผํ•˜๋Š”๊ฒŒ ๋‹ค์†Œ ๋ฒˆ๊ฑฐ๋กญ์ง€๋งŒ,
์ ์šฉ ํ–ˆ์„๋•Œ ํšจ๊ณผ๋Š” ๊ต‰์žฅํ•œ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๐Ÿ™Œ ๐Ÿ™Œ

profile
Frontend Developer

0๊ฐœ์˜ ๋Œ“๊ธ€