๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽ iOS & ๐Ÿ”น Flutter/๐Ÿ”ฅ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

[Flutter] ์›ํ•˜๋Š” ์œ„์น˜๋กœ Scroll ํ•˜๊ธฐ

by MINT09 2025. 3. 23.

 

์•ˆ๋…•ํ•˜์‹ญ๋‹ˆ๊นŒ, ๋ฏผํŠธ์ž…๋‹ˆ๋‹ค ๐Ÿ˜ˆ

์ด๋ฒˆ ํฌ์ŠคํŒ…์€ Flutter ์ž‘์—…์„ ํ•˜๋ฉฐ ์žˆ์—ˆ๋˜ ์ผ์ž…๋‹ˆ๋‹ค. Swift์™€ ๋‹ค๋ฅด๊ฒŒ, Flutter๋Š” ํŠน์ • item์œผ๋กœ Scroll์„ ํ•ด์ฃผ๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•˜์ง€๋Š” ์•Š๋”๋ผ๊ณ ์š”. ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ item ๋†’์ด๋ฅผ ๊ณฑํ•œ ์˜คํ”„์…‹์œผ๋กœ Scrollํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ์•„๋ž˜์™€ ๊ฐ™์€ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์–ด์š”. 

๐Ÿ“š ์ž‘์—…
- SalaryCap ์ดˆ๊ณผํ•ด์„œ ๊ตฌ๋งค๊ฐ€ ์•ˆ๋˜๋Š” ์„ ์ˆ˜๋Š” skipํ•˜๊ณ  ์Šคํฌ๋กคํ•ด์„œ ๊ตฌ๋งค ๊ฐ€๋Šฅ ์„ ์ˆ˜๋ถ€ํ„ฐ ๋ณด์—ฌ์ฃผ๊ธฐ

1. ๋‹ค์‹œ ๋Œ์•„๊ฐ€๋Š” Scroll

๋ชธ๊ฐ’์ด ๋‚ฎ๊ฑฐ๋‚˜ ๊ฐ™์€ ์ฒซ๋ฒˆ์งธ ์„ ์ˆ˜์˜ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์•„, player item ํ•˜๋‚˜์˜ ๋†’์ด๋ฅผ ๊ณฑํ•œ ์˜คํ”„์…‹์œผ๋กœ scrollํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋•Œ `shrinkWrap: true`, `NeverScrollableScrollPhysics()`๋กœ ์ธํ•ด ์Šคํฌ๋กค ์˜์—ญ์ด ๋ถ€๋ชจ ์œ„์ ฏ์ด๋‚˜ ๋ ˆ์ด์•„์›ƒ์ด ์žฌ๊ตฌ์„ฑ๋˜๋ฉฐ ๋‹ค์‹œ ์›๋ž˜ ์œ„์น˜๋กœ ์›์ƒ๋ณต๊ตฌ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. 

๋•Œ๋ฌธ์— `shrinkWrap: true`, `NeverScrollableScrollPhysics()` ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ๋…๋ฆฝ์ ์œผ๋กœ ListView๊ฐ€ scrollํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค. 

2. ๋†’์ด ๋งž์ถ”๊ธฐ

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝํ•œ ํ›„์—๋„ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋Š”๋ฐ, ListView์˜ ๋†’์ด๋‚˜ ์ œ์•ฝ์กฐ๊ฑด์ด ์—†์–ด์„œ ์ด๋ฅผ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณ ๋ฏผํ•˜๋‹ค ์ „์ฒด ๋†’์ด์—์„œ ๊ฐ ์œ„์™€ ์•„๋ž˜์— ์žˆ๋Š” ๊ณ ์ •๋œ ๋„ค๋น„๋ฐ”๋“ค์˜ ๋†’์ด๋งŒ ์ œํ•ด์ฃผ๋ฉด ๋  ๊ฒƒ ๊ฐ™์•„์„œ, SizedBox๋ฅผ ํ™œ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. 

// ์ƒ๋‹จ์˜ ๋†’์ด? 80(ํฌ์ง€์…˜ + ๋‚จ์€ ๊ธˆ์•ก) + 56(AppBarDefault) + 50(Week ์„ค๋ช…)
// ํ•˜๋‹จ์˜ only home nav ๋†’์ด 80
final double screenHeight = MediaQuery.of(context).size.height;
final double listHeight = screenHeight - 266;

    return SelectLineupScaffold(
      title: "select_a_position".tr(args: [widget.position]),
      weekStr: weekStr,
      child: isProcessing
          ? Center(
              child: CircularProgressIndicator(
                color: Colors.red[900],
              ),
            )
          : SizedBox(
              height: listHeight,
              child: ListView.separated(
                   //์ฝ”๋“œ ์ƒ๋žต
              ),
          );
    }