[flutter] 플러터 위젯 소개 - 1
211_introduction_to_widgets - 1
[출처] : Introduction to widgets
Flutter 위젯은 React에서 영감을 얻어 제작된 프레임워크 입니다. 핵심은 UI를 위젯에서 빌드(제작)하는 것 입니다. 위젯은 현재 설정과 상태에 따라 표현되며, 해당 위젯의 상태가 변경되면 위젯은 자동으로 재빌드 됩니다.
배울내용 요약
- flutter 는 state(상태) 변화에 따라 app이 자동으로 재빌드 됨
- Widget build(BuildContext context) 함수의 구현(implement)을 통해 위젯을 구현할 수 있습니다.
- MaterialApp 위젯에서 테마 및 다양한 기본 기능을 제공해주니 일단 쓰세요 :)
헬로 월드 (Hello World)
초간단 flutter 앱 : runApp을 통해 위젯을 기동 !
import 'package:flutter/material.dart';
void main() {
runApp(
Center(
child: Text(
'Hello, world!',
textDirection: TextDirection.ltr,
),
),
);
}
- runApp(Widget app) 함수를 통해 기본 위젯트리를 형성합니다. 위젯 트리는 Center - 자식 : Text 로 구성 됩니다.
- 앱기동 - 위젯트리 구성 읽기 - (Center ... Text) : 앱을 중앙으로 위치하며 내부에는 텍스트로 방향을 ltr(왼쪽에서 오른쪽)으로 지정하여 'Hello, World'를 작성
- 앱을 작성할 때 위젯이 상태를 관리하는지 여부에 따라 StatelessWidget 또는 StatefulWidget의 하위 클래스의 위젯을 작성하는 것이 일반적입니다.
- 위젯의 주요 임무는 빌드 기능을 구현하는 것입니다.
@override Widget build(BuildContext context)
기본적인 위젯 만들기 (Basic widgets)
Flutter에는 아래와 같이 유용한 기본 위젯을 제공합니다.
Text : 텍스트 위젯을 사용하면 응용 프로그램 내에서 스타일이 지정된 텍스트를 만들 수 있습니다.
Row, Collum :이 flex 위젯을 사용하면 가로 (행) 및 세로 (열) 방향 모두에서 유연한 레이아웃을 만들 수 있습니다. 디자인은 웹의 flexbox 레이아웃 모델을 기반으로합니다.
Stack : 스택 위젯을 사용하면 직선형 (수평 또는 수직)으로 배치하는 대신 위젯을 페인트 순서대로 서로 쌓을 수 있습니다. 그런 다음 Stack의 하위에있는 Positioned 위젯을 사용하여 스택의 위쪽, 오른쪽, 아래쪽 또는 왼쪽 가장자리를 기준으로 배치 할 수 있습니다. 스택은 웹의 절대 위치 지정 레이아웃 모델을 기반으로합니다.
Container : 컨테이너 위젯을 사용하여 사각형의 시각적 요소를 만들 수 있습니다. 컨테이너는 배경, 테두리 또는 그림자와 같은 BoxDecoration 으로 장식 될 수 있습니다. 컨테이너는 여백, 패딩 및 제약 조건을 크기에 적용 할 수 있습니다. 또한 컨테이너는 행렬을 사용하여 3 차원 공간에서 변형 될 수 있습니다.
import 'package:flutter/material.dart';
class MyAppBar extends StatelessWidget {
MyAppBar({this.title});
// 위젯의 서브클레스는 항상 final(불변)로 선언 되어야 된다.
final Widget title;
@override
Widget build(BuildContext context) {
return Container(
height: 56.0, // 픽셀 단위
padding: const EdgeInsets.symmetric(horizontal: 8.0),
decoration: BoxDecoration(color: Colors.blue[500]),
// 행(Row) 은 수평의 선형 레이아웃임
child: Row(
// <Widget> 목록 항목의 타입을 나타낸다.
children: <Widget>[
IconButton(
icon: Icon(Icons.menu),
tooltip: 'Navigation menu',
onPressed: null, // null 은 버튼을 비활성화 한다
),
// Expanded 는 자식공간에 여유 공간을 확보해 준다.
Expanded(
child: title,
),
IconButton(
icon: Icon(Icons.search),
tooltip: 'Search',
onPressed: null,
),
],
),
);
}
}
class MyScaffold extends StatelessWidget {
@override
Widget build(BuildContext context) {
// Material 은 UI를 표현하는 컨셉임
return Material(
// 열(Column)은 수직 선형 레이아웃임
child: Column(
children: <Widget>[
MyAppBar(
title: Text(
'Example title',
style: Theme.of(context).primaryTextTheme.title,
),
),
Expanded(
child: Center(
child: Text('Hello, world!'),
),
),
],
),
);
}
}
void main() {
runApp(MaterialApp(
title: 'My app', // OS 작업 전환기에서 사용됨
home: MyScaffold(),
));
}
pubspec.yaml
파일에uses-material-design
항목 값이 true로 설정되어 있는지 여부를 확인해야 된다. 이 설정이 되어 있어야 Material 아이콘을 사용할 수 있음
name: my_app
flutter:
uses-material-design: true
- MaterialApp : 테마 기능을 사용하기위해 해당 위젯을 상속받아 구현하는 것을 추천
- MyScaffold 위젯은 하위 항목을 세로 열로 구성합니다. 열의 맨 위에 MyAppBar의 인스턴스를 배치하고 응용 프로그램 막대에 제목으로 사용할 텍스트 위젯을 전달합니다. 위젯을 다른 위젯에 인수로 전달하는 것은 다양한 방법으로 재사용 할 수있는 일반 위젯을 만들 수있는 강력한 기술입니다. 마지막으로 MyScaffold는 Expanded를 사용하여 나머지 공간을 본문으로 채웁니다.
다음에 계속
원래는 예제 위주로 해보려 했는데 일단 제가 잘 몰라서 구글 docs 처음부터 따라가면서 기록을 남기려 합니다 ㅋㅋ
내용이 매우 길어요 ... 따라하다 지치면 안되니(제가 지쳐서) 일단 자르고 다음시간에 또 뵙겠습니다.
이전 관련 글
- [flutter] [cookbook] 위젯을 희미하게 감추기
- [flutter] 스터디 1일차 - hello world 찍기
- [flutter] #001. 설치하기 ( in Windows )
지치기 직전에 잘 끊으셨네요 ㅎㅎㅎ
요즘 유툽도 보면 15분 이내로 자르더라고여 지치니 ㅋ
지치지 않게 잘 끊는 것도 중요하네요.ㅎㅎ
전 이제 지쳤어요 땡벌~
이제 플러터 위젯이 나오기 시작했네요.
자바스크립트와 비슷하면서도 다른 다트.
전 플러터 구현하면서 자꾸 실수하고 헷갈립니다.ㅋ
겉으로 단순하게 보면 쉬운거 같은데 ... 실제 dart 패키지 구현부 등 들어가면 아... 그러죠 ㅋㅋ
아직도 뭐 하나둘 씩 배워가는 입장인지라 여튼 잼있네요 ㅎ
짱짱맨 호출에 응답하여 보팅하였습니다. 스팀잇을 시작하시는 친구들에게도 널리 알려주세요.
오옹~
슈퍼코더 너무 너무 멋지네요~
스승님으로 모시겠습니다~ ^^
많은 가르침을 주시오~ ㅎㅎ
Hi @wonsama!
Your post was upvoted by @steem-ua, new Steem dApp, using UserAuthority for algorithmic post curation!
Your UA account score is currently 3.697 which ranks you at #5148 across all Steem accounts.
Your rank has improved 24 places in the last three days (old rank 5172).
In our last Algorithmic Curation Round, consisting of 404 contributions, your post is ranked at #151.
Evaluation of your UA score:
Feel free to join our @steem-ua Discord server