AR삽질러

Flutter 기초 - Stateful, Stateless (16) 본문

Dart/Flutter

Flutter 기초 - Stateful, Stateless (16)

아랑팡팡 2024. 5. 19. 14:50
728x90

 

Flutter 기초 - State Basic (16)

 

StatelessWidget

상태가 없는 위젯으로 생성될 때 한번 설정되고 데이터에 따라 동적으로 변하지 않는 의미로 StateWidget은 입력 데이터나 내부 상태의 변화 없이 동일한 정보를 표시할 때 사용한다.

 - 초기화시 입력된 파라미터를 기반으로 UI를 렌더링 한다.

 - 위젯의 속성이 변경되지 않는다.(불변성을 가진다)

 - 애니메이션, 데이터 변경에 반응해 상태를 변경할 필요가 없는 경우 적합하다.

 

StatefullWidget

 동적인 상태를 가질 수 있는 위젯으로 데이터의 변경에 따라 내부 상태가 변할 수 있고 변화된 상태에 따라 UI가 업데이트된다. StatefulWidget은 State객체를 생성하고 상태를 관리해 setState()메소드를 통해 상태가 변경되었을때 UI를 다시 빌드한다.

 - 위젯의 동적 상태 관리를 관리하기 위해 State클래스가 필요하다.

 - StatefulWidget은 생성 업데이트, 소멸 등의 라이프사이클을 가진다.

 

import 'package:flutter/material.dart';
import 'dart:math';

void main() {
  runApp(
    MaterialApp(
      home: HomeWidget(),
    ),
  );
}

class HomeWidget extends StatelessWidget {
  const HomeWidget({super.key});

  @override
  Widget build(BuildContext context) {
    return const SafeArea(
      child: Scaffold(
        body: Body(),
      ),
    );
  }
}

class Body extends StatelessWidget {
  const Body({super.key});

  @override
  Widget build(BuildContext context) {
    return Column(children: [
      ExampleStateless(),
      ExampleStateful(index: 3),
    ]);
  }
}

class ExampleStateless extends StatelessWidget {
  const ExampleStateless({super.key});

  @override
  Widget build(BuildContext context) {
    return Expanded(
      flex: 1,
      child: Container(
        color: Colors.red,
      ),
    );
  }
}

class ExampleStateful extends StatefulWidget {
  final int index;

  const ExampleStateful({required this.index, super.key});

  @override
  State<ExampleStateful> createState() => _ExampleStatefulState();
}

class _ExampleStatefulState extends State<ExampleStateful> {
  late int _index;
  late TextEditingController textEditingController;

  @override
  void initState() {
    super.initState();
    _index = widget.index;
    textEditingController = TextEditingController();
  }

  @override
  void dispose() {
    textEditingController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Expanded(
      flex: 1,
      child: GestureDetector(
        onTap: () {
          setState(() {
            if (_index == 5) {
              _index = 0;
              return;
            }
            _index++;
            print(_index);
          });
        },
        child: Container(
          color: Colors.blue.withOpacity(_index / 5),
          child: Center(
            child: Text('$_index'),
          ),
        ),
      ),
    );
  }
}

 

HomeWidget

 - 상태가 없는 위젯(StatelessWidget)으로 앱의 기본화면을 구성하며 Scaffold를 사용해 앱의 기본 레이아웃을 설정하고 내부 Body위젯을 포함한다.

 

Body

 - StatelessWidget이며, 두개의 자식 위젯을 Column으로 배치한다. 

 - 첫번째 자식위젯 : ExampleStateless

 - 두번째 자식위젯 : ExampleStateful

 

ExampleStateless

 - 확장된 빨간색 컨테이너를 나타내며 동적인 상태 변화 없이 일관된 색상을 유지한다.

 

ExampleStateful

 - 상태가 있는 위젯(StatefulWidget)은 사용자 상호작용에 반응해 내부 상태를 변경한다. 아래의 탭을 클릭할때 마다 _index가 증가해 특정값에 도달하면 0으로 리셋된다.

 

 

728x90
반응형
LIST

'Dart > Flutter' 카테고리의 다른 글

Flutter 기초 - RadioButton (18)  (0) 2024.05.22
Flutter 기초 - CheckBox (17)  (0) 2024.05.22
Flutter 기초 - Widget Stack (15)  (0) 2024.05.19
Flutter 기초 - Widget 비율 (14)  (0) 2024.05.19
Flutter 기초 - SingleChildScrollView (13)  (0) 2024.05.16