첫 번째 Flutter 항목 - 카운터 예

8380 단어
창설된 flutter 프로젝트에서 이 부분들이 어떻게 조직되었는지 보십시오
이 예에서 주요Dart 코드는lib/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,
      ),
      //       
      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 {
  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: [
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

분석하다.


1. 패키지 가져오기
import 'package:flutter/material.dart';

이 행 코드는 Material UI 구성 요소 라이브러리를 가져오는 역할을 합니다.Material은 표준적인 모바일과 웹의 시각적 디자인 언어로 Flutter는 기본적으로 풍부한 Material 스타일의 UI 구성 요소를 제공합니다.
2. 입구 적용
void main() => runApp(new MyApp());
  • 는 C/C++,Java와 유사하다. Flutter 응용 프로그램에서main 함수는 응용 프로그램의 입구이고main 함수에서runApp 방법을 호출했다. 그 기능은 Flutter 응용 프로그램을 시작하는 것이다. 이는widget 파라미터를 받아들이고 이 예에서 이것은 MyApp류의 실례이며 이 파라미터는 Flutter 응용 프로그램을 대표한다.
  • main 함수는 (=>) 기호를 사용했습니다.Dart에서 단행 함수나 방법의 약자입니다.

  • 3. 응용 구조
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
          //      
          title: 'Flutter Demo', 
          theme: new ThemeData(
            //      
            primarySwatch: Colors.blue,
          ),
          //        
          home: new MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
  • MyApp 클래스는 Flutter 응용을 대표하고 Stateless Widget 클래스를 계승했다. 이것은 응용 자체도widget이라는 것을 의미한다.
  • Flutter에서 대부분의widget은 정렬(alignment), 충전(padding), 레이아웃(layout)을 포함한다.
  • Flutter는 페이지를 구축할 때 구성 요소의build 방법을 호출하고widget의 주요 작업은build () 방법을 제공하여 UI 인터페이스를 구축하는 방법을 설명하는 것이다. (일반적으로 다른 기초widget을 조합하고 조립하는 것을 통해)
  • 머티리얼 앱은 머티리얼 라이브러리에서 제공하는 플루터 앱 프레임워크로 앱의 이름, 주제, 언어, 첫 페이지 및 라우팅 목록 등을 설정할 수 있다.Material Apps도 widget입니다.
  • Scaffold는Material 라이브러리에서 제공하는 페이지 비계로 내비게이션 표시줄과 바디, 그리고 FloatingActionButton을 포함한다.
  • 홈은 Flutter 응용 프로그램의 첫 페이지이고widget이다.

  • 4. 첫 페이지
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
      final String title;
      @override
      _MyHomePageState createState() => new _MyHomePageState();
    }
    
    class _MyHomePageState extends State {
     ...
    }
    

    MyHomePage는 Stateful Widget 클래스를 계승하여 상태가 있는widget(Stateful widget)이라는 것을 나타내는 응용 프로그램의 첫 페이지입니다.이제 Stateful widget과 Stateless widget은 두 가지 차이가 있다고 간단히 생각할 수 있습니다.
  • Statefulwidget은 상태를 가질 수 있다. 이런 상태는widget의 생명 주기에 변할 수 있지만 Statelesswidget은 변할 수 없다.
  • Stateful widget은 최소 두 가지 클래스로 구성됩니다.
  • StatefulWidget 클래스
  • State 클래스 1개,StatefulWidget 클래스 자체는 변하지 않지만 State 클래스에 있는 상태는widget 생명주기에 변화가 발생할 수 있습니다.


  • _MyHomePageState 클래스는 MyHomePage 클래스에 해당하는 상태 클래스입니다.여기를 보면 세심한 독자들이 MyApp류와 달리 MyHomePage류에build 방법이 없다는 것을 발견할 수 있다. 대신build 방법이 옮겨졌다MyHomePageState 방법에서 왜 이렇게 하는지 의문을 남기고 전체 코드를 분석한 후에 해답을 드리겠습니다.
    다음은 우리가MyHomePageState에는 다음이 포함됩니다.
    (1) 상태.
    int _counter = 0;
    

    _counter는 화면의 오른쪽 아래 테이프를 저장합니다 "➕”번호 버튼 클릭 횟수의 상태.
    (2) 상태의 자증 함수를 설정합니다.
    void _incrementCounter() {
      setState(() {
         _counter++;
      });
    }
    

    버튼을 클릭하면 이 함수를 호출합니다. 이 함수의 역할은 먼저 증가합니다counter, 그리고 setState 방법을 호출합니다.set State 방법의 역할은 Flutter 프레임워크를 알리는 것입니다. 상태가 바뀌었습니다. Flutter 프레임워크는 알림을 받은 후build 방법을 실행하여 새로운 상태에 따라 인터페이스를 재구성합니다. Flutter는 이 방법을 최적화하여 재집행을 빠르게 하기 때문에 업데이트가 필요한 모든 것을 재구성할 수 있습니다. 각widget을 수정할 필요가 없습니다.
    (3) UI 인터페이스 구축
    UI 인터페이스를 구축하는 논리는build 방법에서 MyHomePage를 처음 만들 때MyHomePageState 클래스가 생성됩니다. 초기화가 완료되면 Flutter 프레임워크는widget의build 방법을 사용하여widget 트리를 구축하고, 최종적으로widget 트리를 장치 화면에 렌더링합니다.그러니까 보자MyHomePageState의build 방법에서 무슨 일을 했는지:
    Widget build(BuildContext context) {
        return new Scaffold(
          appBar: new AppBar(
            title: new Text(widget.title),
          ),
          body: new Center(
            child: new Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                new Text(
                  'You have pushed the button this many times:',
                ),
                new Text(
                  '$_counter',
                  style: Theme.of(context).textTheme.display1,
                ),
              ],
            ),
          ),
          floatingActionButton: new FloatingActionButton(
            onPressed: _incrementCounter,
            tooltip: 'Increment',
            child: new Icon(Icons.add),
          ),
        );
      }
    
  • Scaffold는Material 라이브러리에서 제공하는widget으로 기본 내비게이션 표시줄, 제목, 메인 화면widget 트리를 포함하는body 속성을 제공합니다.widget 트리는 복잡할 수 있습니다.
  • body의widget 트리에는 Centerwidget이 포함되어 있다. Center는 자widget 트리를 화면 중심에 배치할 수 있다. Center자widget은Columnwidget이다. Column의 역할은 모든 자widget을 화면 수직 방향으로 순서대로 배열하는 것이다. 이 예에서Column은 두 개의 Text 자widget을 포함하고 첫 번째Textwidget은 고정된 텍스트'You have pushed the button this many times:'를 표시하고 두 번째widget은 를 표시한다.counter 상태의 수치입니다.
  • floatingActionButton은 페이지의 오른쪽 하단에 있는 테이프입니다."➕”플로팅 단추, 온프레스 속성은 리셋 함수를 받아들여 클릭한 프로세서를 나타냅니다. 이 예에서 바로incrementCounter는 처리 함수로 사용됩니다.

  • 현재, 우리는 전체 절차를 연결합니다: 오른쪽 아래에 있는floatingActionButton 단추가 눌리면 호출됩니다incrementCounter,incrementCounter 중 우선 자동 증가카운터 (상태) 를 누르고 set State는 Flutter 프레임워크의 상태가 바뀌었다는 것을 알립니다. 이어서 Flutter는build 방법을 사용해서 새로운 상태로 UI를 재구성하여 장치 화면에 표시합니다.
    StatefulWidget이 아니라build 방법을 State에 두는 이유는 무엇입니까?
    이것은 주로 개발의 유연성을 위한 것이다.build () 메서드를 StatefulWidget에서 사용할 경우 다음 두 가지 문제가 발생합니다.
  • 상태 액세스 불편
  • 생각해 보십시오. 만약에 저희 Statefulwidget에 많은 상태가 있고 매번 상태가 바뀔 때마다build 방법을 사용해야 합니다. 상태가 State에 저장되어 있기 때문에build 방법을 StatefulWidget에 놓으면 구축할 때 상태를 읽는 것이 불편합니다. 만약에build 방법을 StatefulWidget에 놓으면 사용자 인터페이스를 구축하는 과정이State에 의존해야 하기 때문에build 방법은 State 파라미터를 추가해야 합니다.다음과 같습니다.
    Widget build(BuildContext context, State state){
          //state.counter
          ...
    }
    

    이렇게 하면 State의 모든 상태를 공개된 상태로 성명해야만 State 클래스에서 외부에 접근할 수 있지만 상태를 공개로 설정하면 상태가 더 이상 은밀성을 가지지 않고 의존할 수 있으며 상태의 수정은 통제할 수 없게 된다.build () 방법을 State에 놓으면 구축 과정이 상태에 직접 접근할 수 있어 편리합니다.
  • 상속 StatefulWidget 불편
  • 예를 들어 Flutter에는 애니메이션widget의 기본 클래스인 AnimatedWidget이 있는데 이것은 StatefulWidget 클래스를 계승한다.AnimatedWidget에 추상적인 방법build (BuildContext context) 이 도입되었습니다.AnimatedWidget에서 계승된 애니메이션widget은 이build 방법을 실현해야 합니다.현재 생각해 보면 StatefulWidget 클래스에build 방법이 있습니다. 위에서 말한 바와 같이build 방법은state 대상을 받아야 합니다. 이것은AnimatedWidget가 자신의 State 대상 ( animatedWidget State) 을 하위 클래스에 제공해야 한다는 것을 의미합니다. 하위 클래스는build 방법에서 부모 클래스의build 방법을 호출해야 하기 때문에 코드는 다음과 같습니다.
    class MyAnimationWidget extends AnimatedWidget{
        @override
        Widget build(BuildContext context, State state){
          //       AnimatedWidget     _animatedWidgetState,
          //  AnimatedWidget              _animatedWidgetState
          //         
          super.build(context, _animatedWidgetState)
        }
    }
    

    이렇게 하는 것은 분명히 불합리하다. 왜냐하면
  • AnimatedWidget의 상태 대상은AnimatedWidget 내부에서 디테일을 실현하고 외부에 노출되어서는 안 된다.
  • 만약에 부류 상태를 자류에 노출시키려면 반드시 전달 메커니즘이 있어야 한다. 이런 전달 메커니즘을 하는 것은 무의미하다. 왜냐하면 부자류 간의 상태의 전달은 자류 자체의 논리와 무관하기 때문이다.

  • 요약하면 StatefulWidget에 대해build 방법을 State에 두면 개발에 큰 유연성을 가져다 줄 수 있음을 알 수 있다.

    좋은 웹페이지 즐겨찾기