오랜만에 블로그를 씁니다...
앱 개발에 도전하고픈 의지가 생겨 제가 운영중인 동아리의 앱 파트 코어 멤버로 활동하고 있습니다.
앱 파트 멤버 중 학교 수업에서 코틀린을 사용중인 학생들이 많았으나, 크로스 플랫폼 프레임워크를 사용하는 것이 좋겠다고 판단했습니다.
그 이후의 고민은 Flutter와 React Native중 어떤 프레임워크로 세션을 진행할지에 대한 것이었고, 결국 Flutter에 다같이 처음으로(!) 도전하기로 했습니다.
오늘은 첫 세션 주제였던 main.dart 분석에 대한 포스팅을 해볼까 합니다.
추가적인 차이점은 다른 포스트에서 정리해보도록 하겠습니다.
import 'package:flutter/material.dart';
Scaffold(
appBar: AppBar(title: Text("Hello")),
body: Center(child: Text("Hi Flutter")),
)
// 여기서 보이는 Scaffold, appBar, Text 같은 것들이 다 Material Design에 들어있는 위젯들
// Material Design을 import 하지 않으면 이런 위젯들을 사용할 수 없음!
void main() {
// runApp: 루트 위젯을 화면에 붙여주는 역할
runApp(const MyApp());
}
프로그램의 진입접(entry point)
runApp: 전달된 위젯(위에서는 MyApp)을 루트로 하여 화면을 그릴 것임
플러터 앱은 위젯으로 이루어진 트리 구조

runApp은 위젯만 받을 수 있음. (Text 등도 가능은 하나 방향성이 없어 오류 발생 가능성 O)
const MyApp: runApp에 전달된 위젯(= 이 프로젝트의 루트 위젯)
왜 const를 붙였을까?
= 이 위젯은 변하지 않으니 rebuild할 때 새로 만들지 말고 재사용해! 하고 알려주는 표시
// MyApp = 우리가 만든 앱을 감싸고 있는 위젯 = 루트 위젯
class MyApp extends StatelessWidget {
const MyApp({super.key});
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
// 루트 위젯에서는 보통 MaterialApp을 리턴
// Material App =
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
),
home: const MyHomePage(title: '나의 첫 Flutter 페이지'), // 앱이 켜지면 가장 먼저 보여지는 부분
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
// _MyHomePageState에서 실제 로직 + 상태 관리
}
StatefulWidget을 상속받음 상태를 가질 수 있음
createState(): Stateful Widget은 상태를 관리할 객체(State)가 필요. 따라서 Stateful Widget을 만들 때는 반드시 createState을 구현해야 한다.
class _MyHomePageState extends State<MyHomePage>
int _counter = 0; // _를 붙이면 private
void _incrementCounter() {
setState(() {
_counter++;
});
}
void _resetCounter() {
setState(() {
_counter = 0;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
...
)
}
// 다소 수정된 코드
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.green,
title: Text(widget.title), // MyHomePage에서 넘어온 String
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text('버튼을 몇 번 눌렀을까용'),
Text(
_counter == 0
? '버튼을 눌러보세요!'
: _counter < 5
? '조금만 더 눌러보세요!'
: '버튼을 많이 누르셨군요!',
style: Theme.of(context).textTheme.headlineMedium,
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: _resetCounter,
child: const Text('카운터 초기화'),
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.favorite),
),
);
Scaffold
Flutter에서 화면의 기본 뼈대
AppBar, body, FloatingActionButton 같은 기본 영역 제공
AppBar(상단바), body, FloatingActionButton등의 UI 구성요소가 들어있음
이렇게 main.dart의 구성을 간단히 알아보았습니다.
다음 포스트에서는 UI의 렌더링 과정에 대해서 알아보겠습니다.
최근에 react 공부를 시작했는데 처음보는 자바스크립트 문법에 머리가 아득해지고 있습니다.
flutter는 또 새로운 문법으로 제 머리를 아득해지게 하네요.
새롭고 어려운거 도전하시면서 코어로까지 활동하시니 정말 멋지십니다!
개인적으로 애정하는 프레임워크가 Flutter인데 이렇게 다시 기초부터 차근차근 보니 또 새롭게 다가오는 것 같습니다. 또한 다른 크로스 플랫폼을 탐색할 때 생각났던 선택지가 KMM이었는데, React Native와 비교해보며 선택지의 폭을 늘리고 각 도구의 특징에 대해 다시 한번 생각해보는 기회가 되었습니다!