본문 바로가기

위젯 기초: Flutter의 위젯 시스템 이해하기

에온르 2024. 5. 24.
반응형

Flutter에서 위젯은 애플리케이션의 모든 것을 구성하는 기본 단위입니다. 화면에 표시되는 모든 요소는 위젯으로 구성되며, 이러한 위젯을 조합하여 복잡한 UI를 만들 수 있습니다. 이 강의에서는 Flutter의 위젯 시스템에 대해 이해하고, 기본 위젯들을 사용하여 간단한 UI를 구성하는 방법을 학습합니다.

source : medium@muhammadumarch321

위젯의 종류

Flutter 위젯은 크게 두 가지로 나눌 수 있습니다:

  1. StatelessWidget: 상태가 없는 위젯으로, 생성 후 변경되지 않습니다.
  2. StatefulWidget: 상태를 가질 수 있는 위젯으로, 상태가 변경될 때마다 다시 그려집니다.

StatelessWidget

StatelessWidget은 변하지 않는 UI 요소를 정의할 때 사용합니다. 다음은 간단한 StatelessWidget의 예입니다:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('StatelessWidget 예제'),
        ),
        body: Center(
          child: Text('Hello, Flutter!'),
        ),
      ),
    );
  }
}

StatefulWidget

StatefulWidget은 변할 수 있는 상태를 가지며, 상태가 변경될 때마다 UI를 다시 렌더링합니다. 다음은 StatefulWidget의 예입니다:

import 'package:flutter/material.dart';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('StatefulWidget 예제'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Button pressed this many times:',
              ),
              Text(
                '$_counter',
                style: Theme.of(context).textTheme.headline4,
              ),
            ],
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: _incrementCounter,
          tooltip: 'Increment',
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}

주요 위젯 소개

Text

Text 위젯은 화면에 텍스트를 표시할 때 사용합니다. 다양한 스타일을 적용할 수 있습니다.

Text(
  'Hello, Flutter!',
  style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
)

Container

Container 위젯은 레이아웃을 구성하는 데 사용되며, 패딩, 마진, 배경색 등을 설정할 수 있습니다.

Container(
  padding: EdgeInsets.all(16.0),
  margin: EdgeInsets.all(8.0),
  color: Colors.blue,
  child: Text('Container 위젯'),
)

Row와 Column

Row와 Column 위젯은 수평 및 수직 방향으로 위젯을 배열할 때 사용합니다.

Column(
  mainAxisAlignment: MainAxisAlignment.center,
  children: <Widget>[
    Text('First item'),
    Text('Second item'),
    Text('Third item'),
  ],
)

Row(
  mainAxisAlignment: MainAxisAlignment.center,
  children: <Widget>[
    Text('First item'),
    Text('Second item'),
    Text('Third item'),
  ],
)

ListView

ListView 위젯은 스크롤 가능한 리스트를 만들 때 사용합니다.

ListView(
  children: <Widget>[
    ListTile(
      leading: Icon(Icons.map),
      title: Text('Map'),
    ),
    ListTile(
      leading: Icon(Icons.photo_album),
      title: Text('Album'),
    ),
    ListTile(
      leading: Icon(Icons.phone),
      title: Text('Phone'),
    ),
  ],
)

실습: 간단한 프로필 카드 만들기

이제 배운 위젯들을 사용하여 간단한 프로필 카드를 만들어보겠습니다.

import 'package:flutter/material.dart';

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

class ProfileApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('프로필 카드'),
        ),
        body: Center(
          child: ProfileCard(),
        ),
      ),
    );
  }
}

class ProfileCard extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Card(
      margin: EdgeInsets.all(16.0),
      child: Padding(
        padding: EdgeInsets.all(16.0),
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            CircleAvatar(
              radius: 50,
              backgroundImage: NetworkImage('https://via.placeholder.com/150'),
            ),
            SizedBox(height: 16.0),
            Text(
              'John Doe',
              style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
            ),
            Text(
              'Software Developer',
              style: TextStyle(color: Colors.grey[700]),
            ),
            SizedBox(height: 16.0),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: <Widget>[
                Icon(Icons.phone, color: Colors.blue),
                Icon(Icons.email, color: Colors.blue),
                Icon(Icons.location_on, color: Colors.blue),
              ],
            )
          ],
        ),
      ),
    );
  }
}

결론

이 강의를 통해 Flutter의 위젯 시스템과 주요 위젯들에 대해 학습했습니다. 위젯을 활용하여 간단한 UI를 구성하는 방법을 배웠으며, 실제로 프로필 카드를 만들어 보았습니다. 다음 강의에서는 Flutter의 레이아웃 시스템과 더 복잡한 UI를 구성하는 방법에 대해 알아보겠습니다. Flutter를 사용하여 멋진 UI를 만들어 보세요!

반응형

댓글