기본 콘텐츠로 건너뛰기

[Flutter] Flutter - Widgets (stateless)

 

Widgets

개념

정의 및 목적

Everything is a Widget. It’s all Widgets!

UI를 묘사하는 다트의 클래스

화면에 나타날 요소를 결정하는 데이터와 설정

<aside> 💡 JS로 치면 컴포넌트와 비슷!

</aside>

→ 플러터에서는 모든 요소 하나하나가 위젯

→ 위젯이 위젯 포함

→ 위젯들이 모인 Widget Tree를 바탕으로 화면 그림


위젯의 주 목적은 build()함수 구현

기본 예시

import 'package:flutter/material.dart';

void main() {
	runApp(
		Center(
			chlid: Text(
				'Hello, world!',
				textDirection: TextDirection.lrt,
			),
		),
	);
}

Widget Tree는 Center widget 과 Text widget 으로 구성

플러터의 Root Widget은 화면 전체를 덮어주고 Text widget 에서 Hello world 표시

<aside> 💡 기본적인 widget 예시

  • 레이아웃 : Scaffold, Stack, Row, Column
  • 구조 : Button, Toast, MenuDrawer
  • 스타일 : TextStyle, Color
  • 애니메이션 : FadeInPhoto, Transform
  • 위치와 정렬 : Center, Padding </aside>

기본 위젯

Text

  • 앱에 텍스트 작성

Row, Column

  • flexible한 레이아웃 만들어 줌
  • Row와 Column 방향으로 각기 설정 가능

Stack

  • 수직, 수평으로 linearly하게 위젯 쌓는 것이 아닌 페인트 겹겹이 칠하는 것처럼 위젯 구현 가능

Container

  • 직사각형의 visual 요소 생성
  • BoxDecoration으로 꾸며질 수 있음, 배경화면이나 경계, 그림자 등 꾸밀 수 있음
  • margin, padding, constraint 값을 가질 수 있음
  • matrix 이용해 3차원 형태 공간으로 변형 가능

구분

Widget은 State를 관리 여부에 따라 크게 2개로 구분

Stateless Widget

상태가 없는 위젯

변화가 거의 없는 위젯을 선언

Stateful Widget

state라는 데이터 변화를 감지하고, state가 변할 시 위젯을 rebuild하는 위젯

setState 함수를 통해 state 변화를 감지

Stateless Widget

개념

상태가 없는 Widget

변경 가능한 상태가 필요하지 않은 Widget

특징

  • 상태(state)가 없기 때문에 상태 관리할 필요가 없음
  • 한번 그리고 다시 그려야할 필요가 없을 때 사용
  • StatelessWidget의 필드들은 final로 선언
  • StatelessWidget은 부모 위젯으로부터 arguments를 final로 전달받음
  • build() 함수를 요청받으면 전달받은 arguments를 새로운 위젯을 생성하는 데 전달

 ❓ StatelessWidget은 결코 변하지 않는 것일까?

결코 변하지 않는다는 의미는 아니다. 외부의 정보에 따라 반응하기 때문이다.

위젯을 언제 tree에서 remove 해야할지, 언제 rebuild 해야할지가 외부로부터 결정된다.


기본 형태

class Example extends StatelessWidget {
	const Example({ Key? key }) : super(key: key);

	@override
	Widget build(BuildContext context) {
		return Container(...);
	}
}

constructor

기본생성자

class명 Example 과 동일한 이름

뒤에 붙은 : super(key: key)는 부모인 StatelessWidget의 기본생성자를 호출

데이터를 전달할 파라미터가 없으면 기본생성자는 생략 가능

build

화면을 구성한 UI들을 구현하는 메서드

Widget을 리턴하는 함수 → build가 return하는 Widgets로 View가 그려짐

⇒ 화면이 출력될 때 build 메서드가 호출되면서 build 메서드 내부에 구현한 UI 위젯들이 화면에 출력

모든 위젯 클래스에 포함된 필수 메서드 (SLW과 SFW의 State 클래스에서 구현)

이해를 위한 예시

class SLWdemo extends StatelessWidget {

  int _count = 0;

  @override
  Widget build(BuildContext context) {
    print("** build - StatelessWidget Demo");
    return Scaffold(
      appBar: AppBar(title: Text("Stateless Widget")),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              "$_count",
              style: TextStyle(fontSize: 30),
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                FloatingActionButton(
                  heroTag: null,
                  child: Icon(Icons.add),
                  onPressed: () {
                    _count++;
                    print("value of _count = $_count");
                  },
                ),
                FloatingActionButton(
                  heroTag: null,
                  child: Icon(Icons.remove),
                  onPressed: () {
                    _count--;
                    print("value of _count = $_count");
                  },
                )
              ],
            )
          ],
        ),
      ),
    );
  }
}

❓ 제대로 작동해서 화면이 변할까?

버튼 클릭해도 _count값은 증가되지만 화면상으로는 변화가 보이지 않는다.

앞서 설명한 내용을 토대로 SLW은 내부의 모든 UI 위젯이 상태를 가질 수 없다. 상태가 없으니 상태의 변화를 인지할 필요도 없고 할 수도 없다.

그래서 화면이 생성될 때 한번만 build 메서드를 호출해서 화면을 구성한다. 그 이후에는 build 함수가 다시 호출되지 않는다.

따라서, 버튼을 클릭해 _count 값을 변경 시켜도 build 메서드는 호출되지 않으므로 화면 내 Text 위젯의 값도 변경되지 않는다.


사용 예시

class Box extends StatelessWidget {
  Color color;
  String text;

  const Box(this.color, this.text);

  @override
  Widget build(BuildContext context) {
    return DecoratedBox(
        decoration: BoxDecoration(color: this.color),
        child:  Text(this.text)
    );
  }
}

❗ This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final: Box.color, Box.text

상태가 변경되는 것을 막기 위해 statelessWidget 필드 안 변수들을 final 선언해라!


class Box extends StatelessWidget {
  final Color color;
  final String text;

  const Box(this.color, this.text);

  @override
  Widget build(BuildContext context) {
    return DecoratedBox(
        decoration: BoxDecoration(color: this.color),
        child:  Text(this.text)
    );
  }
}
class Box extends StatelessWidget {
  final Color color;
  final String text;

  const Box({this.color, this.text});

  @override
  Widget build(BuildContext context) {
    return DecoratedBox(
        decoration: BoxDecoration(color: this.color),
        child:  Text(this.text)
    );
  }
}
// before
Box(Colors.blue, "Hello"),
Box(Colors.pink, "world"),
Box(Colors.amberAccent, "Dart")

// after
Box(color: Colors.blue, text: "Hello"),
Box(color: Colors.pink, text: "world"),
Box(color: Colors.amberAccent, text: "Dart")

이 블로그의 인기 게시물

[모집] 2024학년도 1학기 신규인원 모집: 3/10(일) 마감

안녕하세요, 구글 기술 앰버서더, 성균관대학교 Google Developer Student Clubs 입니다! GDSC (Google Developer Student Clubs)는 Google에서 학생들이 개발/리더십 능력을 향상할 수 있도록 지원하는 대학생 커뮤니티 프로그램입니다. 성균관대학교 GDSC는 구글 코리아, Google for Developers, SW중심대학사업단 등 다양한 단체와 협업하여 구글 기술을 대중에 알리고 관련 행사를 주최하며, 이러한 프로그램을 통해 협업성, 인적 네트워킹 및 리더십을 향상할 수 있습니다.

[11월 행사] 머신러닝/인공지능 (ML/AI) 스터디 워크샵: 사전 신청 오픈! — Google Developers 전문가와 함께하는 머신러닝/인공지능 학습, 텐서플로우 실습 및 네트워킹 기회! (11/9 사전신청 마감)

  👉 사전 신청 종료 추가적인 사전 신청을 원하시는 경우 연락 페이지 를 통해서 문의하시길 바랍니다. 업데이트 (11/8): 본 행사는 정책상 참여자 분들께서 요청하실 경우 행사 참여 확인서를 발급해드릴 예정입니다. 행사 참석 당일날 스태프 분께 말씀하시면 됩니다. 업데이트 (11/9):  상세한 행사 정보가 부분적으로 오류가 있어서 정정했습니다. (행사 시작 시간은 변경되지 않았습니다.) 기타 문의하실 사항이 있으실 경우 연락 페이지를 통해서 문의주시면 감사하겠습니다.   안녕하세요, 성균관대학교 Google Developer Student Club (GDSC) 입니다. Google Developers 전문가 분들과 함께 저희 GDSC SKKU TensorFlow 팀에서 11월 10일 💻November ML/AI Study Workshop💻을 주최합니다! 👏🏼 프로그램에서는 TensorFlow 기초 이해부터 주요 신경망 모델링 및 학습까지 TensorFlow 기술 전반에 대한 실습이 진행되며 관련 전문가 분들과의 네트워킹 기회가 제공될 예정입니다. 🍔 또한 본 행사에서는 참가자분들을 위한 간식, 음료와 간단한 저녁식사도 준비되어 있습니다! 👇🏼 이벤트 상세 내용은 아래와 같습니다. 📍 일시: 11월 10일 (금) 16:00 ~ 20:30 📍 장소: 자연과학캠퍼스 화학관 1층 330102 첨단강의실 📍 참가대상: 성균관대학교 학부생 누구나 📍 프로그램 내용 I. TensorFlow 기초 이해 II. 주요 신경망 모델링 및 학습 (CNN, Cloud Run, RNN) III. 종료 및 네트워킹 📍 진행자 이영빈 님 (GDG Songdo Organizer) 한상준 님 (GDG Songdo Organizer) 권정민 님 (Google Developer Experts) 장현수 님 ((전)성균관대학교 박사) 📍 사전 신청링크 https://gdscskku.blogspot.com/mlai-study   머신러닝 및 인공지능 분야 및 Tenso

[글로벌 IT전문가와 킹고인의 만남 시즌2] 행사 신청/참석 안내

  글로벌 IT전문가와 킹고인의 만남 시즌2에 대해 많은 관심 감사드립니다! 본 웹페이지를 통해서 학우님들의 원활한 행사 신청 및 참석을 위해 GDSC Community Platform 사용법을 안내드리고자 합니다 [카카오톡으로 링크 접속하신 경우 안내] 카카오톡 내장 브라우저에서 Google 로그인 시 "액세스 차단됨: Bevy의 요청이 Google 정책을 준수하지 않습니다"로 표시되는 사례가 확인되었습니다. 구글 계정 보안 정책상 카카오톡 내장 브라우저 내 로그인을 허용하지 않은 관계로, 디바이스에 설치된 기본 브라우저(Google Chrome 등)를 통해서 신청하시길 바랍니다. 👉 글로벌 IT전문가와 킹고인의 만남 시즌2 신청하기 플랫폼 인프라스트럭처 운영사/제공자: Google LLC/Bevy Labs, Inc. 행사 신청하기 1. GDSC 이벤트 플랫폼 웹사이트에서 구글 계정을 이용해서 로그인을 합니다. 2. (처음 로그인하는 경우) Sign up 페이지에서 필요한 정보를 입력합니다. 3. 로그인인 된 상태일 경우 "RSVP for this event now!" 아래에 온라인/오프라인 참석을 선택할 수 있습니다. 희망하시는 참석 방법 오른쪽에 있는 RSVP 버튼을 클릭하시면 됩니다. 4. RSVP 클릭 후 참석자 (Attendee Information) 입력하세요. (한글 설명, 학번, 전공 등) 5. RSVP Confirmed가 표시될 경우 신청이 완료되었음을 확인하실 수 있습니다. 행사 참석하기 (온라인) 행사가 시작될 경우 행사 웹페이지에서 [Join Event] 버튼이 표시됩니다. [Join Event] 버튼을 클릭하시면 바로 참석하실 수 있습니다. 참고: 행사 신청하신 경우 시스템 상 자동으로 이메일을 통해서 안내드립니다.

[12월 행사] ⭐ GDSC에서 연합 해커톤💻 행사를 개최합니다! 🎉

신청 URL: https://festa.io/events/4457 신청 마감시간: 12월 22일 금요일 21시 안녕하세요, 성균관대학교 Google Developer Student Club (GDSC) 입니다.  12월 28일부터 29일까지 마루 180에서 서울여자대학교, 연세대학교, 한양대학교의 GDSC 지부와 연합한 해커톤 대회를 주최하고 있습니다. 본 프로그램에서 참가자들은 서울여자대학교, 연세대학교, 한양대학교 학생들과 연합하여 팀을 구성하고 기업의 API 혹은 자체 개발 상품을 활용한 집중 해킹을 진행하며, GDE(Google Developer Experts) 및 GDG(Google Developer Groups)의 멘토링을 받아 프로젝트를 개발하고, 제휴기업 세미나 청강 및 네트워킹을 진행합니다. 행사 참가자와 수상팀에게 식사와 상품도 제공될 예정입니다. 아래 링크를 통해 이벤트 상세 내용 확인 및 티켓 구입이 가능합니다.  신청은 12월 22일 금요일 21시까지입니다. https://festa.io/events/4457 타학교 학생들과 연합하며 팀워크를 키우고 싶으신 분, 프로젝트 개발 경험을 쌓고 자신의 분야에 전문성을 키우고 싶으신 분, 전문가 및 공통 관심사의 학우들과 정보를 교환하고 협력하고 싶으신 분 모두 환영입니다! 학부생 여러분들의 많은 관심 부탁드립니다. 🙌🏼  공동 주최:  GDSC Yonsei | GDSC SWU | GDSC Hanyang | GDSC SKKU | 알파코 K-디지털 플랫폼(DT 그라운드) 주관: 성균관대학교 SW중심대학사업단 후원:  Google for Developers,  MONSTER ENERGY,  Wrtn Technologies

[9월 행사] 구글 클라우드 스터디 워크샵: 사전 숙지사항

9월달 구글 클라우드 스터디 워크샵에 신청해주신 여러분 감사드립니다. 행사 참여에 앞서, 아래의 사전 숙지사항을 반드시 확인해주시기 바랍니다. 여러분의 원활한 참여를 위해 준비 사항을 지켜주시면 감사하겠습니다. 필수 물품: 개인 노트북 필수 : 워크샵 동안 여러분의 개인 노트북을 사용하게 되는 만큼, 필히 노트북을 지참해 주시기 바랍니다. 실물 해외 신용카드 (VISA/MasterCard): GCP 계정을 생성할 때 결제 정보가 필요합니다. 권장 물품: 노트북 충전기/멀티탭: 각자의 노트북을 사용할 예정이므로 충전이 필요한 기기를 위해 노트북 충전기 및 멀티탭을 지참하시는 것을 추천드립니다. 진행장소: 성균관대학교 자연과학캠퍼스(수원) 화학관 1층 330118 첨단강의실 Google Map:  https://maps.app.goo.gl/841LUEsJB1mB8YPG6 카카오 맵: https://kko.to/-64Z139x7E 네이버 지도:  https://naver.me/GNUIWpp5