๐Ÿ˜ƒย What I Learned

Taesoo Kimยท2024๋…„ 4์›” 20์ผ

import ๊ด€๋ จ

๊ธฐ๋ณธ์ ์œผ๋กœ import ๋ฐฉ๋ฒ•์€ package:ํ”„๋กœ์ ํŠธ๋ช…/(lib๊ฐ€ ๋ฃจํŠธ์ผ๋•Œ ํดํ„ฐ ๋ฃจํŠธ)/(import ํ•  ํŒŒ์ผ๋ช…) ์œผ๋กœ importํ•˜๋ฉด ๋œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋‹ค๋ณด๋ฉด import ์ค„์ด ๋งŽ์•„์ง€๋Š”๋ฐ, ๋‚˜์ค‘์— ํ˜ผ์„ ์„ ์ผ์œผํ‚ฌ ์—ฌ์ง€๊ฐ€ ์žˆ์Œ. ๊ทธ๋ž˜์„œ Single Import ํŒจํ„ด์œผ๋กœ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊พธ์–ด ์ง„ํ–‰ํ•˜๋ฉด ํ•œ๋ฒˆ์— import๋ฅผ ์ง„ํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค.

https://velog.io/@ximya_hf/manangesseveralimportinflutterbysinlgeimport

๊ฐ์ž์˜ ํด๋”์— index.dart๋ฅผ ๋งŒ๋“ค์–ด ํด๋” ์•ˆ์˜ ํŒจํ‚ค์ง€๋“ค์„ ๋ฌถ์–ด์„œ exportํ•œ๋‹ค๋ฉด, ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ index๋ฅผ importํ•ด ์‚ฌ์šฉํ•˜๋ฉด ํŽธํ•˜๊ฒŒ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.

$ dart run single_import_generator -target=lib/presentation/common dir

๋ˆ„๊ตฐ๊ฐ€ ๊ณ ๋ง™๊ฒŒ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค์–ด ๋‘์–ด์„œ ํ•ด๋‹น ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์•Œ์•„์„œ ์ •๋ฆฌ ํ•ด ์ค€๋‹ค.

PageView

์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์œ„์ ฏ. ์–ด๋–ป๊ฒŒ ๋„˜๊ธธ์ง€(๊ฐ€๋กœ๋กœ ๋„˜๊ธธ์ง€, ์„ธ๋กœ๋กœ ๋„˜๊ธธ์ง€..) ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ง€์ • ๊ฐ€๋Šฅํ•˜๋‹ค. ์ •์ ์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ, ๋™์ ์œผ๋กœ๋„ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค.

class HomeScreen extends StatelessWidget {

  const HomeScreen({super.key});

  

  @override

  Widget build(BuildContext context) {

    return Scaffold(

        body: PageView(

            children: [1, 2, 3, 4, 5]

                .map(

                  (e) => Image.asset('assets/image_$e.jpeg', fit: BoxFit.cover),

                )

                .toList()));

  }

}

์ด๊ฐ™์ด PageView๋กœ ๊ฐ๊ฐ ๋‹ค๋ฅธ Image asset์„ ์บ๋Ÿฌ์…€ ํ˜•ํƒœ๋กœ dpํ•  ์ˆ˜ ์žˆ๋‹ค.

Stateful Widget

๋™์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ๋žœ๋”๋งํ•˜๋Š” ์œ„์ ฏ์„ ์ง€์นญํ•ฉ๋‹ˆ๋‹ค. ๋™์ ์œผ๋กœ ๋ฐ”๋€Œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ 2๊ฐœ์˜ ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•œ๋ฐ,

class DynamicScreen extends StatefulWidget {

  const DynamicScreen({super.key});

  

  @override

  State<DynamicScreen> createState() => _DynamicScreenState();

}

  

class _DynamicScreenState extends State<DynamicScreen> {

  final PageController pageController = PageController();

  

  @override

  void initState() {

    super.initState();

  

    Timer.periodic(Duration(seconds: 3), (timer) {

      int? currentPage = pageController.page?.toInt();

      if (currentPage == null) return;

      if (currentPage == 4) {

        currentPage = 0;

      } else {

        currentPage++;

      }

  

      pageController.animateToPage(currentPage,

          duration: Duration(milliseconds: 500), curve: Curves.ease);

    });

  }

  

  @override

  Widget build(BuildContext context) {

    return Scaffold(

        body: PageView(

            controller: pageController,

            children: [1, 2, 3, 4, 5]

                .map(

                  (e) => Image.asset('assets/image_$e.jpeg', fit: BoxFit.cover),

                )

                .toList()));

  }

}

์‹ค์ œ๋กœ ๋žœ๋”๋ง ๋˜์–ด์•ผํ•˜๋Š” ์œ„์ ฏ๊ณผ, ๋ฐ”๋€Œ๋Š” ์ƒํƒœ๋ฅผ ์บ์น˜ํ•˜๋Š” State๊ฐ€ ํ•„์š”ํ•˜๋‹ค. State๋ฅผ ํ†ตํ•ด์„œ ์œ„์ ฏ์˜ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ์• ๋‹ˆ๋ฉ”์ด์…˜, ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ํ†ตํ•ฉ์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๊ธฐ๋ณธ ๋ผ์ดํ”„์‚ฌ์ดํด(Life Cycle)

  1. stateless ์œ„์ ฏ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ constructor๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  createState()๋ฅผ ํ†ตํ•ด์„œ ๊ด€๋ จ state๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. initState()๋ฅผ ํ†ตํ•ด State๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋…ผ๋ฆฌ์ ์œผ๋กœ initState๋Š” createState()์— ์ข…์†์ ์ด๋ผ ํ•œ๋ฒˆ๋ฐ–์— ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  3. initState์— ์ข…์†๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋ฉด state์˜ ์ƒํƒœ๋Š” dirty๋กœ ๋ฐ”๋€Œ๊ณ  ๋‹ค์‹œ build()๋ฅผ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. build()๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด ์ƒํƒœ๋Š” clean์œผ๋กœ ๋ฐ”๋€Œ๊ณ  build()๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  4. ์œ„์ ฏ์ด ํŠธ๋ฆฌ์—์„œ ๋‚ด๋ ค๊ฐ„๋‹ค๋ฉด, dispose()๋กœ ํ๊ธฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
profile
๋ญ” ์ƒ๊ฐ์„ ํ•ด. ๊ทธ๋ƒฅ ํ•˜๋Š” ๊ฑฐ์ง€ ๋ญ

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