App/flutter

플러터 상태관리(statelessWidget, statefulWidget)

STUFIT 2023. 12. 5. 13:55
반응형

플러터에서는 주로 두 가지 유형의 위젯을 사용하는데 바로 statelessWidget과 statefulWidget이다.

이 두 유형의 위젯은 플러터 사용자 인터페이스를 구성하는데 중요한 역할을 하는데 해당 역할에 대해서 말씀드리도록 하겠습니다.

1. StatelessWidget

StatelessWidget은 상태가 없는 위젯입니다. 즉, 이 위젯은 생성될 때 전달받은 정보를 바탕으로 UI를 구성하지만, 생명주기 동안 내부 상태가 변경되지 않습니다. StatelessWidget의 주요 특징은 다음과 같습니다:

  • 불변성(Immutability): StatelessWidget은 한 번 생성되면 그 상태가 변경되지 않습니다. 이는 위젯이 변경할 수 있는 내부 상태를 가지지 않음을 의미합니다.
  • 재사용성(Reusability): 불변성 때문에 StatelessWidget은 다양한 곳에서 재사용될 수 있습니다. 동일한 정보로 위젯을 여러 번 생성해도 항상 같은 결과를 얻을 수 있습니다.
  • 성능(Performance): 상태 변경이 없기 때문에 StatelessWidget은 일반적으로 StatefulWidget보다 성능적인 측면에서 우수합니다.
  • 용도: StatelessWidget 고정된 데이터를 표시하거나, 사용자 상호작용에 의해 상태가 변경될 필요가 없는 경우에 적합합니다. 예를 들어, 텍스트, 아이콘, 데코레이션 등이 이에 해당합니다.

<예시코드>

class WelcomeWidget extends StatelessWidget {
  final String name;

  const WelcomeWidget({Key? key, required this.name}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text('안녕하세요, $name!'),
    );
  }
}


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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter 예시'),
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: const <Widget>[
            WelcomeWidget(name: 'Flutter'),
            SizedBox(height: 20),
            CounterWidget(),
          ],
        ),
      ),
    );
  }
}

 

2. StatefulWidget

StatefulWidget은 상태를 가지는 위젯입니다. 이 위젯은 내부 상태가 시간에 따라 변경될 수 있으며, 상태 변경 시 위젯이 자동으로 다시 빌드됩니다. StatefulWidget의 주요 특징은 다음과 같습니다:

  • 상태 변화(Stateful): StatefulWidget은 내부 상태를 가지며, 이 상태는 위젯의 생명주기 동안 변경될 수 있습니다. 상태 변경 시 위젯이 자동으로 업데이트됩니다.
  • 동적 인터페이스(Dynamic Interface): 사용자의 상호작용 또는 데이터의 변화에 따라 UI가 업데이트될 필요가 있는 경우 StatefulWidget을 사용합니다. 예를 들어, 사용자 입력 폼, 체크박스, 슬라이더 등이 이에 해당합니다.
  • 생명주기(Lifecycle) 관리: StatefulWidget은 생성, 업데이트, 소멸 등과 같은 생명주기를 가지고 있으며, 개발자는 이러한 생명주기에 따라 코드를 작성할 수 있습니다.
  • 용도: 동적 데이터 또는 사용자 상호작용에 의해 UI 변화하는 경우 StatefulWidget 적합합니다. 예를 들어, 사용자 입력에 반응하거나 데이터 변경에 따라 UI 업데이트해야 사용됩니다.

<예시코드>

class CounterWidget extends StatefulWidget {
  const CounterWidget({Key? key}) : super(key: key);

  @override
  _CounterWidgetState createState() => _CounterWidgetState();
}

class _CounterWidgetState extends State<CounterWidget> {
  int counter = 0;

  void incrementCounter() {
    setState(() {
      counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text('버튼을 누른 횟수:'),
          Text(
            '$counter',
            style: Theme.of(context).textTheme.headline4,
          ),
          ElevatedButton(
            onPressed: incrementCounter,
            child: Text('증가'),
          ),
        ],
      ),
    );
  }
}



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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter 예시'),
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: const <Widget>[
            WelcomeWidget(name: 'Flutter'),
            SizedBox(height: 20),
            CounterWidget(),
          ],
        ),
      ),
    );
  }
}

 

3. 차이점

  • 상태 관리: StatelessWidget은 상태를 가지지 않고, StatefulWidget은 내부 상태를 가지며 상태 변경에 따라 UI를 업데이트합니다.
  • 재사용성: StatelessWidget은 불변성을 가지므로 다양한 곳에서 재사용하기 쉽습니다. 반면, StatefulWidget은 상태에 따라 다르게 동작할 수 있어 재사용성이 상대적으로 낮을 수 있습니다.
  • 생명주기: StatefulWidget은 복잡한 생명주기를 가지며, 상태 관리 및 생명주기에 따른 추가 로직이 필요할 수 있습니다. StatelessWidget은 생명주기 관리가 간단합니다.

위젯 유형의 선택은 앱의 요구사항과 상호작용의 복잡성에 따라 달라집니다. 상태 변경이 필요없는 간단한 UI 구성 요소의 경우 StatelessWidget 적합하고, 사용자 상호작용이나 데이터 변화에 반응해야 하는 경우 StatefulWidget 사용합니다.

반응형

'App > flutter' 카테고리의 다른 글

[Flutter] Gesture & Setting  (0) 2025.02.21
상태관리 : bloc 과 provider에 대해서  (2) 2023.11.29