Flutter(dart)


Flutterとは?

  • は、Googleが2017年5月に発売したモバイル/Web/デスクトップクロスプラットフォームGUI SDKです.コードライブラリとして、Android、iPhone、Linux、Windows、Mac、Webブラウザのすべてのアプリケーションに発売されています.使う言語はやはりグーグルが発売したDartを使う.
  • Webブラウザでflatorアプリケーションを実行すると、Dart言語をHTML/CSS/JavaScriptに自動的に変換できます.Linux/windows/macデスクトップ上でflatorアプリケーションを実行することは2021年3月から正式にサポートされています.Android OSの次のオペレーティングシステムであるFuciaのユーザーインタフェースとFuciaアプリケーションがソフトウェアとして作成されます.
  • Flator Frameworkは、ソースコードをネイティブCPUコードに直接コンパイルし、UIをレンダリングエンジンSkiaに直接レンダリングするため、パフォーマンスが優れています.ソフトウェアデザイナーの選択により、iOSアプリケーションではGoogleの材料テーマデザインやRippleアニメーションを使用することができ、逆にAndroidではアップルのCupertinoテーマを適用することもできます.つまり、プラットフォームに関係なくカスタマイズできます.
  • は、プラットフォームにまたがる環境であり、ネイティブのパフォーマンス、優れたUI、およびさまざまな拡張機能を提供するフレームワークです.
  • のホット・リカバリ機能を使用して、デバッグを停止することなく、ソースを変更して保存するだけで、直ちにシミュレータまたはデバイスに反映され、UIと論理を更新できます.
  • ダーツとは?


  • GoogleはJSが開発したWebプログラミング言語に代わるため、Dartを使用してモバイルアプリケーション、Web、アプリケーション、コマンドスクリプト、サーバプログラミングなどを作成することができます.

  • Android/OSアプリケーションは、Webアプリケーションではなくネイティブコードで同時に開発できます.

  • すべてが対象とされている.
    :varが宣言できるすべて、function、number、nullはオブジェクトとみなされます.
    変数に入れることができるすべてのオブジェクトはオブジェクトであり、すべてのオブジェクトはクラスのインスタンスと見なされます.

  • リストやListのようにGenerickTypeをサポート

  • タイプ化言語ですが、自由度があり、ダイナミックに基本オブジェクトタイプを任意のように明確に指定できます.

  • public private protectedは定義されずfunction()として定義されています.

  • 文法上.
    print();出力可能
    データ型はnumber,double,String,bool,List,Map(key:value)に分けられる.
    またvarはタイプを書かず、最初に宣言した値がデータ型です.
    しかもfinalとconstは同じですが、ちょっと違います.
  • Fluterのインストール

  • 1.振動SDK降速
    2.android studioのインストール
    3.環境変数の登録
    4.など
    /usr/local/Caskroom/flutter/2.10.3/flutter
  • brewでインストールします.
    :パッケージをデスクトップにインストールすると、バージョンの更新が面倒になります.
  • brew install flutter/
    brew install android-sdk/
    brew install android-ndk/
    brew install android-studio
    brew tap dart-lang/dart
    brew install dart
  • android-studioはpackageとしてインストールされています.
  • android-studio flatとdartを使用してアプリケーションを作成します.
  • Fluter構造

  • ios:iOS構築に必要なファイルとコード.
  • Android:Android構築に必要なファイルとコードを生成します.
    lib:skeletonアプリケーションを含むコードで、以降のコード実装はほとんどこのフォルダで行われます.
    pubspec.yaml:アプリケーション名、バージョン、構築、依存性(dependencies)、リソース(画像、フォントファイルなど)を登録したファイルです.

  • StatelessWidgetクラス
    :ステータスのないコンポーネントを定義します.
    これは,無状態の部品を構成する基本クライスが1回描くと二度と描かれないことを意味する.
    これらのクラスは定数を有することができるが、propertyとして変数を持たない.
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Welcome to Flutter',
    theme:ThemeData(primarySwatch:Colors.blue,
         home: Scaffold( ··· );
          ),
        );
      }
    }

  • Statefulクラス
    :ステータスを持つコンポーネントを定義します.
    ライフサイクルで値が可変なコンポーネントとして、Stateインスタンスを生成するStatefulWidgetクラスを生成する必要があります.自身の値は変わりませんが、内部のstateクラスのライフサイクルでの値が変わります.
    class MyHomePage extends StatefulWidget {
    
      @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: ···,
          floatingActionButton: FloatingActionButton(
            onPressed: _incrementCounter,
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
        );
      }
    }
  • ここでsetState()の役割は、渡された匿名関数を実行し、生成()メソッドを再実行してスクリーンを再描画することです.setState()メソッドは、継承されたstateクラスによって提供されるメソッドです.

    Flutter LifeCycle


  • statefulWidgetの作成時にstateオブジェクトを作成します.部品のすべての可変状態はこの位置に保持されます.
    :stateは再構築のたびに破棄されず、フレームワークを再構築するたびにstateプロパティ、getter、settなどからインポートされます.

  • createState()
    :コンストラクションを示すと、すぐにメソッドが呼び出され、そのメソッドが存在する必要があります.
      class MyHomePage extends StatefulWidget {
        @override
        _MyHomePageState createState() => new _MyHomePageState();
      }

  • mounted == true
    :createStateがstateクラスを作成した場合、buildContextはstateに割り当てられます.
    すべての部品はbool形式のthisです.マウント属性があります.(setState()を使用する場合に便利)

  • initState()
    :部品の作成時に最初に呼び出されるメソッド.コールは1回しかありません.super.initState()を呼び出す必要があります.
    @override
    initState() {
      // 부모의 initState호출
      super.initState();
      // 이 클래스애 리스너 추가
      cartItemStream.listen((data) {
        _updateWidget(data);
      });
    }s

  • didChangeDependencies()
    :コンポーネントが最初に作成されると、initStateの直後に呼び出されます.
    依存するデータ・オブジェクトが呼び出されるたびに呼び出されます.(API呼び出しの場合)

  • build()
    :部品を返さなければなりませんが、fluiterのguiはすべてchild/childrenを持つ部品です.

  • didUpdateWidget()
    :親部品が変更され、部品を再構成する必要がある場合は、データとステータスの一部を再定義または初期化する必要があります.
    @override
    void didUpdateWidget(Widget oldWidget) {
      if (oldWidget.importantProperty != widget.importantProperty) {
        _init();
      }
    }

  • setState()
    :build contextのコンポーネントが再ネストされ、非同期コールバックが使用されます.

  • deactivate()
    :あまり使用されませんが、ツリーからstateを削除するときに呼び出されます.
    void updateProfile(String name) {
     setState(() => this.name = name);
    }

  • dispose()
    :stateオブジェクトは永続的に削除されます.

  • mounted == false
    :この状態では、ステータスオブジェクトは再マウントされず、setState()を呼び出すとエラーが発生します.
  • 省道文法


  • 道の中にコンテナを2つ入れることができます.
    body: Row(
     children:[
       Flexible(child: Container( width: )),
       Container()
     ]
    )
    children:[
      Flexible(child: Container(color: Colors.blue  ), flex: 3,),
      Flexible(child: Container(color: Colors.green  ), flex: 7,),
    ]
    //=>이런식으로 css를 줄수있고 박스 2개를 3:7로 나눈다.
    children:[
      Expanded(child: Container(color: Colors.blue  )),
      Container(width: 100, color: Colors.green  ),
    ]
    //=>Expanded는 flex:1을 가진박스랑 똑같다.

  • へんすう
     int
      Double
      Num
      Bool
      String
      List
      Set
      Map
      dynamic
    
      dynamic some =9;
      some = 'apple'
      ㄴ> 다이나믹으로 선언해주면 모든 형식타입을 허용한다.
      String name;
    Int age;
    List<int> number = [0,1,2]
    Map<String, int> score = {
        ‘en’: 100,
        ‘math’: 90,
    }
    String greet(){
        print(‘hello’);
        return ‘hello’;
    
    }

  • 演算子
     ~/
     print(55~2) // 27
    
     As
     ㄴ>강제 형변환 키워드로 
     부모 타입 객체를 자식 타입 객체로 다운캐스팅 할떄 사용한다.
     int n = 34;
     double m = n as double;
    
     Is/is!      Age is int.    / age is! Num
     ㄴ> 타입을 확인해 true / false를 반환
    
     Name?.length
     ㄴ> 널인경우 에러를막고 값을 할당시킨다.
    
     Name ?? 20
     ㄴ> name이 null이면 20을 반환 값이 있으면 그 값을 반환.
    
     스프레드 연산자
     Var a = [1,2,3];
     Var b = […a,4,5];

  • かんすう
     String see(String name){
     return ‘Hi $name’;
     }
      또는
     String see(String name) => ‘hi $name’;
    
     Named parameter
     {{}}파라미터를 중괄호로 감싸면 파라미터를 전달할수있다.
     Void introduce({required String name, required int age}){
    
     }
    
     Optional parameter
     []대괄호로 감싸면 선택형 인자를 설정할수있다.
     Void inroduces(String name, int age, [String? food]) {

     }
    
     Default parameter
     Void inroduce(String name, int age, [String food = ‘whole’]){
    
     }

  • Null Safety(flutter 2.0)
    기본값 초기화 없이 선언하는 변수는 null값에 대한 안정성을 보장하기 위해서
    타입을 nullable과 non-nullable로 구분해줘야한다.
    
    *Nullable
    일반 타입 뒤에 물음표를 붙여주면 해당 변수는 타입 또는 null이 될수있음을 나타낸다. 초기화없이 사용하면 null값으로 할당된다.
    
    void main() {
      String? name;
      int? age;
      bool? student;
    
      print(name)	//null
    }
    
    *non-nullable
    물음표없이 일반 타입으로 사용하면 자동적으로 nul이 될수없는 값으로 인식된다.
    사용전에 반드시 초기값을 할당해줘야한다.
  •     Required, late
    
        Required
        함수에서 네임드 파라미터나 옵셔널 파라미터를 설정할때 non-nullable로
        지정하기위해 타입 앞에 붙여준다.
        Void greet({required String name}){
            print(‘hello’);
        }
    
        Late
        클래스에 non-nullable 프로퍼티가 필요하지만 디폴트값이나 초기화를 시키지 않을 경우 나중에 값을 할당한다는 의미로 붙여준다.
        Class Cat{
            late String name;
            late int age;
        }

  • 重要な方法
    Var list = [1,2,3,4];
    Var newList = list;
    print(newList);
    
    Var spreadList = [10, …list, 100];
    
    print(spreadList);
  •     -map
        map은 iterable(배열그룹)을 대상으로 foreach돌린다.
    
        Var list = [1,2,3];
        Var newList = list.map((e) => e+1);
        list[0] = 0;
    
    
        -asMap
        배열 값에 index키 값을 삽입해줘서 반환해준다.
        키값은 인덱스로 부여된다. 0부터 시작한다.
        Var map = words.asMap();
    
        -toList
        생성되는 값들을 리스트로 만들어 반환한다.
        List zero = orderList.toList();
        Map.keys.toList() => [0,1,2,3];
    
        -where
        배열요소를 필터링한다.
    
        Var list = [1,2,3,4];
        Var filter = list.where((e) => e!=3);
        //3이 아닌값만 필터링한다.
        Print(filter); => [1,2,4];
    
        -for / foreach
        for(var e in list){
        print(e);
        }
    
        List.forEach((e) => print(e));
    
        -add / addAll / length / clear
    
        Var vege = List();
        생성자 사용
        Var fruits = [‘apple’, ‘orange’];
        문자열 사용하여 list생성
    
        Fruits.add(‘kiwi’);
        Fruits.addAll([‘grape’, ‘banana’]);
        다수항목 추가하기
    
        Var appleIndex = fruits.indexOf(‘apple’);
        Fruits.removeAt(appleIndex);
        리스트 단일 항목 삭제
        Fruits.clear();
모든 항목 삭제
    
    
        -sort
        Fruits.sort((alb) => a.compareTo(b));
        [‘b’, ‘banana’,a] => [a, b, banana’]이런식으로 순서대로 정렬된다.
    
    
        -reduce
        Int sum = number.reduce((total, element) => total + element);
  • 部品
  • ワードコンポーネント(低テキスト部分を置換)
    テキスト(「こんにちは」)
  • イメージコンポーネント
    Image.asset(‘assets/electron.png’)
    pub spec.yamlファイルにアクセス
    途中でflufを探します:
    Flutter:
    Assets:
    -assets/
    登録します.
  • アイコンコンポーネント
    Icon(Icons.star)またはIcon(Icons.shop)
  • 箱部品
    Container( width: 50 , height: 50, color : Colors.blue)
    home: Center(
    child: Container( width: 50 , height: 50, color : Colors.blue),
  • MaterialAppコンポーネント
    (Cupertinoパーツもあります.
    またはカスタマイズした部品)
  • Scaffold()コンポーネント
    上下部品
    -頭部ボディプロペラとして使えばいい.
    return MaterialApp(
    home: Scaffold(
      appBar: AppBar(title: Text(‘앱이다.’)),
      body: Container(),
      bottomNavigationBar: BottomAppBar(
      child: Text('asdfdee')),
    )
  • 主軸(左右)/十字軸(上下)
    displayのような要素を並べたときに書きます.
      body: Row(
      mainAxisAlignment: MainAxisAlignment.center,
    crossAxisAlignment: CrossAxisAlignment.center,
      children: [ ], 
  • Body(CSS)
  • body:  SizedBox(
     child: Icon(Icons.star,)
       //아이콘은 컬러와 사이즈가 끝이다.
      child: Text('안녕하세요',
        style: TextStyle(color: Color(0xffd52727), 
           fontSize: 30, fontWeight: FontWeight.w700
    
        ),
      ),
    ),

  • Button(CSS)
    : TextButton(child: Text(), onPressed: (){},)
    안에는 2가지 옵션은 꼭 들어가야된다.  
    / IconButton() /  ElevatedButton()
    이렇게 3가지를 쓸수있다.
    
    1)TextButton
    child: TextButton(
      child: Text('글자'), 
      onPressed: (){},)
  •     2)ElevatedButton
        child: ElevatedButton(
          child: Text('글자'),
          onPressed: (){},
          style: ButtonStyle(),
        )
    
        3)IconButton
        child: IconButton(
          icon: Icon(Icons.star),
          onPressed: (){},)

  • appBar(Header)(CSS)
    :オプション
    見出し:左見出し
    Leading:左側に配置するアイコン(ドロップダウンバーなど)
    Actions:[右アイコン]
    AppBar(
        leading: Icon(Icons.star),
        Title: text(‘앱이다.’),
        actions: [Icon(Icons.star), Icon(Icons.star)]
    
    ),
    
    	
  • カスタムコンポーネント構文


  • カスタムコンポーネントはclassによって作成されます.
    :下の直接使用する部分を組み合わせる
    関数のように使います.
    繰り返し使用するのは、多くのUIまたは大きなページを主とします.
  •  @override
     함수를 쓰면서 중복되었을때 
     내꺼 먼저 써달라는 기호이다.
    
     1)
     return MaterialApp(
             home: Scaffold(
               appBar: AppBar(),
               body: ShopItem()
             )
         );
       }
     }
    
     class ShopItem extends StatelessWidget {
       const ShopItem({Key? key}) : super(key: key);
       @override
       Widget build(BuildContext context) {
         return  SizedBox(
           child: Text('안녕'),
         );
       }
     }
  •  2)변수로 선언해줘도 a 라고 써주면 사용 가능하다.
     But 실시간으로 바뀌는 데이터들은 저렇게 변수 선언해서
     사용하면 버그가 많이 생긴다.
    
     var a = SizedBox(
       child: Text('안녕'),
     );
    
     class MyApp extends StatelessWidget {
       const MyApp({Key? key}) : super(key: key);
    
       @override
       Widget build(BuildContext context) {
         return MaterialApp(
             home: Scaffold(
               appBar: AppBar(),
               body: a
             )
         );
       }
     }