Search
Duplicate

UI 부분 (위젯)

1. Hello World!

시작 해보기

import 'package:flutter/material.dart'; void main() { runApp( Center( child: Text( 'Hello, world!', textDirection: TextDirection.ltr, ), ), ); } void main() { runApp(MyApp()); } void main() => runApp(MyApp());
C++
복사
Flutter는 모든게 위젯으로 이루어져있다!
runApp()
material.dart 에 expose 되어있는 함수
어플에 화면을 뿌리는 함수
인자로 root 위젯을 넣어주면
위젯의 build 함수를 호출한다.

위젯의 종류

Visible 위젯
실제로 보이는 위젯
Text, Card, RaisedButton 등
Invisible 위젯
실제로 보이지는 않는 위젯
visible 위젯이 어떻게 화면에 보여질지 컨트롤
레이아웃을 정해주는 위젯
Row, Column, ListView 등
Container 위젯
실제로 보이지 않아 Invisible 위젯 같지만
눈에 보이는 스타일링을 할수있다.

예시

레이아웃 :
위젯으로 구성된 레이아웃 :
간단 작동 원리
각 OS의 native ui 에 전혀 상관없이
플러터 자체 구현으로 랜더링된다.
픽셀단위로 하나하나 조정 가능!
플랫폼에 제한이 없고 UI 를 더 자유롭게 쓸수있다.

2. State

state 이해하기

어플또는 위젯에서 쓰일 데이터를 의미
StatelessWidget 에는 state가 존재하지 않음
State를 쓰기 위해서는 StatefulWidget 을 써야함

Stateless

생성자(외부 데이터) → 위젯 → UI랜더링
생성자로 Input Data(외부 데이터)가 넘어갈수있음
만약 이 Input Data(외부 데이터)가 수정되면 rerender 된다.

Stateful

생성자(외부 데이터) → 위젯(내장 데이터) → UI 랜더링
생성자로 Input Data(외부 데이터)가 넘어갈수있음
내장 데이터 , 외부 데이터 모두 수정되면 rerender 된다.

간단한 StatelessWidget 구현

pubspec.yaml 에 dependencies 로 flutter 가 있기 때문에
플러터에서 구현해둔 클래스 등등을 쓸수있다.
import 'package:flutter/material.dart';
Bash
복사
위와 같이 dependency 를 불러올수있다.
class MyApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp(home: Text('Hello!!')); } }
Dart
복사
StatelessWidget 이라는 클래스를 상속받아서 나만의 위젯을 만든다.
이때 build 라는 메소드가 구현되어야한다.
해당 위젯의 메타정보가 담겨있는 context 를 받아 Widget을 반환하는 함수이다.
MaterialApp 위젯
생성자로 필요한 인자를 넘겨주면 된다.
home : 어플의 바탕이 되는부분
@overrid 데코레이터
메소드가 override 됨을 명시함
안해도 되긴하는데 하면 실수를 줄일수있다.

간단한 StatefulWidget 구현

2개의 클래스로 이루어져있다.
createState를 갖고있는 클래스
build 함수가 구현되어있는 클래스
이렇게 클래스 하나를 감싸는 이유
State 클래스 자체는 rerender 되지 않는다...?
class MyApp extends StatefulWidget { State<StatefulWidget> createState() { return _MyAppState(); } } class _MyAppState extends State<MyApp> { var _index = 0; void click() { setState(() { _index = _index + 1; }) } Widget build(BuildContext context) { var texts = [ 'abc', 'def', ] return MaterialApp(home: Text(texts[index])); } }
Dart
복사
createState 메소드의 반환값으로 MyAppState를 넘겨준다.
setState는 UI 를 rerender 시킨다. 전체는 아니고 해당 클래스의 build 함수를 다시 부름
하지만 여전히 엄청 비효율적 → 그래서 자체적으로 다 그리진 않고 뭐가 바꼈는지만 찾아서 변경함
setState 없이는 화면이 바뀌지 않음
보통 클래스를 외부에 보여주지 않기 위해서 _ 를 붙여서 private화 시킨다.

3. Widgets

Visible

MaterialApp
Scaffold
AppBar
RaisedButton 위젯
Text 위젯

Invisible

Column 위젯

Container

Container 위젯

4. Custom Widgets