Flutter의 추상 클래스는 직접 인스턴스화할 수 없지만 서브클래싱(상속받은 클래스에서 구체화)해야 하는 클래스이다.
추상 클래스는 다른 클래스가 따라야 할 청사진 역할을 한다.
여러 클래스에서 사용할 수 있는 공통 메서드 및 속성 집합을 제공하여 일관성을 보장하고 코드의 중복성을 줄인다.
추상 클래스는 상속받는 클래스의 종류를 특정한다.
ex)
extends를 사용해서 상속받는다.
상속은 단 하나만 받을 수 있다.
class Probe extends ProtossGroundUnit {}
플러터는 interface 예약어가 없으므로, class 또는 abstract class로 암시적인 인터페이스를 만들어서 사용한다.
인터페이스는 구현하는 클래스의 기능을 특정한다.
ex)
클래스 또는 추상 클래스는 인터페이스를 반드시 구현해야한다.
implements를 사용해서 구현한다.
인터페이스는 여러가지를 받을 수 있다.
class Human implements Eye, Mouth, Arm, Leg {}
플러터에서는 클래스는 단 하나의 클래스를 상속 받을 수 있지만, 부가적인 클래스의 속성을 믹스인(짬뽕)할 수 있다.
짬뽕하다 = 섞다
믹스인은 짬뽕되는 클래스의 부가적인 종류를 특정한다.
ex)
with를 이용해서 믹스인한다.
믹스인은 여러가지를 받을 수 있다.
class TeslaCar extends Car with AI, Robot {}
- YAML(YAML Ain't Markup Language)은 소프트웨어 애플리케이션의 구성 파일에 일반적으로 사용되는 사람이 읽을 수 있는 데이터 직렬화 언어.
- YAML 파일을 작성할 때 파일이 잘 구조화되고 쉽게 읽고 유지 관리할 수 있도록 몇 가지 규칙을 따르는 것이 중요.
규칙
pubspec.yaml은 Flutter 프로젝트에서 프로젝트 메타데이터, 종속성 및 기타 설정을 지정하는 데 사용되는 구성 파일이다. 사람이 읽을 수 있는 데이터 직렬화 언어인 YAML 형식으로 작성되었다.
내용
dependencies 및 dev_dependencies 섹션은 프로젝트가 의존하는 외부 패키지 또는 라이브러리를 나열하므로 특히 중요하다. 이러한 종속성은 프로젝트의 pubspec.lock 파일에 설치하는 Flutter의 패키지 관리자인 pub에서 관리한다.
flutter 섹션에는 앱의 진입점, 자산 및 글꼴과 같은 Flutter 프레임워크에 특정한 구성 옵션이 포함되어 있다. 이 섹션에는 앱의 iOS 및 Android 버전 번호와 같은 플랫폼별 구성 옵션도 포함될 수 있다.
파일은 종속성이 설치되거나 업데이트될 때 Flutter의 패키지 관리자인 pub에 의해 생성된다. 설치된 각 패키지의 버전이 특정 버전 번호로 잠겨 있는지 확인하는 생성된 파일이다.
이는 여러 개발자가 동일한 프로젝트에서 작업하는 경우 모든 사람이 동일한 버전의 패키지를 사용하고 있음을 확인하기 때문에 중요하다.
pubspec.lock 파일은 flutter pub get 명령을 사용하여 pubspec.yaml 파일에 종속 항목이 추가되거나 업데이트될 때 자동으로 업데이트된다. 버전 충돌 및 기타 문제가 발생할 수 있으므로 일반적으로 pubspec.lock 파일을 수동으로 수정하지 않는 것이 좋다.
- runApp 함수는 Flutter 애플리케이션을 실행하는 데 사용되는 최상위 함수.
- runApp 함수는 애플리케이션의 루트 위젯인 단일 매개변수를 사용.
- 이 루트 위젯은 앱의 최상위 위젯이며 앱의 다른 위젯을 만들고 관리하는 역할.
- Flutter에서 위젯은 사용자 인터페이스의 기본 구성 요소
- 버튼, 텍스트 필드, 이미지 등과 같은 앱의 시각적 및 대화형 요소를 정의하는 데 사용
- 위젯은 웹 개발에서 HTML 요소와 동일하다고 생각할 수 있다
- StatelessWidget은 일단 생성되면 모양이나 동작을 변경할 수 없는 위젯 유형
사용자 인터페이스의 기본 빌딩 블록이며 시간이 지남에 따라 상태나 변경 사항에 의존하지 않는 재사용 가능한 구성 요소를 만드는 데 사용된다.
항상 같은 텍스트나 이미지를 표시하는 레이블이나 아이콘은 StatelessWidget으로 구현된다.
StatelessWidget은 변경할 수 없기 때문에 StatefulWidget보다 빠르게 생성하고 삭제할 수 있다. 따라서 동적 업데이트나 상태 관리가 필요하지 않은 자주 사용되는 UI 요소를 만드는 데 적합하다.
StatefulWidget보다 더 빠른 성능과 더 효율적인 리소스 사용.
함수형으로 만들 수도 있다.
- StatefulWidget은 사용자 상호작용 또는 기타 이벤트에 대한 응답으로 시간이 지남에 따라 모양이나 동작을 변경할 수 있는 위젯 유형.
변경할 수 없고 일단 생성되면 모양이나 동작을 변경할 수 없는 StatelessWidget과 달리 StatefulWidget은 상태 변경에 따라 동적으로 업데이트될 수 있다.
StatefulWidget은 StatefulWidget 자체와 해당 State 클래스라는 두 가지 기본 클래스로 구성된다.
StatefulWidget은 State 객체 생성을 담당하는 반면, State 클래스는 위젯의 상태를 유지하고 필요에 따라 모양이나 동작을 업데이트하는 일을 담당한다.
프로그램 작동 시 new 되는 객체가 아니라 정적인 객체일 경우 컴파일 타임에 세팅되면 앱 성능이 좋아지므로 플러터에서 권장.
const 권장이 붙은 위젯에는 const를 사용하고 동적으로 바뀌는 경우에만 const를 삭제하면 된다.
안드로이드 디자인을 기반으로 앱 작성
(디자인만 적용이라 안드, IOS 둘 다 빌드 가능)
애플 디자인을 기반으로 앱 작성
(디자인만 적용이라 안드, IOS 둘 다 빌드 가능)
- MaterialApp은 Flutter 앱의 최상위 위젯
- 앱이 시작될 때 생성되는 첫 번째 위젯.
앱을 구축하는 데 필수적인 몇 가지 중요한 기능을 제공
앱 메타데이터
네이비게이션
국제화 (앱의 언어)
기타
예시
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
home: Scaffold(
appBar: AppBar(
title: Text('My App'),
),
body: Center(
child: Text('Hello, World!'),
),
),
);
}
}
- Scaffold는 머티리얼 디자인 앱의 기본 시각적 구조를 제공하는 Flutter의 위젯
- 앱 사용자 인터페이스의 시각적 요소를 구성하는 데 사용되는 컨테이너 위젯
- Scaffold 위젯은 AppBar, BottomNavigationBar, Drawer 및 FloatingActionButton과 같은 다른 위젯이 하위 항목으로 추가되어 앱 사용자 인터페이스의 기본 빌딩 블록으로 자주 사용.
Scaffold 위젯의 주요 역할은 앱의 기본 레이아웃 구조를 제공
앱 바
body
플로팅 작업 버튼
Drawer
기타
예시
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
home: Scaffold(
appBar: AppBar(
title: Text('My App'),
),
body: SafeArea(
child: Center(
child: Text('Hello, World!'),
),
),
),
);
}
}
Flutter의 AppBar 위젯은 표준 머티리얼 디자인 앱 바를 만드는 데 사용한다. 일반적으로 화면 상단에 나타나며 앱의 제목, 탐색 아이콘 및 작업을 포함한다.
예시
AppBar(
title: Text('My App'),
)
- SafeArea는 장치의 상태 표시줄, 노치 또는 기타 시스템 수준 사용자 인터페이스 요소에 의해 차단되지 않는 안전한 영역 내에 앱의 콘텐츠가 표시되도록 패딩을 제공하는 Flutter의 위젯.
SafeArea 위젯은 일반적으로 스캐폴드 또는 컨테이너 위젯과 같은 앱의 기본 콘텐츠에 대한 상위 위젯으로 사용된다.
SafeArea 위젯을 사용하면 그 안에 배치된 모든 하위 위젯이 자동으로 안전 영역 내에 표시되며 앱의 콘텐츠가 항상 표시되고 쉽게 상호 작용할 수 있도록 패딩 또는 기타 레이아웃 조정이 자동으로 수행된다.
자식
패딩
최소 패딩
행동
예시
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
home: Scaffold(
appBar: AppBar(
title: Text('My App'),
),
body: SafeArea(
child: Center(
child: Text('Hello, World!'),
),
),
),
);
}
}
Flutter에서 '컨테이너'는 사용자 정의되고 유연하며 재사용 가능한 레이아웃 구조를 만들 수 있는 강력한 위젯. 컨테이너 위젯은 박스 모양을 사용자 정의하여 디자인하는 기능을 제공.
예시
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
home: Scaffold(
appBar: AppBar(
title: Text('My App'),
),
body: Container(
alignment: Alignment.center,
padding: EdgeInsets.all(16.0),
color: Colors.blue,
width: 200.0,
height: 200.0,
child: Text(
'Hello, World!',
style: TextStyle(
fontSize: 24.0,
color: Colors.white,
),
),
),
),
);
}
}
Flutter에서 SizedBox는 특정 크기의 상자를 만드는 위젯.
위젯 주변에 여백을 추가하고 싶을 때나 특정 크기의 빈 박스를 만들고 싶을 때 유용.
자식
레이아웃
예시
SizedBox(
width: 200.0,
height: 100.0,
child: Container(
color: Colors.blue,
child: Text(
'Hello, World!',
style: TextStyle(color: Colors.white),
),
),
),
Container와의 비교
Flutter에서 Center 위젯은 부모 위젯 내에서 자식 위젯을 중앙에 배치하는 데 사용된다. Center 위젯은 하나의 자식 위젯을 가져와 부모 위젯의 중앙에 수평 및 수직으로 배치한다.
Scaffold(
body: Container(
color: Colors.amber,
child: Center(
heightFactor: 3,
widthFactor: 3,
child: Container(width: 50, height: 50, color: Colors.blue),
),
),
));
- 위젯들을 상하로 배치할 수 있다.
- 위젯들을 좌우로 배치할 수 있다.
- 위젯들을 겹쳐서 배치할 수 있다.
Flutter에서 mainAxisAlignment 및 crossAxisAlignment는 Column 위젯의 자식이 각각 기본 축과 교차 축을 따라 배치되는 방식을 제어하는 데 사용되는 두 가지 속성이다.
Column 위젯의 경우
기본 축은 세로이며 위에서 아래로 실행되고
교차 축은 가로로 왼쪽에서 오른쪽으로 실행된다.
즉, Column 위젯의 mainAxis는 세로, crossAxis는 가로이다.
Row 위젯의 경우
기본 축은 가로이며 왼쪽에서 오른쪽으로 실행되고
교차 축은 수직이며 위에서 아래로 실행됩니다.
즉, Row 위젯의 mainAxis는 가로, crossAxis는 세로이다.
이 예에서 mainAxisAlignment는 MainAxisAlignment.center로 설정되어 있으므로 하위 항목은 Column에서 수직으로 중앙에 배치된다.
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Child 1'),
Text('Child 2'),
Text('Child 3'),
],
)
이 예에서 crossAxisAlignment는 CrossAxisAlignment.start로 설정되어 있으므로 하위 항목은 Column의 수평으로 왼쪽에 배치된다.
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Text('Child 1'),
Text('Child 2'),
Text('Child 3'),
],
)
자식
레이아웃
- 패딩 위젯은 다른 위젯 내부의 콘텐츠에 패딩을 추가하는 데 사용.
패딩 위젯은 자식 위젯을 인수로 사용하며 자식 위젯의 각 가장자리에 패딩을 얼마나 추가해야 하는지 지정할 수 있다.
패딩은 고정된 픽셀 수 또는 위젯 크기의 백분율로 지정할 수 있다.
Padding 위젯의 사용 사례
- 위젯 사이의 간격 만들기: 패딩을 사용하여 행 또는 열의 위젯 사이에 간격을 만들 수 있다.
- 텍스트 주위에 공백 추가
- 안전한 영역 확보: 패딩을 사용하여 콘텐츠가 계속 표시되고 상태 표시줄, 탐색 표시줄 또는 장치 노치와 같은 시스템 UI 요소에 의해 가려지지 않도록 할 수 있다.
자식
패딩
EdgeInsets
예시
Padding(
padding: EdgeInsets.all(16.0),
child: Text(
'Hello, World!',
style: TextStyle(fontSize: 24.0),
),
),
- Text 위젯은 앱의 사용자 인터페이스에 텍스트를 표시하는 데 사용
텍스트 위젯은 글꼴 크기, 글꼴 두께, 글꼴 색상 및 정렬 변경과 같은 텍스트 스타일 지정 및 서식 지정을 위한 다양한 옵션을 제공.
텍스트 위젯의 주요 기능
내용
글자 스타일
글자 레이아웃
글자 접근성
예시
Text(
'Hello, World!',
style: TextStyle(fontSize: 24.0),
),
Flutter에서 Icon 위젯은 앱의 사용자 인터페이스에 아이콘을 표시하는 데 사용. 'Icon' 위젯은 머티리얼 디자인 아이콘, Cupertino 아이콘, FontAwesome 아이콘, 사용자 정의 아이콘 등 다양한 내장 아이콘을 지원한다.
예시
Icon(
Icons.favorite,
size: 48.0,
color: Colors.red,
),
- Spacer 위젯은 빈 공간이나 다른 위젯 사이의 간격을 만드는 데 사용
Spacer 위젯은 다양한 화면 크기나 방향에 맞게 조정되는 유연한 레이아웃을 만드는 데 특히 유용하다.
Spacer 위젯의 주요 기능
플렉스
예시
Row(
children: [
Expanded(
child: Container(
color: Colors.blue,
height: 100.0,
),
),
Spacer(),
Expanded(
child: Container(
color: Colors.red,
height: 100.0,
),
),
],
),
- Expanded 위젯은 다양한 화면 크기나 방향에 맞게 조정되는 유연한 레이아웃을 만드는 데 사용
- 컨테이너 내의 다양한 위젯에 할당되는 공간을 제어하기 위한 강력한 도구이며 앱의 사용자 인터페이스가 다양한 기기에서 잘 보이도록 하는 데 도움이 될 수 있다.
Expanded 위젯은 일반적으로 행 또는 열 위젯 내에서 사용되며 각각 가로 또는 세로 위젯 레이아웃을 허용한다.
Expanded 위젯의 몇 가지 주요 기능
플렉스
예시
Row(
children: [
Expanded(
child: Container(
color: Colors.blue,
height: 100.0,
),
),
Spacer(),
Expanded(
child: Container(
color: Colors.red,
height: 100.0,
),
),
],
),
Flutter의 Flexible 위젯은 Row, Column 또는 Flex 위젯의 하위 위젯이 주축을 따라 가능한 한 많은 공간을 차지하도록 만드는 데 사용된다.
Flexible(
key: Key('myFlexible'),
flex: 2,
fit: FlexFit.loose,
child: Container(
width: 50,
height: 50,
color: Colors.blue,
child: Text('Flexible child'),
),
)
Flutter의 ListView 위젯은 스크롤 가능한 항목 목록을 표시하는 데 사용된다. 한 번에 화면에 맞지 않는 많은 수의 항목을 표시하는 데 사용할 수 있다. ListView 위젯은 세로 및 가로 스크롤을 모두 지원하며 앱의 요구 사항에 맞게 사용자 지정할 수 있다.
'ListView' 위젯은 빌더 함수, 위젯 목록 또는 'SliverChildListDelegate'를 비롯한 다양한 방법을 사용하여 항목으로 채워질 수 있다.
빌더 기능은 일반적으로 데이터베이스 또는 웹 서비스와 같은 일부 데이터 소스를 기반으로 목록 항목을 동적으로 생성해야 하는 경우에 사용된다.
ListView 위젯은 바운싱 또는 스냅과 같은 다양한 스크롤 동작도 지원합니다. scrollDirection, itemExtent, padding, physics 등을 포함한 다양한 속성으로 사용자 지정할 수 있다.
또한 ListView 위젯을 RefreshIndicator 또는 ScrollController와 같은 다른 위젯과 함께 사용하여 앱에 추가 기능과 상호 작용을 제공할 수 있다.
예시
class MyApp extends StatelessWidget {
final List<String> items = List.generate(100, (index) => "Item $index");
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
home: Scaffold(
appBar: AppBar(
title: Text('My App'),
),
body: ListView.builder(
itemCount: items.length,
itemBuilder: (BuildContext context, int index) {
return ListTile(
title: Text(items[index]),
);
},
),
),
);
}
}
- 이미지 위젯은 앱의 사용자 인터페이스에 이미지를 표시하는 데 사용
Flutter에서 이미지는 이미지를 표시하는 위젯. 이미지의 모양과 동작의 다양한 측면을 구성할 수 있는 여러 생성자 매개 변수가 있다.
이미지 위젯은 이미지 크기, 종횡비, 정렬 등을 제어하는 등 이미지를 로드하고 표시하기 위한 다양한 옵션을 제공.
이미지 위젯의 주요 기능
이미지 출처
이미지 표시
이미지 로딩 및 오류 동작
예시
Image.network(
'https://picsum.photos/250?image=9',
width: 200.0,
height: 200.0,
),
하위 위젯에 특정 종횡비를 적용하는 위젯.
콘텐츠나 레이아웃 제약 조건에 관계없이 자식 위젯이 특정 너비 대 높이 비율을 유지하도록 하려는 경우에 유용.
자식
종횡비
레이아웃
예시
AspectRatio(
aspectRatio: 1.5,
child: Container(
color: Colors.blue,
),
),
둥근 사각형을 사용하여 하위 위젯을 자르는 위젯.
이미지, 컨테이너 또는 기타 위젯에 둥근 모서리를 적용하려는 경우에 유용.
자식
테두리
레이아웃
clipBehavior : 클리핑 동작을 지정.기본값은 'Clip.antiAlias'이며 앤티 앨리어싱으로 부드러운 가장자리를 제공. 다른 가능한 값은 앤티앨리어싱 없이 하드 에지를 제공하는 Clip.hardEdge와 하위 위젯을 전혀 자르지 않는 Clip.none이다.
예시
ClipRRect(
borderRadius: BorderRadius.circular(20.0),
child: Image.network(
'https://picsum.photos/250?image=9',
width: 200.0,
height: 200.0,
),
),
Flutter의 'InkWell' 위젯은 사용자가 버튼을 누르거나 링크를 클릭하는 등 위젯과 상호 작용할 때 시각적 피드백을 제공하는 데 사용.
단순한 'GestureDetector'보다 더 시각적으로 매력적인 방식으로 사용자 입력에 응답하는 클릭 가능한 요소를 만드는 데 사용.
사용자가 'InkWell' 위젯을 탭하면 위젯 중앙에서 가장자리까지 확장되는 물결 효과가 표시되어 사용자가 탭한 위치를 명확하게 표시한다.
'InkWell' 위젯은 '텍스트', '이미지' 또는 '아이콘'과 같은 다양한 기타 위젯과 함께 사용하여 사용자 입력에 응답하는 클릭 가능한 요소를 생성할 수 있다.
key: 위젯에 대한 고유 식별자를 제공하는 Key 객체.
onTap: InkWell을 탭하면 호출되는 콜백 함수.
onDoubleTap: InkWell을 두 번 탭하면 호출되는 콜백 함수.
onLongPress: InkWell을 길게 눌렀을 때 호출되는 콜백 함수.
onHighlightChanged: InkWell의 하이라이트 상태가 변경될 때 호출되는 콜백 함수.
child: InkWell이 래핑하고 시각적 피드백을 제공해야 하는 하위 위젯.
splashColor: InkWell을 누를 때 나타나는 잉크 얼룩의 색상.
highlightColor: InkWell을 누를 때 나타나는 잉크 하이라이트의 색상.
hoverColor: InkWell을 마우스로 가리키면 나타나는 잉크 얼룩의 색상.
focusColor: InkWell에 초점이 맞춰졌을 때 나타나는 잉크 얼룩의 색상.
radius: InkWell을 누를 때 나타나는 잉크 얼룩의 반경.
예시
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
home: Scaffold(
appBar: AppBar(
title: Text('My App'),
),
body: Center(
child: InkWell(
onTap: () {
print('Button tapped!');
},
child: Container(
padding: EdgeInsets.all(12.0),
decoration: BoxDecoration(
color: Colors.blue,
borderRadius: BorderRadius.circular(8.0),
),
child: Text(
'Tap Me!',
style: TextStyle(
color: Colors.white,
fontSize: 16.0,
),
),
),
),
),
),
);
}
}
Flutter의 'TextButton' 위젯은 텍스트를 표시하고 사용자 탭에 응답하는 버튼입니다. 일반적으로 ElevatedButton 또는 OutlinedButton 위젯에 대한 더 간단하고 미묘한 대안으로 사용된다.
TextButton(
onPressed: () {
print('Button pressed');
},
onLongPress: () {
print('Button long pressed');
},
style: TextButton.styleFrom(
primary: Colors.white,
backgroundColor: Colors.blue,
padding: EdgeInsets.symmetric(horizontal: 32, vertical: 16),
),
child: Text(
'Click me',
style: TextStyle(fontSize: 20),
),
);
Flutter의 'TabBar' 위젯은 탭의 가로 행을 표시하는 데 사용되며, 각 탭은 앱 내의 다른 보기 또는 페이지를 나타낸다. 이를 통해 사용자는 메뉴를 탐색하거나 추가 작업을 수행하지 않고도 콘텐츠의 다른 섹션 간에 빠르게 전환할 수 있다.
'TabBar' 위젯은 사용자 정의가 가능하며 다양한 스타일 및 테마와 함께 사용할 수 있다. 'TabBarView'와 같은 다른 위젯과 함께 사용하여 현재 선택된 탭에 따라 다른 콘텐츠를 표시하는 완전한 기능의 탭 인터페이스를 만들 수 있다.
class MyApp extends StatefulWidget {
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> with SingleTickerProviderStateMixin {
TabController _tabController;
void initState() {
super.initState();
_tabController = TabController(length: 3, vsync: this);
}
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
home: Scaffold(
appBar: AppBar(
title: Text('My App'),
bottom: TabBar(
controller: _tabController,
tabs: [
Tab(
text: 'Tab 1',
),
Tab(
text: 'Tab 2',
),
Tab(
text: 'Tab 3',
),
],
),
),
body: TabBarView(
controller: _tabController,
children: [
Center(
child: Text('This is the content of Tab 1'),
),
Center(
child: Text('This is the content of Tab 2'),
),
Center(
child: Text('This is the content of Tab 3'),
),
],
),
),
);
}
void dispose() {
_tabController.dispose();
super.dispose();
}
}
Flutter의 GridView 위젯은 테이블이나 스프레드시트와 유사하게 항목의 스크롤 가능한 그리드를 만드는 데 사용된다. 탐색하고 이해하기 쉬운 방식으로 대규모 데이터 집합을 표시할 수 있다.
예시
Sure! Here's an example code for using the GridView widget in Flutter:
less
Copy code
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
final List<String> items = List.generate(20, (index) => 'Item ${index + 1}');
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
home: Scaffold(
appBar: AppBar(
title: Text('My App'),
),
body: GridView.builder(
itemCount: items.length,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 8.0,
crossAxisSpacing: 8.0,
childAspectRatio: 1.0,
),
itemBuilder: (context, index) {
return Container(
color: Colors.blueGrey,
child: Center(
child: Text(
items[index],
style: TextStyle(
color: Colors.white,
fontSize: 24.0,
),
),
),
);
},
),
),
);
}
}
Flutter의 CircleAvatar 위젯은 사용자 인터페이스에 원형 이미지 또는 사용자 아바타를 표시하는 데 사용된다. 앱에서 프로필 사진, 사용자 아이콘 및 기타 원형 이미지를 표시하는 쉽고 편리한 방법을 제공한다.
CircleAvatar 위젯은 사용자 정의가 가능하며 로컬 이미지, 네트워크 이미지 및 자산 이미지를 포함하여 다양한 이미지와 함께 사용할 수 있다. 앱의 디자인 및 기능과 일치하도록 아바타의 크기, 테두리, 배경색 및 기타 속성을 사용자 지정할 수 있다.
CircleAvatar 위젯은 Text와 같은 다른 위젯과 함께 사용하여 아바타로 표시되는 사용자 또는 객체에 대한 추가 정보를 표시할 수도 있다.
예시
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
home: Scaffold(
appBar: AppBar(
title: Text('My App'),
),
body: Center(
child: CircleAvatar(
backgroundImage: AssetImage('assets/images/avatar.png'),
radius: 75.0,
child: Text(
'John',
style: TextStyle(
color: Colors.white,
fontSize: 24.0,
fontWeight: FontWeight.bold,
),
),
),
),
),
);
}
}
Flutter의 'TextFormField' 위젯은 사용자가 텍스트를 입력하고 편집할 수 있는 텍스트 입력 필드를 만드는 데 사용된다.
'TextFormField' 위젯은 사용자가 이름, 이메일 주소, 비밀번호 또는 기타 유형의 정보를 입력할 수 있도록 하는 등 다양한 용도로 사용할 수 있다.
TextFormField 위젯을 사용하면 개발자가 키보드 유형, 텍스트 입력 유효성 검사, 입력 장식 등과 같은 텍스트 입력 필드의 여러 측면을 사용자 지정할 수 있다. 또한 'Form' 및 'FlatButton'과 같은 다른 위젯과 함께 사용하여 완전한 기능을 갖춘 양식 또는 검색 표시줄을 만들 수 있다.
예시
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
final _formKey = GlobalKey<FormState>();
final _emailController = TextEditingController();
final _passwordController = TextEditingController();
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('TextFormField Example'),
),
body: Padding(
padding: EdgeInsets.all(16.0),
child: Form(
key: _formKey,
child: Column(
children: [
TextFormField(
controller: _emailController,
decoration: InputDecoration(
labelText: 'Email',
),
validator: (value) {
if (value.isEmpty) {
return 'Please enter your email';
}
return null;
},
),
TextFormField(
controller: _passwordController,
obscureText: true,
decoration: InputDecoration(
labelText: 'Password',
),
validator: (value) {
if (value.isEmpty) {
return 'Please enter your password';
}
return null;
},
),
SizedBox(height: 16.0),
RaisedButton(
onPressed: () {
if (_formKey.currentState.validate()) {
print('Form is valid!');
print('Email: ${_emailController.text}');
print('Password: ${_passwordController.text}');
}
},
child: Text('Submit'),
),
],
),
),
),
),
);
}
}
Flutter의 Positioned 위젯은 Stack 위젯에서 부모를 기준으로 자식 위젯을 배치하는 데 사용된다. 이를 통해 개발자는 절대 좌표 또는 상대 좌표를 사용하여 부모 위젯 내 자식 위젯의 정확한 위치를 지정할 수 있다.
Positioned 위젯은 일반적으로 화면의 특정 위치에 배치해야 하는 위젯 또는 위젯이 겹치는 복잡한 레이아웃을 만드는 데 사용된다. 예를 들어 다른 위젯 위에 배치되는 사용자 정의 버튼, 배지 또는 아이콘을 만드는 데 사용할 수 있다.
Stack에서 사용되는 경우 Positioned 위젯은 left 및 top의 두 가지 필수 속성을 사용한다.. 이러한 속성은 자식 위젯의 왼쪽 및 위쪽 가장자리와 부모 위젯의 왼쪽 및 위쪽 가장자리 사이의 거리를 각각 지정한다. right 및 bottom 속성을 사용하여 자식 위젯의 오른쪽 및 아래쪽 가장자리와 부모 위젯의 오른쪽 및 아래쪽 가장자리 사이의 거리를 각각 지정할 수도 있다.
예시
Stack(
children: [
Container(
width: 200,
height: 200,
color: Colors.blue,
),
Positioned(
left: 50,
top: 50,
child: Container(
width: 100,
height: 100,
color: Colors.red,
),
),
],
)
Flutter의 'Align' 위젯은 부모 위젯 내의 지정된 축 또는 점을 따라 자식 위젯을 정렬하여 부모 위젯 내에 자식 위젯을 배치하는 데 사용된다. 이를 통해 개발자는 레이아웃 내에서 자식 위젯의 위치와 정렬을 정확하게 제어할 수 있다.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: Container(
color: Colors.blue,
height: 200,
width: 200,
child: Align(
alignment: Alignment.bottomRight,
child: Container(
color: Colors.white,
height: 50,
width: 50,
),
),
),
),
),
);
}
}
Flutter에서 Navigator 위젯은 앱의 탐색 스택을 관리하는 데 사용된다. 내비게이션 스택은 화면의 계층 구조를 나타내며, 여기서 맨 위 화면이 사용자에게 표시됩니다.
'Navigator' 위젯은 내비게이션 스택에 새 화면을 푸시하고, 스택에서 화면을 팝하고, 스택에서 화면을 교체하는 방법을 제공한다. 이러한 메서드를 사용하면 사용자가 버튼을 누를 때 스택에 새 화면을 푸시하거나 사용자가 뒤로 버튼을 누를 때 스택에서 현재 화면을 팝하는 것과 같은 일반적인 탐색 패턴을 구현할 수 있다.
Navigator 위젯을 사용하려면 먼저 앱의 개별 화면을 별도의 위젯으로 정의해야 한다. 이러한 화면 위젯은 일반적으로 'Scaffold' 위젯을 루트로 가져야 앱 바, 서랍 또는 기타 공통 UI 요소를 표시할 수 있다.
화면을 정의하고 나면 Navigator 위젯을 사용하여 화면 사이를 탐색할 수 있습니다. Navigator.push() 메서드를 호출하여 탐색 스택에 새 화면을 푸시하거나 Navigator.pop() 메서드를 호출하여 스택에서 현재 화면을 팝하면 됩니다.
Flutter의 Navigator 위젯에는 생성자 매개변수가 없다.
예시
class MyHomePage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('My App'),
),
body: Center(
child: RaisedButton(
child: Text('Go to next screen'),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => NextScreen(),
),
);
},
),
),
);
}
}
class NextScreen extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Next Screen'),
),
body: Center(
child: Text('This is the next screen'),
),
);
}
}