๐Ÿ—๏ธ์†Œํ”„ํŠธ์›จ์–ด/Flutter

Flutter Wrap ์œ„์ ฏ ์‚ฌ์šฉ ํŒ: option(โŒฅ)+enter ๋‹จ์ถ•ํ‚ค ํ™œ์šฉํ•˜๊ธฐ

Dev.Op 2023. 10. 1. 16:05
๋ฐ˜์‘ํ˜•
๋”๋ณด๊ธฐ

option(โŒฅ)+ enter : ๊ฐ์‹ธ๋Š” ๊ตฌ์กฐ(Wrap) ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ œ๊ฑฐํ• ๋•Œ ํ™œ์šฉ

1. Introduction

Flutter์—์„œ๋Š” Wrap ์œ„์ ฏ์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ™”๋ฉด์˜ ๋ชจ๋“  ์š”์†Œ ์ž์ฒด๊ฐ€ ์œ„์ ฏ์ด๋‹ค ๋ณด๋‹ˆ, ๋ฐฐ์น˜๋ฅผ ํ• ๋•Œ Column, Row, Container ๋“ฑ์„ ์ ์ ˆํ•˜๊ฒŒ ํ˜ผ์žฌํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ VS Code ๋˜๋Š” Android Studio๋กœ ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ๊ฒฝ์šฐ ์ƒˆ๋กญ๊ฒŒ Wrap ์„ ํ•˜๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ์‰ฝ์ง€ ์•Š์€ ์ž‘์—…์ด๋‹ค.

 

๊ด„ํ˜ธ๊ฐ€ ๋งŽ๊ณ  ์ž์นซ ์ž˜๋ชปํ–ˆ๋‹ค๊ฐ€ ์ฝ”๋“œ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์ƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๊ทธ๋ž˜์„œ Wrap ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” option ํ‚ค์™€ enter ํ‚ค๋ฅผ ๊ฐ™์ด ๋ˆ„๋ฅด๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ์œ„์ ฏ์— ๋Œ€ํ•ด ์–ด๋–ค ์‹์œผ๋กœ ๊ฐ์Œ€ ๊ฒƒ์ธ์ง€, ๋˜๋Š” ๊ฐ์‹ธ์ ธ ์žˆ๋Š” ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•  ๊ฒƒ์ธ์ง€ ์„ ํƒ์„ ํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

 

์•„๋ž˜ ๊ทธ๋ฆผ ์ฐธ์กฐ.

 

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ์—์„œ ์ƒˆ๋กญ๊ฒŒ ์œ„์ ฏ๋“ค์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋„ฃ๋Š” ์ž‘์—…์ด ํŽธ๋ฆฌํ•ด์ง„๋‹ค.

 

Flutter ์‹ค์Šต์œผ๋กœ ๋‹ค์Œ 4๊ฐ€์ง€์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

 

2. To Study

- MaterialApp์—์„œ appBarTheme์—์„œ backgroundColor ์†์„ฑ๊ณผ titleTextStyle ์†์„ฑ์—์„œ ์ƒ‰์ƒ๊ณผ ํฐํŠธ ์‚ฌ์ด์ฆˆ ์ˆ˜์ •ํ•˜๊ธฐ

[Stateless Widget]

- Scafford ์‚ฌ์šฉํ•˜๊ธฐ

- Center, Column, Row ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  mainAxisAlignment ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ ฌ ๋งž์ถฐ๋ณด๊ธฐ

- ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ์นด์šดํŒ…ํ•˜๋Š” ๊ฐ’ ๋งŒ๋“ค์–ด๋ณด๊ธฐ

 

 

์‹ค์Šต ํŒŒ์ผ : main.dart

 

์•„๋ž˜ ์ผ๋ถ€ ์ฝ”๋“œ.

 

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
        // appBar ์ƒ‰์ƒ ๋ณ€๊ฒฝ
        appBarTheme: AppBarTheme(
          backgroundColor: Colors.blue, // appBar ์ „์ฒด ์ƒ‰์ƒ ํŒŒ๋ž€์ƒ‰
          titleTextStyle: TextStyle(
              color: Colors.black,
              fontSize: 25.0, // ํฐํŠธ ์‚ฌ์ด์ฆˆ ๊ธฐ๋ณธ ์‚ฌ์ด์ฆˆ์˜ 2.5๋ฐฐ
          ), // title ํ…์ŠคํŠธ ์ƒ‰์ƒ ๊ฒ€์ •์ƒ‰
        )
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int count = 1;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
                '$count',
                style: TextStyle(
                  color: Colors.black,
                  fontSize: 100,
                )),
            Text(
                '$count',
                style: TextStyle(
                  color: Colors.red,
                  fontSize: 70,
                )),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // ํ™”๋ฉด ๊ฐฑ์‹ 
          setState(() {
            count++;
          });
        },
        child: Icon(Icons.add_box_outlined)
      ),
    );
  }
}

 

- MaterialApp์—์„œ appBarTheme์—์„œ backgroundColor ์†์„ฑ๊ณผ titleTextStyle ์†์„ฑ์—์„œ ์ƒ‰์ƒ๊ณผ ํฐํŠธ ์‚ฌ์ด์ฆˆ ์ˆ˜์ •ํ•˜๊ธฐ

[Stateless Widget]

 

์šฐ์„ ์ ์œผ๋กœ MaterialApp์€ ํ”Œ๋Ÿฌํ„ฐ์˜ ์ตœ์ƒ์œ„ ์œ„์ ฏ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

๊ธฐ๋ณธ์ ์ธ ๋ ˆ์ด์•„์›ƒ์˜ ์„ค์ •์„ ์—ฌ๊ธฐ์„œ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์•„๋ž˜ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์ด ์žˆ๋‹ค.

์ˆœ์„œ ๊ตฌ์„ฑ ์š”์†Œ ์„ค๋ช…
1 title ์•ฑ์˜ ์ด๋ฆ„์ด๋‚˜ ์ œ๋ชฉ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•ฑ์„ ์‹œ์ž‘ํ•  ๋•Œ ํ‘œ์‹œ๋˜๋Š” ๊ธฐ๋ณธ ์•ฑ ๋ฐ”์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
2 home ์˜ ๊ธฐ๋ณธ ํ™ˆ ํŽ˜์ด์ง€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•ฑ์ด ์‹œ์ž‘๋  ๋•Œ ํ‘œ์‹œ๋˜๋Š” ์ฒซ ๋ฒˆ์งธ ํ™”๋ฉด์ž…๋‹ˆ๋‹ค.
3 theme ์•ฑ์˜ ์ „๋ฐ˜์ ์ธ ํ…Œ๋งˆ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ƒ‰์ƒ ์Šคํ‚ค๋งˆ, ํฐํŠธ ์Šคํƒ€์ผ, ์•„์ด์ฝ˜ ํ…Œ๋งˆ ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
4 routes ์•ฑ ๋‚ด๋ถ€์˜ ๋‹ค์–‘ํ•œ ํ™”๋ฉด์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์šฐํŠธ ๋งต์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ผ์šฐํŠธ๋Š” ํ™”๋ฉด ์œ„์ ฏ๊ณผ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
5 initialRoute ์•ฑ์ด ์ฒ˜์Œ ์‹œ์ž‘๋  ๋•Œ ํ‘œ์‹œํ•  ์ดˆ๊ธฐ ๋ผ์šฐํŠธ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
6 onGenerateRoute ๋ผ์šฐํŒ…์ด ํ•„์š”ํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ํ•จ์ˆ˜๋Š” ๋™์ ์œผ๋กœ ๋ผ์šฐํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
7 locale ๋กœ์ผ€์ผ์„ ์„ค์ •ํ•˜์—ฌ ์•ฑ์˜ ์–ธ์–ด ๋ฐ ์ง€์—ญํ™”๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
8 supportedLocales ์ง€์›ํ•˜๋Š” ๋กœ์ผ€์ผ ๋ชฉ๋ก์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์ด ๋‹ค๊ตญ์–ด๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
9 ๊ธฐํƒ€ ์„ค์ • debugShowCheckedModeBanner, navigatorObservers, home, builder, onUnknownRoute ๋“ฑ ๋‹ค์–‘ํ•œ ์•ฑ ์„ค์ •์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

- Scafford ์‚ฌ์šฉํ•˜๊ธฐ

์—ฌ๊ธฐ์„œ Scaffold๋ฅผ ์ด์šฉํ•ด์„œ ์ „์ฒด ์ฝ”๋“œ๋ฅผ ๊ฐ์‹ธ๋Š” ๊ตฌ์กฐ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

 

 

๊ทธ ์ด์œ ๋Š” ์ผ๋ฐ˜์ ์ธ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๋ฉฐ, ์•ฑ ๋ฐ” (AppBar), ๋ฐ”ํ…€ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ” (BottomNavigationBar), ์Šค๋‚ต๋ฐ” (SnackBar) ๋ฐ FAB์™€ ๊ฐ™์€ ๊ธฐ๋ณธ UI ์š”์†Œ๋ฅผ ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์–ด์„œ์ด๋‹ค. ๋˜ํ•œ ์ผ๋ฐ˜์ ์œผ๋กœ UI ์š”์†Œ๋ฅผ ์ผ์ผ์ด ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ ๋„ ์ผ๋ฐ˜์ ์ธ ์•ฑ ๋””์ž์ธ์„ ๋น ๋ฅด๊ฒŒ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ณ , ์ปค์Šคํ† ๋งˆ์ด์ง•์ด ํŽธ๋ฆฌํ•˜๋‹ค.

 

 

- Center, Column, Row ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  mainAxisAlignment ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ ฌ ๋งž์ถฐ๋ณด๊ธฐ

Center๋กœ ๋งž์ท„๊ธฐ ๋•Œ๋ฌธ์— ํ™”๋ฉด ์ƒ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ€์šด๋ฐ ๋ถ€๋ถ„์— ์œ„์น˜ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ์—ฌ๊ธฐ์—์„œ๋„ mainAxisAlignment ๋ฅผ ์ด์šฉํ•ด ๊ฐ€์šด๋ฐ ์„ค์ •์„ ์œ ์ง€ํ–ˆ๋‹ค.

 

 

- ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ์นด์šดํŒ…ํ•˜๋Š” ๊ฐ’ ๋งŒ๋“ค์–ด๋ณด๊ธฐ

๋ณ€์ˆ˜๋Š” ์‚ฌ์šฉํ• ๋•Œ, $ ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

children: [
    Text(
        '$count',
        style: TextStyle(
          color: Colors.black,
          fontSize: 100,
        )),

 

3. Conclusion

Flutter์—์„œ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด๋ณด๊ณ , ๊ทธ ์•ˆ์—์„œ ์ƒˆ๋กœ์šด ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด์„œ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

 

 

 

 

 

 

 

 

 

 

 

 

๋ฐ˜์‘ํ˜•