안드로이드나 iOS같은 플랫폼 자체에서 제공하는 개발 환경으로 개발
안드로이드
개발 도구 : 안드로이드 스튜디오
개발 언어 : 자바, 코틀린
iOS
개발 환경 : 맥OS
개발 도구 : Xcode
개발 언어 : 스위프트, 오브젝티브-C
웹 기술로 앱 화면을 만든 후 네이티브 기술로 감싸서 앱 형태로 포장
기존의 웹 기술을 활용하고 빠르게 앱으로 변환가능
네이티브 성능에 미치지 못하며, 별도의 UI를 만들기 때문에 네이티브 앱 느낌을 내지 못한다.
한 번 구현하여 안드로이드와 iOS 등 각 플랫폼용 앱을 만든다.
빌드할 때 네이티브 코드로 변환되기 때문에 결과적으로는 네이티브 방식으로 개발했을 때와 거의 같은 성능을 보장한다.
구글이 출시한 크로스 플랫폼 개발 프레임워크
Skia
라는 오픈 소스 그래픽 라이브러리에게 맡긴다. 그로 인해 대부분의 작업에서 GPU를 사용하여 UI가 60fps로 동작, 또한 네이티브 컴포넌트를 사용하지 않게 되어 안드로이드나 iOS에 관계없이 비슷한 화면을 구성할 수 있게 되었다.Skia
Skia는 다양한 하드웨어 및 소프트웨어 플랫폼에서 공통 API를 제공하는 오픈 소스 2D 그래픽 라이브러리입니다.
구글 크롬, Chrome OS, Android, Flutter, Firefox, Firefox OS 등 많은 다른 제품들의 그래픽 엔진 역할을 합니다.
안드로이드 에뮬레이터 : Pixel XL, 버전 (Nougat) 7.1.1
애뮬레이터 실행
Hot reload 테스트
Element Embedding
// 머티리얼 디자인 위젯
import 'package:flutter/material.dart';
// 앱 시작 부분
void main() {
runApp(const MyApp());
}
// 시작 클래스. 머티리얼 디자인 앱 생성
class MyApp extends StatelessWidget {
const MyApp({super.key});
Widget build(BuildContext context) {
return MaterialApp(
title: 'First Flutter',
theme: ThemeData(
primarySwatch: Colors.indigo,
),
home: const MyHomePage(title: 'Hello World'),
);
}
}
// 시작 클래스가 실제로 표시하는 클래스. 카운터 앱 화면
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
State<MyHomePage> createState() => _MyHomePageState();
}
// 위 MyHomePage 클래스의 상태를 나타내는 State 클래스
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0; // 화면에 표시할 상탯값인 카운터 숫자
// counter 변수를 1 증가시키고 화면을 다시 그리는 메서드
void _incrementCounter() {
// 화면을 다시 그리도록 하는 함수. StatefulWidget만 가능
setState(() {
_counter++;
});
}
// 화면에 UI를 그리는 메서드. 그려질 위젯을 반환
Widget build(BuildContext context) {
return Scaffold(
// 머티리얼 디자인 기본 뼈대 위젯
appBar: AppBar(
// 상단 앱바
title: Text(widget.title),
),
body: Center(
// 표시할 내용
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headlineMedium,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter, // 클릭시 _incrementCounter() 메서드 실행
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
Widget build(BuildContext context) {
return MaterialApp(
title: 'First Flutter',
theme: ThemeData(
primarySwatch: Colors.indigo,
),
home: const MyHomePage(title: 'Hello World'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
State<MyHomePage> createState() => _MyHomePageState();
}
createState()
initState()
didChangeDependencies()
build()
didUpdateWidget()
setState()
deactivate()
dispose()
// 위 MyHomePage 클래스의 상태를 나타내는 State 클래스
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0; // 화면에 표시할 상탯값인 카운터 숫자
// counter 변수를 1 증가시키고 화면을 다시 그리는 메서드
void _incrementCounter() {
// 화면을 다시 그리도록 하는 함수. StatefulWidget만 가능
setState(() {
_counter++;
});
}
// 화면에 UI를 그리는 메서드. 그려질 위젯을 반환
Widget build(BuildContext context) {
return Scaffold(
// 머티리얼 디자인 기본 뼈대 위젯
appBar: AppBar(
// 상단 앱바
title: Text(widget.title),
),
body: Center(
// 표시할 내용
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headlineMedium,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter, // 클릭시 _incrementCounter() 메서드 실행
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}
Navigator.push()
로 새로운 화면, Navigator.pop(context)
로 이전화면[This method overrides a method annotated as '@mustCallSuper' in 'State', but doesn't invoke the overridden method.][](https://fronquarry.tistory.com/20)
const
를 붙이라고하지?[use 'const' literals as arguments to constructors of '@immutable' classes]에 대하여
By making the list
const
the list and everything within the list will become compile-time constants. This can only be done if everything inside the list is able to beconst
. The benefit is that the list will only be created once at compile time rather than every time the surroundingbuild
method is called. 출처
불필요한 리소스 사용을 줄이기 위함이다!
skia에 문제가 있어 3.10부터 ios는 impeller로 바뀌었습니다. android는 preview 상태이나 금년안에 stable로 전환될듯하고요.
breaking change는 아니니 앱들에 별 변동은 없습니다