본문 바로가기
Flutter/Flutter Study

[Flutter] Stateless 위젯을 Stateful 위젯으로 바꿔보기

by 하루IT 2023. 2. 8.
반응형

 

Content


     

     

     

    해당 화면은 위젯을 색성하고 삭제가 가능하며 색바꾸기를 누르면 다른 색으로 변경이 된다.

     

    StatelessWidget으로 구현한 코드

    main.dart 파일

    import 'package:flutter/material.dart';
    import 'package:flutter_lifecycle/screen/home_screen.dart';
    
    void main() {
      runApp(MaterialApp(
        home: Root(),
      ));
    }
    
    class Root extends StatefulWidget {
      const Root({Key? key}) : super(key: key);
    
      @override
      _RootState createState() => _RootState();
    }
    
    class _RootState extends State<Root> {
      Color color = Colors.purple;
      bool show = false;
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: SafeArea(
            child: Padding(
              padding: const EdgeInsets.symmetric(horizontal: 100.0),
              child: Column(
                children: [
                  Expanded(
                    child: Center(
                      child: show
                          ? HomeScreen(
                              color: color,
                            )
                          : Container(),
                    ),
                  ),
                  Column(
                    crossAxisAlignment: CrossAxisAlignment.stretch,
                    children: [
                      ElevatedButton(
                        onPressed: () {
                          setState(() {
                            color = color == Colors.orange
                                ? Colors.purple
                                : Colors.orange;
                          });
                        },
                        style: ElevatedButton.styleFrom(primary: Colors.amber[600]),
                        child: Text(
                          '색 바꾸기',
                        ),
                      ),
                      const SizedBox(height: 10.0),
                      ElevatedButton(
                        onPressed: () {
                          setState(() {
                            show = !show;
                          });
                        },
                        style: ElevatedButton.styleFrom(primary: Colors.amber[700]),
                        child: Text(
                          !show ? '위젯 생성' : '위젯 삭제',
                        ),
                      ),
                      const SizedBox(height: 100.0),
                    ],
                  ),
                ],
              ),
            ),
          ),
        );
      }
    }

     

    home_screen.dart 파일

    import 'package:flutter/material.dart';
    
    class HomeScreen extends StatelessWidget {
      final Color color;
    
      const HomeScreen({
        required this.color,
        Key? key,
      }) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Container(
          width: 150.0,
          height: 150.0,
          color: color,
        );
      }
    }

     

    폴더 구조

     


     

    StatefulWidget으로 바꾸어 구현해보기

     

    StatefulWidget 구조 만들기

    import 'package:flutter/material.dart';
    
    class HomeScreen extends StatefulWidget {
      const HomeScreen({super.key});
    
      @override
      State<HomeScreen> createState() => _HomeScreenState();
    }
    
    class _HomeScreenState extends State<HomeScreen> {
      @override
      Widget build(BuildContext context) {
        return Container();
      }
    }

     

    State<HomeScreen> createState() => _HomeScreenState();
    • StatefulWidget을 사용하려면 2개의 클래스를 구성해야 하는데 하나는 createState가 가능한 class와 State class를 생성해준다. 위에서 보는 바와 같이 2개의 클래스가 있다.
    • StatefulWidget에 해당되는 클래스는 외부에서 사용이 되는데, State 같은 경우에는 StatefulWiget에 바인딩이 되어서 내부에서 쓰이기 때문에, ' _ ' 기호를 넣어 private 하게 만들어준다.
    class _HomeScreenState extends State<HomeScreen> {
      @override
      Widget build(BuildContext context) {
        return Container();
      }
    }
    • State 같은 경우에는 State<>와 같이 제너릭을 만들어줘야 하는데, 괄호 안에 바인딩을 할 Stateful Widget 클래스를 넣어주면 된다.

     

     

     

     

    라이프사이클에 대한 이해가 부족하다면 아래의 글을 참고하도록 하자.

    [Flutter] 위젯 라이프사이클

     

    [Flutter] 위젯 라이프사이클 / StatelessWidget, StatefulWidget LifeCycle 함수 메서드 정리

    목차 라이프사이클 (Life Cycle = 생명주기)란? Foreground/Background 상태에 있을 때, 시스템이 발생시키는 event에 의해 App의 상태가 전환되는 일련의 과정을 말한다. 쉽게 말하면 사용자가 앱을 실행하

    parkjh7764.tistory.com

     

     


     

    StatefulWidget으로 작성된 코드

    import 'package:flutter/material.dart';
    
    class HomeScreen extends StatefulWidget {
      final Color color;
    
      const HomeScreen({
        required this.color,
        Key? key,
      }) : super(key: key);
    
      @override
      State<HomeScreen> createState() => _HomeScreenState();
    }
    
    class _HomeScreenState extends State<HomeScreen> {
      @override
      Widget build(BuildContext context) {
        return Container(
          width: 150.0,
          height: 150.0,
          color: widget.color,
        );
      }
    }
    • State 같은 경우에 값을 받아오기 위해서는 다른 클래스에서 받기 때문에 기존의 방식대로 가져오지 못 하고, State 클래스는 Stateful Widget 클래스를 extends 해오기 때문에, 내부에 widget. 이라는 키워드를 사용해 가져온다.

     

     

     

    위에서 언급한 StatelessWidget으로 작성된 코드이다. 차이점을 비교하면서 공부를 해보자.

    import 'package:flutter/material.dart';
    
    class HomeScreen extends StatelessWidget {
      final Color color;
    
      const HomeScreen({
        required this.color,
        Key? key,
      }) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Container(
          width: 150.0,
          height: 150.0,
          color: color,
        );
      }
    }

    댓글