Flutter:StatelessWidget과 StatefulWidget의 차이

14233 단어 DartFlutter

이것은 무엇인가


StatelessWidgetStatefulWidget 의 차이를 메모한 것.
잘못된 이해나 보충이 있으면 코멘트해 주시면 기쁩니다.

차이



먼저 정리합니다.

StatelessWidget


  • 상태가 없는 정적 Widget
  • 데이터가 전혀 변하지 않음
  • 예: 아이콘, 라벨, 텍스트...



  • StatefulWidget


  • 상태를 가지는 동적인 Widget
  • 사용자 상호 작용에 따라 데이터가 변경됨
  • 예: 확인란, 양식, 슬라이더...



  • 이미지로 본 분이 이해하기 쉬울지도.


    구체적인 예



    코드를 읽으면서 차이점을 살펴보십시오.
    다음은 Flutter의 초기 프로젝트에서 사용되는 카운터 앱 코드입니다.


    main.dart
    import 'package:flutter/material.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
            visualDensity: VisualDensity.adaptivePlatformDensity,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      int _counter = 0;
    
      void _incrementCounter() {
        setState(() {
          _counter++;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
    
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'You have pushed the button this many times:',
                ),
                Text(
                  '$_counter',
                  style: Theme.of(context).textTheme.headline4,
                ),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: _incrementCounter,
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
        );
      }
    }
    

    StatelessWidget



    우선은 StatelessWidget 의 부분을 본다.

    main.dart
    class MyApp extends StatelessWidget {
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
            visualDensity: VisualDensity.adaptivePlatformDensity,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    

    여기는 빌드되면 return문 이하가 실행되는 것만으로, 그 이후는 외부로부터의 (사용자의 상호작용 등) 영향을 받지 않는다.
    즉, 한 번 화면이 그려지면 나중에 다시 그려지지 않고 상태도 변경되지 않습니다.
    그리고 상태가 바뀌는 부분을 MyHomePage로 나누고 있는 것을 알 수 있다.

    StatefulWidget



    main.dart
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      int _counter = 0;
    
      void _incrementCounter() {
        setState(() {
          _counter++;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
    
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'You have pushed the button this many times:',
                ),
                Text(
                  '$_counter',
                  style: Theme.of(context).textTheme.headline4,
                ),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: _incrementCounter,
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
        );
      }
    }
    

    여기가 빌드되어 한 번 화면의 묘화가 끝나더라도 사용자의 상호 작용에 따라 데이터가 바뀐다 (화면이 다시 그려지는) 부분이 있다.
    그 기점이 화면 하단에 있습니다 floatingActionButton1. onPressed (버튼 누르기)
    2. _incrementCounter (카운터 수를 늘리는 방법)
    3. setState (상태를 유지하는 메소드)에 의해 다시 화면이 그려져
    4. _counter++ (카운터 수를 올리는 방법)에 의해 1을 더하고 있다.
    이와 같이 처음에는 카운터 수를 0으로 정의하고 있던 것을 사용자의 인터랙션에 의해 상태가 변경하고 있는 것을 알 수 있다.
    이것이 상황을 가진 동적인 StatefulWidget 이다.

    기타 개인 학습


    '$_counter' 라는 쓰는 방법을 하는 것으로, number형을 string형으로 바꿀 수 있다.
    세부사항: htps : //이다 rt. v / gu e s / u gu / u gu r r # 아바시 c

    참고


  • htps : // f ぅ라고 r. v / 두 cs /에서 ゔ ぉ p 맨 t / 우이 / 엔테라 c ゔ ぇ # s 갓
  • htps : // 메이 m. 이 m / f는 r에 넣는다.
  • 좋은 웹페이지 즐겨찾기