Study

31. Flutter에서 레이아웃을 구성하는 방법: 단계별 가이드 | Flutter

구구 구구 2024. 7. 31. 11:00
반응형

추상화 스타일? 아닌 거 같은데, dall-e

 

Flutter에서 레이아웃을 구성하는 방법: 단계별 가이드

 

01. 서론

1) Flutter의 소개 및 중요성

Flutter의 장점과 특징

Flutter는 구글에서 개발한 오픈소스 UI 소프트웨어 개발 키트로, 하나의 코드베이스로 안드로이드, iOS, 웹, 데스크톱 등 다양한 플랫폼에서 애플리케이션을 개발할 수 있게 해줍니다. Flutter의 주요 장점과 특징은 다음과 같습니다:

  • 단일 코드베이스: 하나의 코드베이스로 여러 플랫폼에서 애플리케이션을 실행할 수 있어, 개발 시간과 비용을 절감할 수 있습니다.
  • 풍부한 위젯: Flutter는 다양한 커스텀 위젯을 제공하여, 개발자가 원하는 대로 UI를 구성할 수 있습니다. 이러한 위젯은 고도로 최적화되어 있어 성능이 뛰어납니다.
  • Hot Reload: 코드 변경 시 즉시 결과를 확인할 수 있는 Hot Reload 기능을 통해, 개발자는 빠르게 UI를 수정하고 디버깅할 수 있습니다.
  • 높은 성능: Flutter는 네이티브 코드로 컴파일되므로, 성능이 매우 뛰어납니다. 이는 네이티브 애플리케이션과 유사한 사용자 경험을 제공합니다.

다양한 플랫폼에서의 사용 가능성

Flutter는 안드로이드와 iOS뿐만 아니라 웹과 데스크톱 플랫폼에서도 애플리케이션을 실행할 수 있습니다. 이를 통해 Flutter로 개발된 애플리케이션은 다양한 기기에서 일관된 사용자 경험을 제공합니다. Flutter의 다중 플랫폼 지원은 개발자에게 큰 이점을 제공하며, 다양한 사용자 층을 확보할 수 있는 기회를 제공합니다.

2) 레이아웃 구성의 필요성

사용자 경험(UX) 향상을 위한 레이아웃 구성

효과적인 레이아웃 구성은 사용자 경험(UX)을 크게 향상시킬 수 있습니다. 사용자가 애플리케이션을 사용하는 동안 쉽게 탐색하고 원하는 정보를 빠르게 찾을 수 있도록 하는 것이 중요합니다. 잘 구성된 레이아웃은 사용자의 만족도를 높이고, 애플리케이션의 사용성을 향상시킵니다.

일관된 디자인을 위한 레이아웃 계획

일관된 디자인은 브랜드 이미지와 신뢰성을 높이는 데 중요한 역할을 합니다. Flutter의 다양한 위젯과 레이아웃 도구를 활용하여, 개발자는 일관된 디자인을 쉽게 구현할 수 있습니다. 이를 통해 사용자는 애플리케이션을 사용할 때마다 일관된 경험을 느낄 수 있습니다. 레이아웃 계획은 디자인의 일관성을 유지하고, 전체적인 애플리케이션의 품질을 향상시키는 데 중요한 역할을 합니다.

 

02. 기본 앱 코드 작성

1) Flutter 환경 설정

Flutter SDK 설치 및 설정

Flutter를 사용하기 위해서는 먼저 Flutter SDK를 설치해야 합니다. 다음은 Flutter SDK를 설치하고 설정하는 단계입니다:

  1. Flutter SDK 다운로드: Flutter 공식 웹사이트에서 Flutter SDK를 다운로드합니다.
  2. 환경 변수 설정: 다운로드한 Flutter SDK의 경로를 환경 변수에 추가합니다. 예를 들어, Windows에서는 '시스템 속성' > '고급 시스템 설정' > '환경 변수'에서 Path에 Flutter SDK의 bin 경로를 추가합니다.
  3. Flutter 설치 확인: 터미널 또는 명령 프롬프트에서 flutter doctor 명령어를 실행하여 Flutter 설치가 제대로 되었는지 확인합니다. 이 명령어는 필요한 모든 종속성이 설치되었는지 검사하고, 설치되지 않은 항목을 안내합니다.
flutter doctor

새로운 Flutter 프로젝트 생성

Flutter SDK가 제대로 설치되었다면, 이제 새로운 Flutter 프로젝트를 생성할 수 있습니다. 다음은 새로운 Flutter 프로젝트를 생성하는 단계입니다:

  1. 프로젝트 생성 명령어 실행: 터미널에서 다음 명령어를 실행하여 새로운 Flutter 프로젝트를 생성합니다. 프로젝트 이름은 소문자와 밑줄로 구성되어야 합니다.
flutter create my_flutter_app
  1. 프로젝트 디렉토리로 이동: 생성된 프로젝트 디렉토리로 이동합니다.
cd my_flutter_app
  1. 프로젝트 실행: 다음 명령어를 실행하여 프로젝트를 실행합니다. 연결된 디바이스(예: 에뮬레이터 또는 실제 기기)에서 애플리케이션이 실행됩니다.
flutter run

2) 기본 코드 구조

기본적인 Flutter 앱 코드 이해

새로운 Flutter 프로젝트를 생성하면 main.dart 파일이 생성됩니다. 이 파일은 Flutter 애플리케이션의 진입점입니다. 기본적인 Flutter 앱 코드는 다음과 같습니다:


import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final String title;

  MyHomePage({Key? key, required this.title}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Center(
        child: Text('Hello, Flutter!'),
      ),
    );
  }
}
        

이 코드에서는 Flutter 애플리케이션의 기본 구조를 정의합니다. MyApp 클래스는 애플리케이션의 루트 위젯이며, MyHomePage 클래스는 홈 화면의 레이아웃을 정의합니다.

main.dart 파일의 구조와 역할

  • import: 필요한 Flutter 패키지를 가져옵니다.
  • main() 함수: Flutter 애플리케이션의 진입점입니다. runApp 함수를 호출하여 루트 위젯을 실행합니다.
  • MyApp 클래스: 애플리케이션의 루트 위젯입니다. MaterialApp 위젯을 반환하여 애플리케이션의 제목, 테마, 홈 화면을 설정합니다.
  • MyHomePage 클래스: 홈 화면의 레이아웃을 정의하는 StatelessWidget입니다. AppBarCenter 위젯을 사용하여 간단한 텍스트를 화면에 표시합니다.

 

03. 제목 섹션 추가

1) TitleSection 위젯 생성

TitleSection 위젯의 역할과 구조

TitleSection 위젯은 애플리케이션의 주요 제목과 관련된 정보를 표시하는 섹션입니다. 이 섹션은 사용자에게 앱의 목적이나 주요 기능을 설명하는 데 유용합니다. 일반적으로 제목, 부제목, 그리고 관련된 아이콘이나 이미지를 포함합니다.


class TitleSection extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      padding: const EdgeInsets.all(32),
      child: Row(
        children: [
          Expanded(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Container(
                  padding: const EdgeInsets.only(bottom: 8),
                  child: Text(
                    'Oeschinen Lake Campground',
                    style: TextStyle(
                      fontWeight: FontWeight.bold,
                    ),
                  ),
                ),
                Text(
                  'Kandersteg, Switzerland',
                  style: TextStyle(
                    color: Colors.grey[500],
                  ),
                ),
              ],
            ),
          ),
          Icon(
            Icons.star,
            color: Colors.red[500],
          ),
          Text('41'),
        ],
      ),
    );
  }
}
        

이 위젯은 ContainerRow 위젯을 사용하여 제목과 아이콘을 나란히 배치합니다. Column 위젯을 사용하여 텍스트를 수직으로 정렬하고, Expanded 위젯을 사용하여 공간을 효율적으로 배분합니다.

텍스트 및 아이콘 배치 방법

  • 텍스트 배치: 텍스트는 Column 위젯을 사용하여 수직으로 배치됩니다. crossAxisAlignment 속성을 CrossAxisAlignment.start로 설정하여 텍스트를 왼쪽 정렬합니다. Container 위젯을 사용하여 텍스트 간의 간격을 조정할 수 있습니다.
  • 아이콘 배치: Icon 위젯을 사용하여 아이콘을 추가합니다. Row 위젯 내에서 텍스트와 나란히 배치되며, 색상과 크기를 설정할 수 있습니다.

2) 텍스트 및 아이콘 배치

Expanded 위젯을 사용한 텍스트 배치

Expanded 위젯은 Row, Column, Flex 위젯 내에서 사용되어 남은 공간을 차지하는 위젯을 의미합니다. 이를 통해 텍스트가 가능한 한 많은 공간을 차지하도록 할 수 있습니다.


Expanded(
  child: Column(
    crossAxisAlignment: CrossAxisAlignment.start,
    children: [
      Container(
        padding: const EdgeInsets.only(bottom: 8),
        child: Text(
          'Oeschinen Lake Campground',
          style: TextStyle(
            fontWeight: FontWeight.bold,
          ),
        ),
      ),
      Text(
        'Kandersteg, Switzerland',
        style: TextStyle(
          color: Colors.grey[500],
        ),
      ),
    ],
  ),
)
        

위 코드는 텍스트가 Column 내에서 수직으로 정렬되고, Expanded 위젯을 사용하여 가능한 한 많은 공간을 차지하도록 설정된 예입니다.

Padding을 사용한 간격 조정

Padding 위젯을 사용하여 위젯 간의 간격을 조정할 수 있습니다. 예를 들어, 텍스트와 아이콘 사이의 간격을 조정하려면 다음과 같이 설정할 수 있습니다:


Container(
  padding: const EdgeInsets.only(bottom: 8),
  child: Text(
    'Oeschinen Lake Campground',
    style: TextStyle(
      fontWeight: FontWeight.bold,
    ),
  ),
),
Text(
  'Kandersteg, Switzerland',
  style: TextStyle(
    color: Colors.grey[500],
  ),
),
        

위 코드는 텍스트 간의 간격을 Padding 위젯을 사용하여 설정한 예입니다.

 

04. 스크롤 가능한 뷰로 앱 변경

1) SingleChildScrollView 사용

스크롤 가능한 레이아웃 구현 방법

SingleChildScrollView 위젯은 단일 자식 위젯을 스크롤 가능한 뷰로 만드는 데 사용됩니다. 이를 통해 콘텐츠가 화면을 넘어갈 때 사용자가 스크롤하여 전체 내용을 볼 수 있습니다.


@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text('Flutter Layout Demo'),
    ),
    body: SingleChildScrollView(
      child: Column(
        children: [
          TitleSection(),
          // 다른 섹션들 추가
        ],
      ),
    ),
  );
}
        

SingleChildScrollView 위젯의 특징

SingleChildScrollView는 하나의 자식 위젯을 가지며, 이 자식 위젯이 스크롤될 수 있도록 합니다. 이 위젯은 일반적으로 수직 스크롤에 사용되며, ListView와 달리 다수의 자식 위젯을 처리하지 않습니다.

2) Column 위젯으로 구성

Column 위젯을 사용한 요소 배치

Column 위젯은 수직으로 자식 위젯을 배치하는 데 사용됩니다. SingleChildScrollView 내에서 Column 위젯을 사용하여 여러 섹션을 배치할 수 있습니다.


body: SingleChildScrollView(
  child: Column(
    children: [
      TitleSection(),
      ButtonSection(),
      TextSection(),
      ImageSection(),
    ],
  ),
),
        

자식 위젯들을 리스트로 구성

Column 위젯의 children 속성은 자식 위젯들의 리스트를 받습니다. 이를 통해 여러 위젯을 수직으로 나란히 배치할 수 있습니다. 예를 들어, 제목 섹션, 버튼 섹션, 텍스트 섹션, 이미지 섹션을 순서대로 배치할 수 있습니다.

 

05. 버튼 섹션 추가

1) ButtonSection 위젯 생성

ButtonSection 위젯의 역할과 구조

ButtonSection 위젯은 애플리케이션에서 사용자 상호작용을 위한 버튼을 배열하는 섹션입니다. 이 섹션은 다양한 기능을 수행하는 버튼을 그룹화하여 사용자가 쉽게 접근할 수 있도록 합니다.


class ButtonSection extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: [
          _buildButtonColumn(Icons.call, 'CALL'),
          _buildButtonColumn(Icons.near_me, 'ROUTE'),
          _buildButtonColumn(Icons.share, 'SHARE'),
        ],
      ),
    );
  }

  Column _buildButtonColumn(IconData icon, String label) {
    Color color = Theme.of(context).primaryColor;

    return Column(
      mainAxisSize: MainAxisSize.min,
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Icon(icon, color: color),
        Container(
          margin: const EdgeInsets.only(top: 8),
          child: Text(
            label,
            style: TextStyle(
              fontSize: 12,
              fontWeight: FontWeight.w400,
              color: color,
            ),
          ),
        ),
      ],
    );
  }
}
        

이 위젯은 Row 위젯을 사용하여 버튼을 수평으로 배열하고, 각 버튼은 아이콘과 텍스트로 구성된 Column 위젯으로 생성됩니다.

버튼 배열 방법

ButtonSection 위젯 내에서 버튼을 배열할 때, Row 위젯을 사용하여 버튼을 수평으로 배치합니다. 각 버튼은 _buildButtonColumn 메서드를 통해 생성됩니다. 이 메서드는 아이콘과 텍스트를 포함하는 Column 위젯을 반환합니다.

2) 버튼 배열 및 스타일링

Row 위젯을 사용한 버튼 배열

Row 위젯을 사용하여 버튼을 수평으로 배열합니다. Row 위젯의 mainAxisAlignment 속성을 사용하여 버튼 간의 간격을 조절할 수 있습니다.


Row(
  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  children: [
    _buildButtonColumn(Icons.call, 'CALL'),
    _buildButtonColumn(Icons.near_me, 'ROUTE'),
    _buildButtonColumn(Icons.share, 'SHARE'),
  ],
);
        

MainAxisAlignment.spaceEvenly 사용

mainAxisAlignment 속성을 MainAxisAlignment.spaceEvenly로 설정하여 버튼 간의 간격을 균등하게 배치할 수 있습니다. 이를 통해 버튼들이 균등한 간격으로 배열되어 일관된 디자인을 제공합니다.

mainAxisAlignment: MainAxisAlignment.spaceEvenly

 

06. 텍스트 섹션 추가

1) TextSection 위젯 생성

TextSection 위젯의 역할과 구조

TextSection 위젯은 애플리케이션에서 텍스트 내용을 표시하는 섹션입니다. 이 섹션은 긴 문장이나 단락을 포함하여 사용자에게 정보를 제공하는 데 사용됩니다.


class TextSection extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      padding: const EdgeInsets.all(32),
      child: Text(
        'Lake Oeschinen lies at the foot of the Blüemlisalp in the Bernese Alps. '
        'Situated 1,578 meters above sea level, it is one of the larger Alpine '
        'Lakes. A gondola ride from Kandersteg, followed by a half-hour walk through '
        'pastures and pine forest, leads you to the lake, which warms to 20 degrees '
        'Celsius in the summer. Activities enjoyed here include rowing, and riding the '
        'summer toboggan run.',
        softWrap: true,
      ),
    );
  }
}
        

이 위젯은 ContainerText 위젯을 사용하여 텍스트를 표시합니다. padding 속성을 사용하여 텍스트 주위에 간격을 추가합니다.

텍스트 내용 추가 방법

Text 위젯을 사용하여 텍스트 내용을 추가합니다. 긴 문장을 포함하여 사용자에게 정보를 제공할 수 있습니다.


Text(
  'Lake Oeschinen lies at the foot of the Blüemlisalp in the Bernese Alps. '
  'Situated 1,578 meters above sea level, it is one of the larger Alpine '
  'Lakes. A gondola ride from Kandersteg, followed by a half-hour walk through '
  'pastures and pine forest, leads you to the lake, which warms to 20 degrees '
  'Celsius in the summer. Activities enjoyed here include rowing, and riding the '
  'summer toboggan run.',
  softWrap: true,
)
        

2) 텍스트 내용 및 스타일링

Text 위젯의 스타일 설정

Text 위젯의 스타일을 설정하여 텍스트의 외관을 조정할 수 있습니다. TextStyle을 사용하여 글꼴 크기, 색상, 굵기 등을 설정할 수 있습니다.


Text(
  'Lake Oeschinen lies at the foot of the Blüemlisalp in the Bernese Alps.',
  style: TextStyle(
    fontSize: 16,
    fontWeight: FontWeight.bold,
    color: Colors.black,
  ),
)
        

softWrap 속성 사용

softWrap 속성을 true로 설정하여 텍스트가 자동으로 줄바꿈되도록 할 수 있습니다. 이를 통해 긴 문장을 화면에 맞게 자동으로 줄바꿈할 수 있습니다.

softWrap: true

 

07. 이미지 섹션 추가

1) ImageSection 위젯 생성

ImageSection 위젯의 역할과 구조

ImageSection 위젯은 애플리케이션에서 이미지를 표시하는 섹션입니다. 이 섹션은 시각적인 요소를 통해 사용자에게 정보를 전달하고, 앱의 디자인을 풍부하게 만듭니다.


class ImageSection extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Image.asset(
        'images/lake.jpg',
        width: 600,
        height: 240,
        fit: BoxFit.cover,
      ),
    );
  }
}
        

이 위젯은 ContainerImage.asset 위젯을 사용하여 이미지를 표시합니다. fit 속성을 사용하여 이미지가 컨테이너의 크기에 맞게 조정되도록 합니다.

이미지 파일 추가 및 설정

이미지를 프로젝트에 추가하려면, 이미지를 프로젝트의 특정 폴더(예: images 폴더)에 저장하고, pubspec.yaml 파일을 수정하여 이미지를 프로젝트에 포함시켜야 합니다.

2) 이미지 파일 추가 및 설정

pubspec.yaml 파일 수정

pubspec.yaml 파일을 열고, 프로젝트에 이미지를 포함시키기 위해 다음과 같이 수정합니다:


flutter:
  assets:
    - images/lake.jpg
        

위 설정은 images 폴더 내의 lake.jpg 파일을 프로젝트의 에셋으로 포함시킵니다. 이 파일이 앱에서 사용 가능하도록 설정하는 중요한 단계입니다.

Image.asset 위젯 사용

Image.asset 위젯을 사용하여 프로젝트에 포함된 이미지를 표시할 수 있습니다. ImageSection 위젯 내에서 Image.asset 위젯을 사용하여 이미지를 로드하고, 필요한 속성을 설정할 수 있습니다.


class ImageSection extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Image.asset(
        'images/lake.jpg',
        width: 600,
        height: 240,
        fit: BoxFit.cover,
      ),
    );
  }
}
        

Image.asset 위젯의 주요 속성은 다음과 같습니다:

  • width: 이미지의 너비를 설정합니다.
  • height: 이미지의 높이를 설정합니다.
  • fit: BoxFit을 사용하여 이미지가 컨테이너의 크기에 맞게 조정되도록 합니다. 예를 들어, BoxFit.cover를 사용하면 이미지가 컨테이너를 완전히 덮도록 조정됩니다.

위와 같은 방법으로 ImageSection 위젯을 추가하고, 이미지를 프로젝트에 포함시켜 애플리케이션의 시각적인 요소를 풍부하게 만들 수 있습니다. 이러한 시각적 요소는 사용자 경험을 향상시키고, 애플리케이션의 전체적인 디자인을 개선하는 데 중요한 역할을 합니다.


관련된 다른 글도 읽어보시길 추천합니다

 

2024.07.28 - [Study] - 29. Flutter에서 자주 사용하는 위젯 소개 및 활용법 | Flutter

 

29. Flutter에서 자주 사용하는 위젯 소개 및 활용법 | Flutter

Flutter Widget Catalog: 기본부터 고급까지 완벽 가이드 01. 기본 위젯1) 기본적으로 알아야 할 위젯Flutter에서 기본 위젯은 앱 개발에 필수적인 요소들로, 모든 Flutter 앱에서 사용됩니다. 이러한 위젯

guguuu.com

2024.07.25 - [Study] - 28. Flutter로 사용자 인터페이스 구축하기 | Flutter

 

28. Flutter로 사용자 인터페이스 구축하기 | Flutter

Flutter로 사용자 인터페이스 구축하기: 기본 가이드 01. 서론1) Flutter의 인기와 장점Flutter는 Google에서 개발한 오픈 소스 UI 소프트웨어 개발 키트(SDK)입니다. Flutter의 가장 큰 장점 중 하나는 한 번

guguuu.com

2024.07.24 - [Study] - 27. Windows에서 Flutter로 Android 앱 개발 시작하기: 단계별 가이드 | Flutter

 

27. Windows에서 Flutter로 Android 앱 개발 시작하기: 단계별 가이드 | Flutter

Windows에서 Flutter로 Android 앱 개발 시작하기: 단계별 가이드 01. 서론1) Flutter와 Windows 환경에서의 개발Flutter는 Google에서 개발한 오픈소스 UI 소프트웨어 개발 키트로, 단일 코드베이스를 통해 iOS, A

guguuu.com


읽어주셔서 감사합니다

공감은 힘이 됩니다

 

:)

반응형