Flutter

Stateful, Stateless 위젯

Dean83 2023. 2. 17. 08:50

위젯에는 크게 Stateless 와 Stateful 이 있다. (InheritedWidget은 생략)

 

간략히 말해 Stateless 는 마치 상수처럼 UI 모습 자체가 변화할 일 이 없는거고, Stateful 은 상황에 따라 UI에 

변경이 있는 위젯이다. (예 : 변수값을 화면에 표시)

 

Stateless 위젯은 크게 살펴 볼게 없다.

 

1. Stateless 위젯 생성

    - Widget build 함수를 오버라이딩 하여 UI를 구성한다.     -

class test extends StatelessWidget 
{
	const test({super.key});
    @override
    Widget build (BuildContext context)
    {
    	return ... 
    }
}

     - 부모 클래스인 StatelessWidget을 상속받고, super.key 를 받는 생성자를 만든다

     - 오버라이딩한 build 함수 인지값인 BuildContext 는 신경쓰지 말자. 이 내부에 실제 UI 위젯들을 배치하면 된다. 

     - key 나 context는 따로 신경 안써도 된다. 시스템에서 알아서 한다. 

 

 

2. Stateful 위젯

     -  클래스에 맞는 State 를 갖는다. 

     - State는 재활용이 가능하나 추천하지는 않는듯 하다

     - State 안에 똑같이 Widget build 함수를 통해 UI를 구성한다. 
     - UI 상태변화를 하기 위해서는 setState 함수를 호출해야 한다.

     - State 클래스에서 @override 를 통해 InitState 등 State 관련된 함수를 오버라이딩 할수있다  

class statefultest extends StatefulWidget {
	const statefultest({super.key});
    
    @override
    State<statefultest> createState() => _testState();
 }
 
 class _testState extends State<statefultest>
 {
 
 	String textval;
    
    void changeText(String txt)
    {
    	setState(() {
        	textval = txt
        });
    
    }
    
    @override Widget build(BuildContext context) {
    	return ......
    }
 
 }

 

아 참, private 설정이 다트에서는 이름 앞에 _ 를 붙이면 된다.  

3. 간단 정리
     - StatelessWidget 에서, 클릭했을때 무언가 UI의 변화를 주어야 한다면, 외부 클래스를 이용해야 한다. 
        ChangeNotifier 를 상속받는 클래스를 만들고, 해당 클래스를 context.watch<클래스명>(); 을 통해 연계해야한다. 

 

    - StatefulWidget 의 경우, 나와 매칭되는 State 에서 변수 추가라든지, 클릭시 작업해야 하는 것들을 코딩해 놓고, 
       UI를 변경 시킬 수 있다. 

즉, 클릭이든 뭐든 UI에 변경을 주어야 하는 상황에서, StatelessWidget 은 자체적으로 처리할 수 없고, 대리자가 필요하며,  StatefulWidget은 본인의 State를 통해 자체 처리할 수 있다. 

'Flutter' 카테고리의 다른 글

Slivers, CustomScrollView  (0) 2023.03.14
Builder (StreamBuilder, FutureBuilder)  (0) 2023.03.14
Stream (Kotlin 라이브데이터)  (0) 2023.03.14
비동기, Future , Then  (0) 2023.03.07
Flutter 첫느낌, 그리고 위젯  (0) 2023.02.14