Flutter

[Flutter] 연습하기1 - flutter store app

연화 2025. 1. 7. 19:19

플러터를 이용해서 간단한 store App을 만들며 문법에 익숙해져보도록 하겠습니다.
만들면서 배우는 플러터 앱 프로그래밍을 바탕으로 연습했습니다.

코드를 짜기 전, 최상단 폴더에 assets 폴더를 만들고 이미지를 넣어줍니다.

yaml 파일 설정
  # To add assets to your application, add an assets section, like this:
  assets:
    - assets/bag.jpeg
    - assets/cloth.jpeg

yaml 파일에서 assets 폴더의 이미지를 사용할 거라고 명시해주면 프로젝트에서 이미지를 가져올 수 있습니다.

 

시나리오 코드 1 - 초기 코드 작성
// 플러터 동작시 반드시 있어야 함
import 'package:flutter/material.dart';

// 코드의 시작점
void main() {
  // 플러터는 거의 모든 것이 위젯
  // 전달된 위젯을 최상위 위젯으로 설정하고 앱을 시작하는 함수
  runApp(MyApp());
}

//stl 단축키 활용
class MyApp extends StatelessWidget {
  // 생성자 - 매개변수 : 선택적 명명 매개변수
  MyApp({super.key});

  // 부모클래스의 메서드를 재정의하는 문법
  // build 함수는 화면에 그림을 그려주는 함수
  // buildContext는 위젯 트리에서의 위치와 관련된 다양한 정보를 포함하고 있음
  @override
  Widget build(BuildContext context) {
    // const 상수를 만들어주는 키워드이다 < 컴파일시점
    return const Placeholder();
  }
}

플러터는 거의 모든 것이 위젯입니다.
main 함수에서 runApp() 을 통해 위젯을 최상위 위젯으로 설정하고 앱을 시작합니다.
build 함수는 화면에 그림을 그려주는 함수입니다.
buildContext는 위젯 트리에서의 위치와 관련된 다양한 정보를 포함하고 있습니다.

 

시나리오 코드 2 - MaterialApp 위젯 추가
import 'package:flutter/material.dart';

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

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

  // Flutter 개발을 할 때 맨 밑바닥부터 개발하는 것은 힘들다
  // 기본적 개발을 할 수 있도록 매우 유용한 클래스를 제공한다
  // MaterialApp
  @override
  Widget build(BuildContext context) {
    // 생성자
    // home: (라벨) 선택적 명명 매개변수로 설계되어있다.
    return MaterialApp(
      // div 박스와 같은 녀석
      home: StorePage(),
    );
  }
}

class StorePage extends StatelessWidget {
  StorePage({super.key});

  @override
  Widget build(BuildContext context) {
    return const Placeholder();
  }
}

MaterialApp은 HTML 기준으로 div 박스와 같은 역할을 한다고 생각하면 됩니다.

import 'package:flutter/material.dart';

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

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

  // Flutter 개발을 할 때 맨 밑바닥부터 개발하는 것은 힘들다
  // 기본적 개발을 할 수 있도록 매우 유용한 클래스를 제공한다
  // MaterialApp
  @override
  Widget build(BuildContext context) {
    // 생성자
    // home: (라벨) 선택적 명명 매개변수로 설계되어있다.
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      // div 박스와 같은 녀석
      home: StorePage(),
    );
  }
}

class StorePage extends StatelessWidget {
  StorePage({super.key});

  @override
  Widget build(BuildContext context) {
    // 시각적 레이아웃 구조를 잡아주는 위젯
    return Scaffold(
      // 안전영역 내에 자식 위젯들을 배치하도록 도와준다.
      body: SafeArea(
        child: Column(
          // 위젯은 자식 또는 자식들을 속성으로 가질 수 있다.
          children: [
            Padding(
              padding: EdgeInsets.all(25.0),
              // Row 위젯은 자식 위젯들을 수평 방향으로 정렬해주는 위젯이다
              child: const Row(
                children: [
                  Text(
                    'Woman',
                    style: TextStyle(fontWeight: FontWeight.bold),
                  ),
                  Spacer(), // Spacer 위젯은 남은 공간을 차지하여 위젯 간격을 조절할 때 활용 가능
                  Text(
                    'Kids',
                    style: TextStyle(fontWeight: FontWeight.bold),
                  ),
                  Spacer(),
                  Text(
                    'Shoes',
                    style: TextStyle(fontWeight: FontWeight.bold),
                  ),
                  Spacer(),
                  Text(
                    'Bag',
                    style: TextStyle(fontWeight: FontWeight.bold),
                  ),
                ],
              ),
            ),
            // Expanded 위젯은 자식 위젯을 가용 공간에 맞게 확장시켜 배치하는 위젯
            Expanded(
                child: Image.asset(
              'assets/bag.jpeg',
              fit: BoxFit.cover,
            )),
            // SizedBox은 고정된 크기의 빈 공간을 만들거나 자식 위젯의 크기를 제한할 때 사용
            SizedBox(
              height: 2,
            ),
            Expanded(
                child: Image.asset(
              'assets/cloth.jpeg',
              fit: BoxFit.cover,
            )),
          ],
        ),
      ),
    );
  }
}

 

 

 

아래의 문헌을 참고하여 작성된 포스팅입니다.
최주호, 김근호, 이지원(공저) 『만들면서 배우는 플러터 앱 프로그래밍』, 앤써북, 2023.